Debug
[tpg/acess2.git] / Kernel / arch / x86 / mm_phys.c
index 80e92fe..acca5f5 100644 (file)
@@ -2,6 +2,7 @@
  AcessOS Microkernel Version
  mm_phys.c
 */
+#define DEBUG  1
 #include <common.h>
 #include <mboot.h>
 #include <mm_virt.h>
@@ -32,7 +33,7 @@ void MM_Install(tMBoot_Info *MBoot)
        
        // Initialise globals
        giPageCount = (MBoot->HighMem >> 2) + 256;      // HighMem is a kByte value
-       Log("giPageCount = %i", giPageCount);
+       LOG("giPageCount = %i", giPageCount);
        
        // Get used page count
        kernelPages = (Uint)&gKernelEnd - KERNEL_BASE;
@@ -65,7 +66,7 @@ void MM_Install(tMBoot_Info *MBoot)
        }
        
        // Allocate References
-       Log("Reference Pages %i", (giPageCount*4+0xFFF)>>12);
+       LOG("Reference Pages %i", (giPageCount*4+0xFFF)>>12);
        for(num = 0; num < (giPageCount*4+0xFFF)>>12; num++)
        {
                MM_Allocate( REFERENCE_BASE + (num<<12) );
@@ -76,16 +77,12 @@ void MM_Install(tMBoot_Info *MBoot)
        memsetd(gaPageReferences, 1, kernelPages);
        for( num = kernelPages; num < giPageCount; num++ )
        {
-               //if(gaPageBitmap[ num2 / 32 ] == 0) {
-               //      memsetd(&gaPageReferences[num2], 0, 31-(num2&31));
-               //      num2 = (num2 + 32) & ~31;
-               //} else
-                       gaPageReferences[num] = (gaPageBitmap[ num / 32 ] >> (num&31)) & 1;
+               gaPageReferences[num] = (gaPageBitmap[ num / 32 ] >> (num&31)) & 1;
        }
 }
 
 /**
- * \fn Uint32 MM_AllocPhys()
+ * \fn tPAddr MM_AllocPhys()
  * \brief Allocates a physical page
  */
 tPAddr MM_AllocPhys()
@@ -100,6 +97,7 @@ tPAddr MM_AllocPhys()
        for(a=0;gaSuperBitmap[a]==-1&&a<num;a++);
        if(a == num) {
                RELEASE( &giPhysAlloc );
+               Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
                return 0;
        }
        for(b=0;gaSuperBitmap[a]&(1<<b);b++);
@@ -119,6 +117,7 @@ tPAddr MM_AllocPhys()
 
        // Release Spinlock
        RELEASE( &giPhysAlloc );
+       LOG("Allocated 0x%x\n", ret);
        //LOG("ret = %x", ret);
        return ret;
 }
@@ -154,7 +153,7 @@ void MM_RefPhys(tPAddr Addr)
 /**
  * \fn void MM_DerefPhys(Uint32 Addr)
  */
-void MM_DerefPhys(Uint32 Addr)
+void MM_DerefPhys(tPAddr Addr)
 {
        // Get page number
        Addr >>= 12;
@@ -177,6 +176,7 @@ void MM_DerefPhys(Uint32 Addr)
        // Mark as free in bitmaps
        if( gaPageReferences[ Addr ] == 0 )
        {
+               LOG("Freed 0x%x by %p\n", Addr<<12, __builtin_return_address(0));
                gaPageBitmap[ Addr / 32 ] &= ~(1 << (Addr&31));
                if(gaPageReferences[ Addr ] == 0)
                        gaSuperBitmap[ Addr >> 10 ] &= ~(1 << ((Addr >> 5)&31));
@@ -185,3 +185,18 @@ void MM_DerefPhys(Uint32 Addr)
        // Release spinlock
        RELEASE( &giPhysAlloc );
 }
+
+/**
+ * \fn int MM_GetRefCount(tPAddr Addr)
+ */
+int MM_GetRefCount(tPAddr Addr)
+{
+       // Get page number
+       Addr >>= 12;
+       
+       // We don't care about non-ram pages
+       if(Addr >= giPageCount) return -1;
+       
+       // Check if it is freed
+       return gaPageReferences[ Addr ];
+}

UCC git Repository :: git.ucc.asn.au