Changed spinlock mechananisim
[tpg/acess2.git] / Kernel / arch / x86 / mm_phys.c
index 595a5e9..cb4f9e0 100644 (file)
 extern void    gKernelEnd;
 
 // === PROTOTYPES ===
-tPAddr MM_AllocPhys();
+tPAddr MM_AllocPhys(void);
 tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
-void   MM_RefPhys(tPAddr Addr);
-void   MM_DerefPhys(tPAddr Addr);
+void   MM_RefPhys(tPAddr PAddr);
+void   MM_DerefPhys(tPAddr PAddr);
 
 // === GLOBALS ===
+tMutex glPhysAlloc;
 Uint64 giPhysAlloc = 0;        // Number of allocated pages
 Uint64 giPageCount = 0;        // Total number of pages
 Uint64 giLastPossibleFree = 0; // Last possible free page (before all pages are used)
@@ -71,7 +72,7 @@ void MM_Install(tMBoot_Info *MBoot)
                ent = (tMBoot_MMapEnt *)( (Uint)ent + ent->Size );
        }
        
-       // Get used page count
+       // Get used page count (Kernel)
        kernelPages = (Uint)&gKernelEnd - KERNEL_BASE - 0x100000;
        kernelPages += 0xFFF;   // Page Align
        kernelPages >>= 12;
@@ -119,10 +120,10 @@ void MM_Install(tMBoot_Info *MBoot)
 }
 
 /**
- * \fn tPAddr MM_AllocPhys()
+ * \fn tPAddr MM_AllocPhys(void)
  * \brief Allocates a physical page from the general pool
  */
-tPAddr MM_AllocPhys()
+tPAddr MM_AllocPhys(void)
 {
        // int  a, b, c;
         int    indx;
@@ -130,7 +131,7 @@ tPAddr MM_AllocPhys()
        
        ENTER("");
        
-       LOCK( &giPhysAlloc );
+       Mutex_Acquire( &glPhysAlloc );
        
        // Find free page
        // Scan downwards
@@ -162,7 +163,7 @@ tPAddr MM_AllocPhys()
        LOG("a=%i,b=%i,c=%i", a, b, c);
        for( ; gaSuperBitmap[a] == -1 && a >= 0; a-- );
        if(a < 0) {
-               RELEASE( &giPhysAlloc );
+               Mutex_Release( &glPhysAlloc );
                Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
                LEAVE('i', 0);
                return 0;
@@ -188,7 +189,7 @@ tPAddr MM_AllocPhys()
                gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31);
 
        // Release Spinlock
-       RELEASE( &giPhysAlloc );
+       Mutex_Release( &glPhysAlloc );
        
        LEAVE('X', ret);
        //Log("MM_AllocPhys: RETURN 0x%x", ret);
@@ -207,12 +208,17 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
         int    i, idx, sidx;
        tPAddr  ret;
        
+       ENTER("iPages iMaxBits", Pages, MaxBits);
+       
        // Sanity Checks
-       if(MaxBits < 0) return 0;
+       if(MaxBits < 0) {
+               LEAVE('i', 0);
+               return 0;
+       }
        if(MaxBits > PHYS_BITS) MaxBits = PHYS_BITS;
        
        // Lock
-       LOCK( &giPhysAlloc );
+       Mutex_Acquire( &glPhysAlloc );
        
        // Set up search state
        if( giLastPossibleFree > ((tPAddr)1 << (MaxBits-12)) ) {
@@ -226,16 +232,28 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
        b = idx % 32;
        a = idx / 32;
        
+       #if 0
+       LOG("a=%i, b=%i, idx=%i, sidx=%i", a, b, idx, sidx);
+       
        // Find free page
-       for( ; gaSuperBitmap[a] == -1 && a --; );
+       for( ; gaSuperBitmap[a] == -1 && a --; )        b = 31;
        if(a < 0) {
-               RELEASE( &giPhysAlloc );
+               Mutex_Release( &glPhysAlloc );
                Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
+               LEAVE('i', 0);
                return 0;
        }
-       for( ; gaSuperBitmap[a] & (1 << b); b-- );
+       LOG("a = %i", a);
+       for( ; gaSuperBitmap[a] & (1 << b); b-- )       sidx = 31;
+       LOG("b = %i", b);
        idx = a * 32 + b;
-       for( ; gaPageBitmap[idx] & (1 << sidx); sidx-- );
+       for( ; gaPageBitmap[idx] & (1 << sidx); sidx-- )
+               LOG("gaPageBitmap[%i] = 0x%08x", idx, gaPageBitmap[idx]);
+       
+       LOG("idx = %i, sidx = %i", idx, sidx);
+       #else
+       
+       #endif
        
        // Check if the gap is large enough
        while( idx >= 0 )
@@ -278,8 +296,10 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
        
        // Check if an address was found
        if( idx < 0 ) {
-               RELEASE( &giPhysAlloc );
+               Mutex_Release( &glPhysAlloc );
                Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
+               LEAVE('i', 0);
+               return 0;
        }
        
        // Mark pages used
@@ -289,7 +309,7 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
                        gaPageReferences[idx*32+sidx] = 1;
                gaPageBitmap[ idx ] |= 1 << sidx;
                sidx ++;
-               if(sidx == 32) {        sidx = 0;       idx ++; }
+               if(sidx == 32) { sidx = 0;      idx ++; }
        }
        
        // Get address
@@ -299,76 +319,79 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
        if(gaPageBitmap[ idx ] == -1)   gaSuperBitmap[idx/32] |= 1 << (idx%32);
 
        // Release Spinlock
-       RELEASE( &giPhysAlloc );
+       Mutex_Release( &glPhysAlloc );
        
+       LEAVE('X', ret);
        return ret;
 }
 
 /**
- * \fn void MM_RefPhys(tPAddr Addr)
+ * \fn void MM_RefPhys(tPAddr PAddr)
  */
