X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Fmm_virt.c;h=aaec06ea1ae93355acd4de050cfc0bf70329700f;hb=e7d03978fb7c0c6ab1250e56e73afba9ffb89923;hp=cbf03fc68a3966348c9957fc1958cb0f0bebb890;hpb=43f12a083f112a410859597c5f45e78b1de2e7c8;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/mm_virt.c b/Kernel/arch/x86/mm_virt.c index cbf03fc6..aaec06ea 100644 --- a/Kernel/arch/x86/mm_virt.c +++ b/Kernel/arch/x86/mm_virt.c @@ -413,22 +413,6 @@ 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(Uint CR3) * \brief Sets the current process space @@ -827,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