Cleanup
[tpg/acess2.git] / Kernel / arch / x86 / mm_virt.c
index 2fec186..3663d60 100644 (file)
@@ -40,6 +40,8 @@
 // === IMPORTS ===
 extern Uint32  gaInitPageDir[1024];
 extern Uint32  gaInitPageTable[1024];
+extern void    Threads_SegFault(Uint Addr);
+extern void    Error_Backtrace(Uint eip, Uint ebp);
 
 // === PROTOTYPES ===
 void   MM_PreinitVirtual();
@@ -118,12 +120,19 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
                        gaPageTable[Addr>>12] &= PF_USER;
                        gaPageTable[Addr>>12] |= paddr|PF_PRESENT|PF_WRITE;
                }
-               //LOG("Duplicated page at %p to 0x%x", Addr&~0xFFF, gaPageTable[Addr>>12]);
+               
                INVLPG( Addr & ~0xFFF );
                //LEAVE('-')
                return;
        }
        
+       // If it was a user, tell the thread handler
+       if(ErrorCode & 4) {
+               Warning("User Pagefault: Instruction at %p accessed %p\n", Regs->eip, Addr);
+               Threads_SegFault(Addr);
+               return ;
+       }
+       
        // -- Check Error Code --
        if(ErrorCode & 8)
                Warning("Reserved Bits Trashed!");
@@ -137,6 +146,10 @@ void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs)
                        );
        }
        
+       Log("Code at %p accessed %p", Regs->eip, Addr);
+       // Print Stack Backtrace
+       Error_Backtrace(Regs->eip, Regs->ebp);
+       
        Log("gaPageDir[0x%x] = 0x%x", Addr>>22, gaPageDir[Addr>>22]);
        if( gaPageDir[Addr>>22] & PF_PRESENT )
                Log("gaPageTable[0x%x] = 0x%x", Addr>>12, gaPageTable[Addr>>12]);
@@ -160,6 +173,7 @@ void MM_DumpTables(tVAddr Start, tVAddr End)
        
        Start >>= 12;   End >>= 12;
        
+       #if 0
        Log("Directory Entries:");
        for(page = Start >> 10;
                page < (End >> 10)+1;
@@ -173,6 +187,7 @@ void MM_DumpTables(tVAddr Start, tVAddr End)
                                );
                }
        }
+       #endif
        
        Log("Table Entries:");
        for(page = Start, curPos = Start<<12;
@@ -386,10 +401,12 @@ Uint MM_ClearUser()
                }
                
                MM_DerefPhys( gaPageDir[i] & ~0xFFF );
+               gaPageDir[i] = 0;
+               INVLPG( &gaPageTable[i*1024] );
        }
+       INVLPG( gaPageDir );
        
-       
-       return *gTmpCR3;
+       return *gaPageCR3;
 }
 
 /**

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