// === IMPORTS ===
extern Uint32 gaInitPageDir[1024];
extern Uint32 gaInitPageTable[1024];
+extern void Threads_SegFault(Uint Addr);
// === PROTOTYPES ===
void MM_PreinitVirtual();
return;
}
+ // If it was a user, tell the thread handler
+ if(ErrorCode & 4) {
+ Threads_SegFault(Addr);
+ return ;
+ }
+
// -- Check Error Code --
if(ErrorCode & 8)
Warning("Reserved Bits Trashed!");
const tPAddr MASK = ~0xF98;
Start >>= 12; End >>= 12;
+
+ Log("Directory Entries:");
+ for(page = Start >> 10;
+ page < (End >> 10)+1;
+ page ++)
+ {
+ if(gaPageDir[page])
+ {
+ Log(" 0x%08x-0x%08x :: 0x%08x",
+ page<<22, ((page+1)<<22)-1,
+ gaPageDir[page]&~0xFFF
+ );
+ }
+ }
+
+ Log("Table Entries:");
for(page = Start, curPos = Start<<12;
page < End;
curPos += 0x1000, page++)
|| (gaPageTable[page] & MASK) != expected)
{
if(expected) {
- Log("0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
+ Log(" 0x%08x-0x%08x => 0x%08x-0x%08x (%s%s%s%s)",
rangeStart, curPos - 1,
gaPageTable[rangeStart>>12] & ~0xFFF,
(expected & ~0xFFF) - 1,
}
MM_DerefPhys( gaPageDir[i] & ~0xFFF );
+ gaPageDir[i] = 0;
+ INVLPG( &gaPageTable[i*1024] );
}
+ INVLPG( gaPageDir );
-
- return *gTmpCR3;
+ return *gaPageCR3;
}
/**