extern void gKernelEnd;
// === PROTOTYPES ===
-tPAddr MM_AllocPhys();
+tPAddr MM_AllocPhys(void);
tPAddr MM_AllocPhysRange(int Pages, int MaxBits);
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)
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;
}
/**
- * \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;
ENTER("");
- LOCK( &giPhysAlloc );
+ Mutex_Acquire( &glPhysAlloc );
// Find free page
// Scan downwards
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;
gaSuperBitmap[indx>>10] |= 1 << ((indx>>5)&31);
// Release Spinlock
- RELEASE( &giPhysAlloc );
+ Mutex_Release( &glPhysAlloc );
LEAVE('X', ret);
//Log("MM_AllocPhys: RETURN 0x%x", ret);
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)) ) {
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 )
// 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
gaPageReferences[idx*32+sidx] = 1;
gaPageBitmap[ idx ] |= 1 << sidx;
sidx ++;
- if(sidx == 32) { sidx = 0; idx ++; }
+ if(sidx == 32) { sidx = 0; idx ++; }
}
// Get address
if(gaPageBitmap[ idx ] == -1) gaSuperBitmap[idx/32] |= 1 << (idx%32);
// Release Spinlock
- RELEASE( &giPhysAlloc );
+ Mutex_Release( &glPhysAlloc );
+ LEAVE('X', ret);
return ret;
}
if(PAddr >= giPageCount) return;
// Lock Structures
- LOCK( &giPhysAlloc );
+ Mutex_Acquire( &glPhysAlloc );
// Reference the page
if(gaPageReferences)
gaSuperBitmap[PAddr/1024] |= 1 << ((PAddr/32)&31);
// Release Spinlock
- RELEASE( &giPhysAlloc );
+ Mutex_Release( &glPhysAlloc );
}
/**
}
// Lock Structures
- LOCK( &giPhysAlloc );
+ Mutex_Acquire( &glPhysAlloc );
if( giLastPossibleFree < PAddr )
giLastPossibleFree = PAddr;
}
// Release spinlock
- RELEASE( &giPhysAlloc );
+ Mutex_Release( &glPhysAlloc );
}
/**