X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=cdd071c0cf2369ee5f88f9882064370cf10504f0;hb=a04d40c6d54762969e12b3e1a3e159b912124525;hp=985dc144304f8f2b98bf8edfbdd7f0fbc9791626;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 985dc144..cdd071c0 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -18,8 +18,6 @@ #define KERNEL_STACK_END 0xFD000000 #define PAGE_TABLE_ADDR 0xFD000000 #define PAGE_DIR_ADDR 0xFD3F4000 -//#define PAGE_CR3_ADDR 0xFD3F47F4 -//#define TMP_CR3_ADDR 0xFD3F47F8 // Part of core instead of temp #define PAGE_CR3_ADDR 0xFD3F4FD0 #define TMP_CR3_ADDR 0xFD3F4FD4 // Part of core instead of temp #define TMP_DIR_ADDR 0xFD3F5000 // Same @@ -63,14 +61,17 @@ tPAddr *gTmpCR3 = (void*)TMP_CR3_ADDR; // === CODE === /** * \fn void MM_PreinitVirtual() + * \brief Maps the fractal mappings */ void MM_PreinitVirtual() { gaInitPageDir[ 0 ] = 0; gaInitPageDir[ PAGE_TABLE_ADDR >> 22 ] = ((Uint)&gaInitPageDir - KERNEL_BASE) | 3; } + /** * \fn void MM_InstallVirtual() + * \brief Sets up the constant page mappings */ void MM_InstallVirtual() { @@ -98,7 +99,7 @@ void MM_InstallVirtual() */ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs) { - ENTER("xAddr bErrorCode", Addr, ErrorCode); + //ENTER("xAddr bErrorCode", Addr, ErrorCode); // -- Check for COW -- if( gaPageDir [Addr>>22] & PF_PRESENT @@ -111,6 +112,8 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs) gaPageTable[Addr>>12] &= PF_USER; gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE; INVLPG( Addr & ~0xFFF ); + //LEAVE('-') + return; } // -- Check Error Code -- @@ -133,7 +136,6 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs) MM_DumpTables(0, -1); Panic("Page Fault at 0x%x\n", Regs->eip); - LEAVE('-'); } /** @@ -210,7 +212,7 @@ tPAddr MM_Allocate(Uint VAddr) } // Check if the page is already allocated else if( gaPageTable[ VAddr >> 12 ] != 0 ) { - Warning("MM_Allocate - Allocating to used address"); + Warning("MM_Allocate - Allocating to used address (%p)", VAddr); return gaPageTable[ VAddr >> 12 ] & ~0xFFF; } @@ -521,6 +523,19 @@ void MM_SetFlags(Uint VAddr, Uint Flags, Uint Mask) if( Flags & MM_PFLAG_KERNEL ) *ent &= ~PF_USER; else *ent |= PF_USER; } + + // Copy-On-Write + if( Mask & MM_PFLAG_COW ) + { + if( Flags & MM_PFLAG_COW ) { + *ent &= ~PF_WRITE; + *ent |= PF_COW; + } + else { + *ent &= ~PF_COW; + *ent |= PF_WRITE; + } + } } /**