X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ferrors.c;h=3ae4bb28ea7141c5fdd8f3e312e0bc5d453de1b6;hb=4b80e9762374558077e28e321d75029645529a45;hp=31c385fc7d77a17bc822c0c735e7e86ed8a3863e;hpb=775bf8013abe9fe4ef3d4883ea2e43bba2a84da1;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/errors.c b/Kernel/arch/x86/errors.c index 31c385fc..3ae4bb28 100644 --- a/Kernel/arch/x86/errors.c +++ b/Kernel/arch/x86/errors.c @@ -12,7 +12,8 @@ // === IMPORTS === extern void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs); extern void VM8086_GPF(tRegs *Regs); -extern void Threads_Dump(); +extern void Threads_Dump(void); +extern void Threads_Fault(int Num); // === PROTOTYPES === void Error_Backtrace(Uint eip, Uint ebp); @@ -30,7 +31,7 @@ const char *csaERROR_NAMES[] = { }; // === CODE === -void __stack_chk_fail() +void __stack_chk_fail(void) { Panic("FATAL ERROR: Stack Check Failed\n"); for(;;); @@ -66,11 +67,34 @@ void ErrorHandler(tRegs *Regs) return ; } + // Check if it's a user mode fault + if( Regs->eip < KERNEL_BASE || (Regs->cs & 3) == 3 ) { + Log_Warning("Arch", "User Fault - %s, Code: 0x%x", + csaERROR_NAMES[Regs->int_num], Regs->err_code); + Log_Warning("Arch", "at CS:EIP %04x:%08x", + Regs->cs, Regs->eip); + switch( Regs->int_num ) + { + // Division by Zero + case 0: Threads_Fault(FAULT_DIV0); break; + // Invalid opcode + case 6: Threads_Fault(FAULT_OPCODE); break; + // GPF + case 13: Threads_Fault(FAULT_ACCESS); break; + // Floating Point Exception + case 16: Threads_Fault(FAULT_FLOAT); break; + + default: Threads_Fault(FAULT_MISC); break; + } + return ; + } + + Debug_KernelPanic(); Warning("CPU Error %i - %s, Code: 0x%x", Regs->int_num, csaERROR_NAMES[Regs->int_num], Regs->err_code); Warning(" CS:EIP = 0x%04x:%08x", Regs->cs, Regs->eip); if(Regs->cs == 0x08) - Warning(" SS:ESP = 0x0010:%08x", 0x10, (Uint)Regs+sizeof(tRegs)); + Warning(" SS:ESP = 0x0010:%08x", (Uint)Regs+sizeof(tRegs)); else Warning(" SS:ESP = 0x%04x:%08x", Regs->ss, Regs->esp); Warning(" EFLAGS = 0x%08x", Regs->eflags);