Cleanup and Bugfixing
[tpg/acess2.git] / Kernel / arch / x86 / mm_virt.c
index c8061b2..9892998 100644 (file)
@@ -63,7 +63,7 @@ tPAddr        *gaTmpDir = (void*)TMP_DIR_ADDR;
 tPAddr *gTmpCR3 = (void*)TMP_CR3_ADDR;
  int   gilTempMappings = 0;
  int   gilTempFractal = 0;
-Uint32 gWorkerStacks[NUM_WORKER_STACKS/32];
+Uint32 gWorkerStacks[(NUM_WORKER_STACKS+31)/32];
  int   giLastUsedWorker = 0;
 
 // === CODE ===
@@ -327,6 +327,22 @@ tPAddr MM_GetPhysAddr(tVAddr Addr)
        return (gaPageTable[Addr >> 12] & ~0xFFF) | (Addr & 0xFFF);
 }
 
+
+/**
+ * \fn int MM_IsUser(tVAddr Addr)
+ * \brief Checks if a page is user accessable
+ */
+int MM_IsUser(tVAddr Addr)
+{
+       if( !(gaPageDir[Addr >> 22] & 1) )
+               return 0;
+       if( !(gaPageTable[Addr >> 12] & 1) )
+               return 0;
+       if( !(gaPageTable[Addr >> 12] & PF_USER) )
+               return 0;
+       return 1;
+}
+
 /**
  * \fn void MM_SetCR3(tPAddr CR3)
  * \brief Sets the current process space
@@ -599,6 +615,7 @@ tVAddr MM_NewWorkerStack()
                if( gWorkerStacks[base/32] & (1 << base) ) {
                        continue;
                }
+               break;
        }
        if(base >= NUM_WORKER_STACKS) {
                Warning("Uh-oh! Out of worker stacks");

UCC git Repository :: git.ucc.asn.au