Modules/PCnetFAST3 - Quieten
[tpg/acess2.git] / KernelLand / Kernel / arch / x86 / mm_phys.c
index b0f1c61..eb422c9 100644 (file)
@@ -7,6 +7,7 @@
 #include <mm_virt.h>
 #include <pmemmap.h>
 #include <hal_proc.h>
+#include <semaphore.h>
 
 //#define USE_STACK    1
 #define TRACE_ALLOCS   0       // Print trace messages on AllocPhys/DerefPhys
@@ -41,11 +42,10 @@ void        **gaPageNodes = (void*)MM_PAGENODE_BASE;
 // === CODE ===
 void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges)
 {
-       Uint    i;
        Uint64  maxAddr = 0;
        
        // --- Find largest address
-       for( i = 0; i < NPMemRanges; i ++ )
+       for( Uint i = 0; i < NPMemRanges; i ++ )
        {
                tPMemMapEnt     *ent = &PMemRanges[i];
                // If entry is RAM and is above `maxAddr`, change `maxAddr`
@@ -56,20 +56,33 @@ void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges)
                        giTotalMemorySize += ent->Length >> 12;
                }
        }
+       LOG("giTotalMemorySize = %lli KiB", giTotalMemorySize*4);
+       LOG("maxAddr = 0x%X", maxAddr);
+       
+       // Clip to 32-bits
+       if( maxAddr > (1ULL << 32) ) {
+               maxAddr = (1ULL << 32);
+       }
        
        giPageCount = maxAddr >> 12;
        giLastPossibleFree = giPageCount - 1;
-       
        memsetd(gaPageBitmap, 0xFFFFFFFF, giPageCount/32);
        
        // Set up allocateable space
-       for( i = 0; i < NPMemRanges; i ++ )
+       for( Uint i = 0; i < NPMemRanges; i ++ )
        {
                tPMemMapEnt *ent = &PMemRanges[i];
                if( ent->Type == PMEMTYPE_FREE )
                {
                        Uint64  startpg = ent->Start / PAGE_SIZE;
                        Uint64  pgcount = ent->Length / PAGE_SIZE;
+                       // Ignore start addresses >32 bits
+                       if( startpg > (1 << 20) )
+                               continue ;
+                       // Clip lengths to 32-bit address space
+                       if( startpg + pgcount > (1<<20) )
+                               pgcount = (1<<20) - startpg;
+                       
                        while( startpg % 32 && pgcount ) {
                                gaPageBitmap[startpg/32] &= ~(1U << (startpg%32));
                                startpg ++;
@@ -86,13 +99,14 @@ void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges)
                }
                else if( ent->Type == PMEMTYPE_USED )
                {
+                       // TODO: Clip?
                        giPhysAlloc += ent->Length / PAGE_SIZE;
                }
        }
 
        // Fill Superpage bitmap
        // - A set bit means that there are no free pages in this block of 32
-       for( i = 0; i < (giPageCount+31)/32; i ++ )
+       for( Uint i = 0; i < (giPageCount+31)/32; i ++ )
        {
                if( gaPageBitmap[i] + 1 == 0 ) {
                        gaSuperBitmap[i/32] |= (1 << i%32);
@@ -101,6 +115,7 @@ void MM_Install(int NPMemRanges, tPMemMapEnt *PMemRanges)
        
        gaPageReferences = (void*)MM_REFCOUNT_BASE;
 
+       Log_Debug("PMem", "maxAddr = %P", maxAddr);
        Log_Log("PMem", "Physical memory set up (%lli pages of ~%lli MiB used)",
                giPhysAlloc, (giTotalMemorySize*PAGE_SIZE)/(1024*1024)
                );
@@ -152,7 +167,6 @@ void MM_DumpStatistics(void)
  */
 tPAddr MM_AllocPhys(void)
 {
-       // int  a, b, c;
         int    indx = -1;
        tPAddr  ret;
        
@@ -161,7 +175,6 @@ tPAddr MM_AllocPhys(void)
        Mutex_Acquire( &glPhysAlloc );
        
        // Classful scan
-       #if 1
        {
         int    i;
         int    first, last;
@@ -202,52 +215,6 @@ tPAddr MM_AllocPhys(void)
        // Out of memory?
        if( i <= 1 )    indx = -1;
        }
-       #elif 0
-       // Find free page
-       // Scan downwards
-       LOG("giLastPossibleFree = %i", giLastPossibleFree);
-       for( indx = giLastPossibleFree; indx >= 0; )
-       {
-               if( gaSuperBitmap[indx>>10] == -1 ) {
-                       indx -= 1024;
-                       continue;
-               }
-               
-               if( gaPageBitmap[indx>>5] == -1 ) {
-                       indx -= 32;
-                       continue;
-               }
-               
-               if( gaPageBitmap[indx>>5] & (1 << (indx&31)) ) {
-                       indx --;
-                       continue;
-               }
-               break;
-       }
-       if( indx >= 0 )
-               giLastPossibleFree = indx;
-       LOG("indx = %i", indx);
-       #else
-       c = giLastPossibleFree % 32;
-       b = (giLastPossibleFree / 32) % 32;
-       a = giLastPossibleFree / 1024;
-       
-       LOG("a=%i,b=%i,c=%i", a, b, c);
-       for( ; gaSuperBitmap[a] == -1 && a >= 0; a-- );
-       if(a < 0) {
-               Mutex_Release( &glPhysAlloc );
-               Warning("MM_AllocPhys - OUT OF MEMORY (Called by %p) - %lli/%lli used",
-                       __builtin_return_address(0), giPhysAlloc, giPageCount);
-               LEAVE('i', 0);
-               return 0;
-       }
-       for( ; gaSuperBitmap[a] & (1<<b); b-- );
-       for( ; gaPageBitmap[a*32+b] & (1<<c); c-- );
-       LOG("a=%i,b=%i,c=%i", a, b, c);
-       indx = (a << 10) | (b << 5) | c;
-       if( indx >= 0 )
-               giLastPossibleFree = indx;
-       #endif
        
        if( indx < 0 ) {
                Mutex_Release( &glPhysAlloc );
@@ -286,8 +253,8 @@ tPAddr MM_AllocPhys(void)
 
        // Release Spinlock
        Mutex_Release( &glPhysAlloc );
-       
-       LEAVE('X', ret);
+       LEAVE('P', ret);
+
        #if TRACE_ALLOCS
        if( now() > 4000 ) {
        Log_Debug("PMem", "MM_AllocPhys: RETURN %P (%i free)", ret, giPageCount-giPhysAlloc);
@@ -330,29 +297,6 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits)
        idx = sidx / 32;
        sidx %= 32;
        
-       #if 0
-       LOG("a=%i, b=%i, idx=%i, sidx=%i", a, b, idx, sidx);
-       
-       // Find free page
-       for( ; gaSuperBitmap[a] == -1 && a --; )        b = 31;
-       if(a < 0) {
-               Mutex_Release( &glPhysAlloc );
-               Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0));
-               LEAVE('i', 0);
-               return 0;
-       }
-       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-- )
-               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 )
        {

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