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 ===
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
if( gWorkerStacks[base/32] & (1 << base) ) {
continue;
}
+ break;
}
if(base >= NUM_WORKER_STACKS) {
Warning("Uh-oh! Out of worker stacks");