X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=7cdf5cd8a4e8443e307d9f14c89d8009dd2bc1d2;hb=4b80e9762374558077e28e321d75029645529a45;hp=9c933342b88828cdc261cbe710f9f5daf8094ee8;hpb=b98fbd4e9c71447d81fc9bd643fb174c76346e0f;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index 9c933342..7cdf5cd8 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -12,6 +12,7 @@ #define DEBUG 0 #define SANITY 1 #include +#include #include #include @@ -73,8 +74,8 @@ extern void Threads_SegFault(tVAddr Addr); extern void Error_Backtrace(Uint eip, Uint ebp); // === PROTOTYPES === -void MM_PreinitVirtual(); -void MM_InstallVirtual(); +void MM_PreinitVirtual(void); +void MM_InstallVirtual(void); void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); void MM_DumpTables(tVAddr Start, tVAddr End); tPAddr MM_DuplicatePage(tVAddr VAddr); @@ -101,10 +102,10 @@ Uint32 gWorkerStacks[(NUM_WORKER_STACKS+31)/32]; // === CODE === /** - * \fn void MM_PreinitVirtual() + * \fn void MM_PreinitVirtual(void) * \brief Maps the fractal mappings */ -void MM_PreinitVirtual() +void MM_PreinitVirtual(void) { #if USE_PAE gaInitPageDir[ ((PAGE_TABLE_ADDR >> TAB)-3*512+3)*2 ] = ((tTabEnt)&gaInitPageDir - KERNEL_BASE) | 3; @@ -115,10 +116,10 @@ void MM_PreinitVirtual() } /** - * \fn void MM_InstallVirtual() + * \fn void MM_InstallVirtual(void) * \brief Sets up the constant page mappings */ -void MM_InstallVirtual() +void MM_InstallVirtual(void) { int i; @@ -165,7 +166,7 @@ void MM_InstallVirtual() /** * \brief Cleans up the SMP required mappings */ -void MM_FinishVirtualInit() +void MM_FinishVirtualInit(void) { #if USE_PAE gaInitPDPT[ 0 ] = 0; @@ -412,27 +413,11 @@ tPAddr MM_GetPhysAddr(tVAddr Addr) return (gaPageTable[Addr >> 12] & ~0xFFF) | (Addr & 0xFFF); } - /** - * \fn int MM_IsUser(tVAddr VAddr) - * \brief Checks if a page is user accessable - */ -int MM_IsUser(tVAddr VAddr) -{ - if( !(gaPageDir[VAddr >> 22] & 1) ) - return 0; - if( !(gaPageTable[VAddr >> 12] & 1) ) - return 0; - if( !(gaPageTable[VAddr >> 12] & PF_USER) ) - return 0; - return 1; -} - -/** - * \fn void MM_SetCR3(tPAddr CR3) + * \fn void MM_SetCR3(Uint CR3) * \brief Sets the current process space */ -void MM_SetCR3(tPAddr CR3) +void MM_SetCR3(Uint CR3) { __asm__ __volatile__ ("mov %0, %%cr3"::"r"(CR3)); } @@ -494,7 +479,7 @@ int MM_Map(tVAddr VAddr, tPAddr PAddr) * \fn tVAddr MM_ClearUser() * \brief Clear user's address space */ -tVAddr MM_ClearUser() +tVAddr MM_ClearUser(void) { Uint i, j; @@ -525,10 +510,10 @@ tVAddr MM_ClearUser() } /** - * \fn tPAddr MM_Clone() + * \fn tPAddr MM_Clone(void) * \brief Clone the current address space */ -tPAddr MM_Clone() +tPAddr MM_Clone(void) { Uint i, j; tVAddr ret; @@ -651,10 +636,10 @@ tPAddr MM_Clone() } /** - * \fn tVAddr MM_NewKStack() + * \fn tVAddr MM_NewKStack(void) * \brief Create a new kernel stack */ -tVAddr MM_NewKStack() +tVAddr MM_NewKStack(void) { tVAddr base = KERNEL_STACKS; Uint i; @@ -826,6 +811,30 @@ void MM_SetFlags(tVAddr VAddr, Uint Flags, Uint Mask) // *ent, VAddr >> 22, gaPageDir[VAddr >> 22]); } +/** + * \brief Get the flags on a page + */ +Uint MM_GetFlags(tVAddr VAddr) +{ + tTabEnt *ent; + Uint ret = 0; + + // Validity Check + if( !(gaPageDir[VAddr >> 22] & 1) ) return 0; + if( !(gaPageTable[VAddr >> 12] & 1) ) return 0; + + ent = &gaPageTable[VAddr >> 12]; + + // Read-Only + if( !(*ent & PF_WRITE) ) ret |= MM_PFLAG_RO; + // Kernel + if( !(*ent & PF_USER) ) ret |= MM_PFLAG_KERNEL; + // Copy-On-Write + if( *ent & PF_COW ) ret |= MM_PFLAG_COW; + + return ret; +} + /** * \fn tPAddr MM_DuplicatePage(tVAddr VAddr) * \brief Duplicates a virtual page to a physical one