X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Ferrors.c;h=9f1d290a0e878763c8ac568af563b5f4598e8956;hb=18b264927674c480481466c40368554fb72f560f;hp=605e9039c451d945ba21200e61cb7a9219674a28;hpb=eecce4b7a55315f6c385ad8be35c25dbb12d43d8;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/errors.c b/Kernel/arch/x86_64/errors.c index 605e9039..9f1d290a 100644 --- a/Kernel/arch/x86_64/errors.c +++ b/Kernel/arch/x86_64/errors.c @@ -5,6 +5,9 @@ #include #include +// === IMPORTS === +void MM_PageFault(tVAddr Addr, Uint ErrorCode, tRegs *Regs); + // === PROTOTYPES === void Error_Handler(tRegs *Regs); @@ -25,19 +28,29 @@ void Error_Handler(tRegs *Regs) { Uint cr; + if( Regs->IntNum == 14 ) { + __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr)); + MM_PageFault(cr, Regs->ErrorCode, Regs); + return ; + } + Debug_KernelPanic(); - Warning("CPU Error %i - %s, Code: 0x%x", - Regs->IntNum, csaERROR_NAMES[Regs->IntNum], Regs->ErrorCode); - Warning(" CS:RIP = 0x%04x:%016x", Regs->CS, Regs->RIP); - Warning(" SS:RSP = 0x%04x:%016x", Regs->SS, Regs->RIP); - Warning(" RFLAGS = 0x%016x", Regs->RFlags); - Warning(" EAX %016x ECX %016x EDX %016x EBX %016x", + Log("CPU Error %x, Code: 0x%x", Regs->IntNum, Regs->ErrorCode); + Log(" - %s", csaERROR_NAMES[Regs->IntNum]); + Log(" CS:RIP = 0x%04x:%016x", Regs->CS, Regs->RIP); + Log(" SS:RSP = 0x%04x:%016x", Regs->SS, Regs->RSP); + Log(" RFLAGS = 0x%016x", Regs->RFlags); + + Log(" RAX %016x RCX %016x RDX %016x RBX %016x", Regs->RAX, Regs->RCX, Regs->RDX, Regs->RBX); - Warning(" ESP %016x EBP %016x ESI %016x EDI %016x", + Log(" RSP %016x RBP %016x RSI %016x RDI %016x", Regs->RSP, Regs->RBP, Regs->RSP, Regs->RDI); - - Warning(" FS %04x GS %04x", Regs->FS, Regs->GS); + Log(" R8 %016x R9 %016x R10 %016x R11 %016x", + Regs->R8, Regs->R9, Regs->R10, Regs->R11); + Log(" R12 %016x R13 %016x R14 %016x R15 %016x", + Regs->R12, Regs->R13, Regs->R14, Regs->R15); + Log(" FS %04x GS %04x", Regs->FS, Regs->GS); // Control Registers @@ -54,11 +67,13 @@ void Error_Handler(tRegs *Regs) { case 6: // #UD Warning(" Offending bytes: %02x %02x %02x %02x", - *(Uint8*)Regs->RIP+0, *(Uint8*)Regs->RIP+1, - *(Uint8*)Regs->RIP+2, *(Uint8*)Regs->RIP+3); + *(Uint8*)(Regs->RIP+0), *(Uint8*)(Regs->RIP+1), + *(Uint8*)(Regs->RIP+2), *(Uint8*)(Regs->RIP+3) + ); break; } + __asm__ __volatile__ ("cli"); for(;;) __asm__ __volatile__ ("hlt"); }