X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_phys.c;h=3c7dcddc4f2bea4907c9dc3e98e8c624acb6a710;hb=3998cfbbadb005bf3ad52ea2538dc21f82864ddc;hp=bd8d60e49388236ebca7473cd9bbab5b80eac5cb;hpb=d52a53f035af92941c0cafe5f81888fed16d2462;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_phys.c b/Kernel/arch/x86/mm_phys.c index bd8d60e4..3c7dcddc 100644 --- a/Kernel/arch/x86/mm_phys.c +++ b/Kernel/arch/x86/mm_phys.c @@ -15,10 +15,10 @@ 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 === Uint64 giPhysAlloc = 0; // Number of allocated pages @@ -71,7 +71,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 +119,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; @@ -207,8 +207,13 @@ 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 @@ -226,16 +231,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 ); 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 ) @@ -280,6 +297,8 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits) if( idx < 0 ) { RELEASE( &giPhysAlloc ); Warning("MM_AllocPhysRange - OUT OF MEMORY (Called by %p)", __builtin_return_address(0)); + LEAVE('i', 0); + return 0; } // Mark pages used @@ -289,7 +308,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 @@ -301,50 +320,53 @@ tPAddr MM_AllocPhysRange(int Pages, int MaxBits) // Release Spinlock RELEASE( &giPhysAlloc ); + 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 ); // 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 ); } /** - * \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; } @@ -352,16 +374,19 @@ void MM_DerefPhys(tPAddr Addr) // Lock Structures LOCK( &giPhysAlloc ); + 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