// === 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();
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", Regs->eip, Addr);
+ __asm__ __volatile__ ("sti"); // Restart IRQs
+ Threads_SegFault(Addr);
+ return ;
+ }
+
// -- Check Error Code --
if(ErrorCode & 8)
Warning("Reserved Bits Trashed!");
);
}
+ 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]);
Start >>= 12; End >>= 12;
+ #if 0
Log("Directory Entries:");
- for(page = Start >> 22;
- page < End >> 22;
+ for(page = Start >> 10;
+ page < (End >> 10)+1;
page ++)
{
if(gaPageDir[page])
);
}
}
+ #endif
Log("Table Entries:");
for(page = Start, curPos = Start<<12;
}
MM_DerefPhys( gaPageDir[i] & ~0xFFF );
+ gaPageDir[i] = 0;
+ INVLPG( &gaPageTable[i*1024] );
}
+ INVLPG( gaPageDir );
-
- return *gTmpCR3;
+ return *gaPageCR3;
}
/**