X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_phys.c;h=c7de9beb8f5bc41fd6ff063fe71515ee17a3eaa6;hb=709179721ccc250f5d09f5bfc13f65df6cac6fed;hp=e81c99e657f2b4909b83f87539721cba2d574b3e;hpb=f7f1b08ec035ddef61218b51d8e9a9d4c1ee7b9a;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_phys.c b/Kernel/arch/x86/mm_phys.c index e81c99e6..c7de9beb 100644 --- a/Kernel/arch/x86/mm_phys.c +++ b/Kernel/arch/x86/mm_phys.c @@ -1,7 +1,8 @@ /* - AcessOS Microkernel Version - mm_phys.c -*/ + * Acess2 + * - Physical memory manager + */ +#define DEBUG 1 #include #include #include @@ -12,9 +13,10 @@ extern void gKernelEnd; // === PROTOTYPES === -Uint32 MM_AllocPhys(); -void MM_RefPhys(Uint32 Addr); -void MM_DerefPhys(Uint32 Addr); +tPAddr MM_AllocPhys(); +tPAddr MM_AllocPhysRange(int Pages); +void MM_RefPhys(tPAddr Addr); +void MM_DerefPhys(tPAddr Addr); // === GLOBALS === int giPhysAlloc = 0; @@ -32,7 +34,7 @@ void MM_Install(tMBoot_Info *MBoot) // Initialise globals giPageCount = (MBoot->HighMem >> 2) + 256; // HighMem is a kByte value - Log("giPageCount = %i", giPageCount); + //LOG("giPageCount = %i", giPageCount); // Get used page count kernelPages = (Uint)&gKernelEnd - KERNEL_BASE; @@ -65,22 +67,19 @@ void MM_Install(tMBoot_Info *MBoot) } // Allocate References - Log("Reference Pages %i", (giPageCount*4+0xFFF)>>12); + //LOG("Reference Pages %i", (giPageCount*4+0xFFF)>>12); for(num = 0; num < (giPageCount*4+0xFFF)>>12; num++) { MM_Allocate( REFERENCE_BASE + (num<<12) ); } + //LOG("Filling"); // Fill references gaPageReferences = (void*)REFERENCE_BASE; memsetd(gaPageReferences, 1, kernelPages); for( num = kernelPages; num < giPageCount; num++ ) { - //if(gaPageBitmap[ num2 / 32 ] == 0) { - // memsetd(&gaPageReferences[num2], 0, 31-(num2&31)); - // num2 = (num2 + 32) & ~31; - //} else - gaPageReferences[num] = (gaPageBitmap[ num / 32 ] >> (num&31)) & 1; + gaPageReferences[num] = (gaPageBitmap[ num / 32 ] >> (num&31)) & 1; } } @@ -92,7 +91,47 @@ tPAddr MM_AllocPhys() { int num = giPageCount / 32 / 32; int a, b, c; - Uint32 ret; + tPAddr ret; + + LOCK( &giPhysAlloc ); + + // Find free page + for(a=0;gaSuperBitmap[a]==-1&&a0;c++); // Mark page used if(gaPageReferences) @@ -119,7 +158,7 @@ tPAddr MM_AllocPhys() // Release Spinlock RELEASE( &giPhysAlloc ); - //LOG("ret = %x", ret); + return ret; } @@ -177,6 +216,7 @@ void MM_DerefPhys(tPAddr Addr) // Mark as free in bitmaps if( gaPageReferences[ Addr ] == 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));