-void MM_RefPhys(tPAddr Addr)
+void MM_RefPhys(tPAddr PAddr)
 {
        // Get page number
-       Addr >>= 12;
+       PAddr >>= 12;
        
        // We don't care about non-ram pages
-       if(Addr >= giPageCount) return;
+       if(PAddr >= giPageCount)        return;
        
        // Lock Structures
-       LOCK( &giPhysAlloc );
+       Mutex_Acquire( &glPhysAlloc );
        
        // Reference the page
        if(gaPageReferences)
-               gaPageReferences[ Addr ] ++;
+               gaPageReferences[ PAddr ] ++;
        
        // Mark as used
-       gaPageBitmap[ Addr / 32 ] |= 1 << (Addr&31);
+       gaPageBitmap[ PAddr / 32 ] |= 1 << (PAddr&31);
        
        // Mark used block
-       if(gaPageBitmap[ Addr / 32 ] == -1)     gaSuperBitmap[Addr/1024] |= 1 << ((Addr/32)&31);
+       if(gaPageBitmap[ PAddr / 32 ] == -1)
+               gaSuperBitmap[PAddr/1024] |= 1 << ((PAddr/32)&31);
        
        // Release Spinlock
-       RELEASE( &giPhysAlloc );
+       Mutex_Release( &glPhysAlloc );
 }
 
 /**
- * \fn void MM_DerefPhys(Uint32 Addr)
+ * \fn void MM_DerefPhys(tPAddr PAddr)
+ * \brief Dereferences a physical page
  */
-void MM_DerefPhys(tPAddr Addr)
+void MM_DerefPhys(tPAddr PAddr)
 {
        // Get page number
-       Addr >>= 12;
+       PAddr >>= 12;
        
        // We don't care about non-ram pages
-       if(Addr >= giPageCount) return;
+       if(PAddr >= giPageCount)        return;
        
        // Check if it is freed
-       if(gaPageReferences[ Addr ] == 0) {
+       if(gaPageReferences[ PAddr ] == 0) {
                Warning("MM_DerefPhys - Non-referenced memory dereferenced");
                return;
        }
        
        // Lock Structures
-       LOCK( &giPhysAlloc );
+       Mutex_Acquire( &glPhysAlloc );
        
-       if( giLastPossibleFree < Addr )
-               giLastPossibleFree = Addr;
+       if( giLastPossibleFree < PAddr )
+               giLastPossibleFree = PAddr;
 
        // Dereference
-       gaPageReferences[ Addr ] --;
+       gaPageReferences[ PAddr ] --;
        
        // Mark as free in bitmaps
-       if( gaPageReferences[ Addr ] == 0 )
+       if( gaPageReferences[ PAddr ] == 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));
+               //LOG("Freed 0x%x by %p\n", PAddr<<12, __builtin_return_address(0));
+               gaPageBitmap[ PAddr / 32 ] &= ~(1 << (PAddr&31));
+               if(gaPageReferences[ PAddr ] == 0)
+                       gaSuperBitmap[ PAddr >> 10 ] &= ~(1 << ((PAddr >> 5)&31));
        }
        
        // Release spinlock
-       RELEASE( &giPhysAlloc );
+       Mutex_Release( &glPhysAlloc );
 }
 
 /**

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