#define DEBUG 0
#define SANITY 1
#include <acess.h>
+#include <mm_virt.h>
#include <mm_phys.h>
#include <proc.h>
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));
}
// *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
void MM_UnmapHWPages(tVAddr VAddr, Uint Number)
{
int i, j;
+
+ //Log_Debug("VirtMem", "MM_UnmapHWPages: (VAddr=0x%08x, Number=%i)", VAddr, Number);
+
// Sanity Check
- if(VAddr < HW_MAP_ADDR || VAddr-Number*0x1000 > HW_MAP_MAX) return;
+ if(VAddr < HW_MAP_ADDR || VAddr+Number*0x1000 > HW_MAP_MAX) return;
i = VAddr >> 12;
LOCK( &gilTempMappings ); // Temp and HW share a directory, so they share a lock
+
for( j = 0; j < Number; j++ )
{
- MM_DerefPhys( gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] & ~0xFFF );
- gaPageTable[ (HW_MAP_ADDR >> 12) + i + j ] = 0;
+ MM_DerefPhys( gaPageTable[ i + j ] & ~0xFFF );
+ gaPageTable[ i + j ] = 0;
}
RELEASE( &gilTempMappings );