Skip to content
Snippets Groups Projects
Commit f624a806 authored by John Hodge's avatar John Hodge
Browse files

Changed to a classfull sequential allocation algo

- Means that addresses end up being allocated sequentially (instead
  of in reverse), cleans up the memory dumps.
parent 09e044c2
Branches
Tags
No related merge requests found
...@@ -131,16 +131,64 @@ void MM_Install(tMBoot_Info *MBoot) ...@@ -131,16 +131,64 @@ void MM_Install(tMBoot_Info *MBoot)
tPAddr MM_AllocPhys(void) tPAddr MM_AllocPhys(void)
{ {
// int a, b, c; // int a, b, c;
int indx; int indx = -1;
tPAddr ret; tPAddr ret;
ENTER(""); ENTER("");
Mutex_Acquire( &glPhysAlloc ); Mutex_Acquire( &glPhysAlloc );
// Classful scan
#if 1
{
const int addrClasses[] = {0,16,20,24,32,64};
const int numAddrClasses = sizeof(addrClasses)/sizeof(addrClasses[0]);
int i;
int first, last;
for( i = numAddrClasses; i -- > 1; )
{
// Log("Scanning %i (%i bits)", i, addrClasses[i]);
first = 1 << (addrClasses[i-1] - 12);
last = (1 << (addrClasses[i] - 12)) - 1;
// Range is above the last free page
if( first > giLastPossibleFree )
continue;
// Last possible free page is in the range
if( last > giLastPossibleFree )
last = giLastPossibleFree;
// Log(" first=%i,max=%i", first, last);
// Scan the range
for( indx = first; indx < last; )
{
// Log("indx = %i (< %i?)", indx, last);
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 < last ) break;
giLastPossibleFree = first; // Well, we couldn't find any in this range
}
// Out of memory?
if( i <= 1 ) indx = -1;
// Log("indx = %i", indx);
}
#elif 0
// Find free page // Find free page
// Scan downwards // Scan downwards
#if 1
LOG("giLastPossibleFree = %i", giLastPossibleFree); LOG("giLastPossibleFree = %i", giLastPossibleFree);
for( indx = giLastPossibleFree; indx >= 0; ) for( indx = giLastPossibleFree; indx >= 0; )
{ {
...@@ -160,6 +208,8 @@ tPAddr MM_AllocPhys(void) ...@@ -160,6 +208,8 @@ tPAddr MM_AllocPhys(void)
} }
break; break;
} }
if( indx >= 0 )
giLastPossibleFree = indx;
LOG("indx = %i", indx); LOG("indx = %i", indx);
#else #else
c = giLastPossibleFree % 32; c = giLastPossibleFree % 32;
...@@ -179,6 +229,8 @@ tPAddr MM_AllocPhys(void) ...@@ -179,6 +229,8 @@ tPAddr MM_AllocPhys(void)
for( ; gaPageBitmap[a*32+b] & (1<<c); c-- ); for( ; gaPageBitmap[a*32+b] & (1<<c); c-- );
LOG("a=%i,b=%i,c=%i", a, b, c); LOG("a=%i,b=%i,c=%i", a, b, c);
indx = (a << 10) | (b << 5) | c; indx = (a << 10) | (b << 5) | c;
if( indx >= 0 )
giLastPossibleFree = indx;
#endif #endif
if( indx < 0 ) { if( indx < 0 ) {
...@@ -203,11 +255,11 @@ tPAddr MM_AllocPhys(void) ...@@ -203,11 +255,11 @@ tPAddr MM_AllocPhys(void)
// Get address // Get address
ret = indx << 12; ret = indx << 12;
giLastPossibleFree = indx;
// Mark used block // Mark used block
if(gaPageBitmap[ indx>>5 ] == -1) if(gaPageBitmap[ indx>>5 ] == -1) {
gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31); gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31);
}
// Release Spinlock // Release Spinlock
Mutex_Release( &glPhysAlloc ); Mutex_Release( &glPhysAlloc );
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment