X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=f3cd7bb7086ba99130f746b20ee740d9a2dc6f97;hb=7a6a1cbc62289d64d604fb2cb204d21659c4905e;hp=db89cc14facb922d2add9f6e2ead535d01920590;hpb=eb934b266052965b9c480d11d6866a994f30731b;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index db89cc14..f3cd7bb7 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -66,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); @@ -153,6 +154,12 @@ 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 ); + } } /** @@ -781,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 @@ -804,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]); } /** @@ -1013,7 +1033,7 @@ void MM_UnmapHWPages(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; }