X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=f3cd7bb7086ba99130f746b20ee740d9a2dc6f97;hb=7a6a1cbc62289d64d604fb2cb204d21659c4905e;hp=5afc86f92e8b0195a8630a9f3df567f3a9de92b8;hpb=d52a53f035af92941c0cafe5f81888fed16d2462;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 5afc86f9..f3cd7bb7 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -9,7 +9,8 @@ * 0xFE - Unused * 0xFF - System Calls / Kernel's User Code */ -#define DEBUG 1 +#define DEBUG 0 +#define SANITY 1 #include #include #include @@ -65,6 +66,7 @@ typedef Uint32 tTabEnt; #endif // === IMPORTS === +extern void _UsertextEnd, _UsertextBase; extern Uint32 gaInitPageDir[1024]; extern Uint32 gaInitPageTable[1024]; extern void Threads_SegFault(tVAddr Addr); @@ -105,10 +107,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 ); @@ -154,6 +154,24 @@ void MM_InstallVirtual() memset( &gaPageTable[i*1024], 0, 0x1000 ); } #endif + + // Unset kernel on the User Text pages + for( i = ((tVAddr)&_UsertextEnd-(tVAddr)&_UsertextBase+0xFFF)/4096; i--; ) { + Log("MM_SetFlags( 0x%08x, 0, MM_PFLAG_KERNEL)", (tVAddr)&_UsertextBase + i*4096); + MM_SetFlags( (tVAddr)&_UsertextBase + i*4096, 0, MM_PFLAG_KERNEL ); + } +} + +/** + * \brief Cleans up the SMP required mappings + */ +void MM_FinishVirtualInit() +{ + #if USE_PAE + gaInitPDPT[ 0 ] = 0; + #else + gaInitPageDir[ 0 ] = 0; + #endif } /** @@ -177,6 +195,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; @@ -196,12 +215,14 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs) (ErrorCode&1?"bad/locked":"non-present"), (ErrorCode&16?" (Instruction Fetch)":"") ); - Warning("User Pagefault: Instruction at %p accessed %p", Regs->eip, Addr); + Warning("User Pagefault: Instruction at %04x:%08x accessed %p", Regs->cs, Regs->eip, Addr); __asm__ __volatile__ ("sti"); // Restart IRQs Threads_SegFault(Addr); return ; } + Debug_KernelPanic(); + // -- Check Error Code -- if(ErrorCode & 8) Warning("Reserved Bits Trashed!"); @@ -318,7 +339,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 +545,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) ) { @@ -767,15 +788,25 @@ void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask) // Read-Only if( Mask & MM_PFLAG_RO ) { - if( Flags & MM_PFLAG_RO ) *ent &= ~PF_WRITE; - else *ent |= PF_WRITE; + if( Flags & MM_PFLAG_RO ) { + *ent &= ~PF_WRITE; + } + else { + gaPageDir[VAddr >> 22] |= PF_WRITE; + *ent |= PF_WRITE; + } } // Kernel if( Mask & MM_PFLAG_KERNEL ) { - if( Flags & MM_PFLAG_KERNEL ) *ent &= ~PF_USER; - else *ent |= PF_USER; + if( Flags & MM_PFLAG_KERNEL ) { + *ent &= ~PF_USER; + } + else { + gaPageDir[VAddr >> 22] |= PF_USER; + *ent |= PF_USER; + } } // Copy-On-Write @@ -790,6 +821,9 @@ void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask) *ent |= PF_WRITE; } } + + //Log("MM_SetFlags: *ent = 0x%08x, gaPageDir[%i] = 0x%08x", + // *ent, VAddr >> 22, gaPageDir[VAddr >> 22]); } /** @@ -802,6 +836,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 +862,7 @@ tPAddr MM_DuplicatePage(tVAddr VAddr) if(!wasRO) gaPageTable[VAddr >> 12] |= PF_WRITE; INVLPG(VAddr); + //LEAVE('X', ret); return ret; } @@ -880,10 +917,10 @@ void MM_FreeTemp(tVAddr VAddr) } /** - * \fn tVAddr MM_MapHWPage(tPAddr PAddr, Uint Number) + * \fn tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number) * \brief Allocates a contigous number of pages */ -tVAddr MM_MapHWPage(tPAddr PAddr, Uint Number) +tVAddr MM_MapHWPages(tPAddr PAddr, Uint Number) { int i, j; @@ -947,7 +984,7 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) { phys = MM_AllocPhys(); *PhysAddr = phys; - ret = MM_MapHWPage(phys, 1); + ret = MM_MapHWPages(phys, 1); if(ret == 0) { MM_DerefPhys(phys); LEAVE('i', 0); @@ -966,7 +1003,7 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) } // Allocated successfully, now map - ret = MM_MapHWPage(phys, Pages); + ret = MM_MapHWPages(phys, Pages); if( ret == 0 ) { // If it didn't map, free then return 0 for(;Pages--;phys+=0x1000) @@ -981,10 +1018,10 @@ tVAddr MM_AllocDMA(int Pages, int MaxBits, tPAddr *PhysAddr) } /** - * \fn void MM_UnmapHWPage(tVAddr VAddr, Uint Number) + * \fn void MM_UnmapHWPages(tVAddr VAddr, Uint Number) * \brief Unmap a hardware page */ -void MM_UnmapHWPage(tVAddr VAddr, Uint Number) +void MM_UnmapHWPages(tVAddr VAddr, Uint Number) { int i, j; // Sanity Check @@ -996,7 +1033,7 @@ void MM_UnmapHWPage(tVAddr VAddr, Uint Number) for( j = 0; j < Number; j++ ) { - MM_DerefPhys( gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] ); + MM_DerefPhys( gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] & ~0xFFF ); gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] = 0; } @@ -1007,6 +1044,6 @@ void MM_UnmapHWPage(tVAddr VAddr, Uint Number) EXPORT(MM_GetPhysAddr); EXPORT(MM_Map); //EXPORT(MM_Unmap); -EXPORT(MM_MapHWPage); +EXPORT(MM_MapHWPages); EXPORT(MM_AllocDMA); -EXPORT(MM_UnmapHWPage); +EXPORT(MM_UnmapHWPages);