X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=958b9f15890cb1db30362f00707b791d5d7088b1;hb=1c2a87ec67d332b6a165c79398693eac1eb1166e;hp=4f272e75c1ea24901aefc8ccc47c095cdb1236db;hpb=9b7a7e725ca1b371e4a89776ac4a7bb10e2cbea7;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 4f272e75..958b9f15 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -10,6 +10,7 @@ * 0xFF - System Calls / Kernel's User Code */ #define DEBUG 1 +#define SANITY 1 #include #include #include @@ -105,10 +106,8 @@ Uint32 gWorkerStacks[(NUM_WORKER_STACKS+31)/32]; void MM_PreinitVirtual() { #if USE_PAE - gaInitPDPT[ 0 ] = 0; gaInitPageDir[ ((PAGE_TABLE_ADDR >> TAB)-3*512+3)*2 ] = ((tTabEnt)&gaInitPageDir - KERNEL_BASE) | 3; #else - gaInitPageDir[ 0 ] = 0; gaInitPageDir[ PAGE_TABLE_ADDR >> 22 ] = ((tTabEnt)&gaInitPageDir - KERNEL_BASE) | 3; #endif INVLPG( PAGE_TABLE_ADDR ); @@ -156,6 +155,18 @@ void MM_InstallVirtual() #endif } +/** + * \brief Cleans up the SMP required mappings + */ +void MM_FinishVirtualInit() +{ + #if USE_PAE + gaInitPDPT[ 0 ] = 0; + #else + gaInitPageDir[ 0 ] = 0; + #endif +} + /** * \fn void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) * \brief Called on a page fault @@ -177,6 +188,7 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) } else { + //Log("MM_PageFault: COW - MM_DuplicatePage(0x%x)", Addr); paddr = MM_DuplicatePage( Addr ); MM_DerefPhys( gaPageTable[Addr>>12] & ~0xFFF ); gaPageTable[Addr>>12] &= PF_USER; @@ -318,7 +330,7 @@ tPAddr MM_Allocate(tVAddr VAddr) //LOG("paddr = 0x%llx (new table)", paddr); if( paddr == 0 ) { Warning("MM_Allocate - Out of Memory (Called by %p)", __builtin_return_address(0)); - LEAVE('i',0); + //LEAVE('i',0); return 0; } // Map @@ -524,7 +536,7 @@ tPAddr MM_Clone() memsetd( gaTmpDir, 0, 1024 ); // Copy Tables - for(i=0;i<768;i++) + for( i = 0; i < 768; i ++) { // Check if table is allocated if( !(gaPageDir[i] & PF_PRESENT) ) { @@ -802,6 +814,8 @@ tPAddr MM_DuplicatePage(tVAddr VAddr) Uint temp; int wasRO = 0; + //ENTER("xVAddr", VAddr); + // Check if mapped if( !(gaPageDir [VAddr >> 22] & PF_PRESENT) ) return 0; if( !(gaPageTable[VAddr >> 12] & PF_PRESENT) ) return 0; @@ -826,6 +840,7 @@ tPAddr MM_DuplicatePage(tVAddr VAddr) if(!wasRO) gaPageTable[VAddr >> 12] |= PF_WRITE; INVLPG(VAddr); + //LEAVE('X', ret); return ret; } @@ -958,21 +973,12 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) } // Slow Allocate - phys = MM_AllocPhysRange(Pages); + phys = MM_AllocPhysRange(Pages, MaxBits); // - Was it allocated? if(phys == 0) { LEAVE('i', 0); return 0; } - // - Check if the memory is OK - if(phys + (Pages-1)*0x1000 > maxCheck) - { - // Deallocate and return 0 - for(;Pages--;phys+=0x1000) - MM_DerefPhys(phys); - LEAVE('i', 0); - return 0; - } // Allocated successfully, now map ret = MM_MapHWPage(phys, Pages);