Big Changes - See commit details
[tpg/acess2.git] / Kernel / arch / x86 / mm_virt.c
index c8061b2..02bc9ac 100644 (file)
@@ -15,7 +15,7 @@
 #include <proc.h>
 
 #define KERNEL_STACKS          0xF0000000
-#define        KERNEL_STACK_SIZE       0x00002000
+#define        KERNEL_STACK_SIZE       0x00008000
 #define KERNEL_STACKS_END      0xFD000000
 #define WORKER_STACKS          0x00100000      // Thread0 Only!
 #define        WORKER_STACK_SIZE       KERNEL_STACK_SIZE
@@ -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 ===
@@ -168,9 +168,9 @@ void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs)
        if( gaPageDir[Addr>>22] & PF_PRESENT )
                Log("gaPageTable[0x%x] = 0x%x", Addr>>12, gaPageTable[Addr>>12]);
        
-       MM_DumpTables(0, -1);   
+       //MM_DumpTables(0, -1); 
        
-       Panic("Page Fault at 0x%x\n", Regs->eip);
+       Panic("Page Fault at 0x%x (Accessed 0x%x)", Regs->eip, Addr);
 }
 
 /**
@@ -327,6 +327,22 @@ 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)
  * \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");
@@ -611,19 +628,23 @@ tVAddr MM_NewWorkerStack()
        giLastUsedWorker = base;
        // We have one
        base = WORKER_STACKS + base * WORKER_STACK_SIZE;
+       //Log(" MM_NewWorkerStack: base = 0x%x", base);
        
        // Acquire the lock for the temp fractal mappings
        LOCK(&gilTempFractal);
        
        // Set the temp fractals to TID0's address space
-       *gTmpCR3 = (Uint)gaInitPageDir | 3;
+       *gTmpCR3 = ((Uint)gaInitPageDir - KERNEL_BASE) | 3;
+       //Log(" MM_NewWorkerStack: *gTmpCR3 = 0x%x", *gTmpCR3);
        INVLPG( gaTmpDir );
        
+       
        // Check if the directory is mapped (we are assuming that the stacks
-       // will fit neatly in a directory
+       // will fit neatly in a directory)
+       //Log(" MM_NewWorkerStack: gaTmpDir[ 0x%x ] = 0x%x", base>>22, gaTmpDir[ base >> 22 ]);
        if(gaTmpDir[ base >> 22 ] == 0) {
                gaTmpDir[ base >> 22 ] = MM_AllocPhys() | 3;
-               INVLPG( &gaTmpTable[ (base>>22) & ~0x3FF ] );
+               INVLPG( &gaTmpTable[ (base>>12) & ~0x3FF ] );
        }
        
        // Mapping Time!
@@ -632,6 +653,7 @@ tVAddr MM_NewWorkerStack()
                pages[ addr >> 12 ] = MM_AllocPhys();
                gaTmpTable[ (base + addr) >> 12 ] = pages[addr>>12] | 3;
        }
+       *gTmpCR3 = 0;
        // Release the temp mapping lock
        RELEASE(&gilTempFractal);
        
@@ -639,6 +661,9 @@ tVAddr MM_NewWorkerStack()
        oldstack = (esp + KERNEL_STACK_SIZE-1) & ~(KERNEL_STACK_SIZE-1);
        esp = oldstack - esp;   // ESP as an offset in the stack
        
+       // Make `base` be the top of the stack
+       base += WORKER_STACK_SIZE;
+       
        i = (WORKER_STACK_SIZE>>12) - 1;
        // Copy the contents of the old stack to the new one, altering the addresses
        // `addr` is refering to bytes from the stack base (mem downwards)
@@ -655,10 +680,11 @@ tVAddr MM_NewWorkerStack()
                        else    // Seems not, best leave it alone
                                tmpPage[j] = stack[j];
                }
-               MM_FreeTemp((Uint)tmpPage);
+               MM_FreeTemp((tVAddr)tmpPage);
                i --;
        }
        
+       //Log("MM_NewWorkerStack: RETURN 0x%x", base);
        return base;
 }
 

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