X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ferrors.c;h=1e0278b6ab9f691211e0bf959c40828beffa7e30;hb=01fbfb424865291e00242681662ed9b20c33a524;hp=ac54bc110f81ac03f428d4bc20e5012607fcd9d8;hpb=85eb17b306404571aa39596946c87ad9bb1d9d13;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/errors.c b/Kernel/arch/x86/errors.c index ac54bc11..1e0278b6 100644 --- a/Kernel/arch/x86/errors.c +++ b/Kernel/arch/x86/errors.c @@ -12,10 +12,15 @@ // === 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); +extern int GetCPUNum(void); // === PROTOTYPES === +void __stack_chk_fail(void); +void ErrorHandler(tRegs *Regs); void Error_Backtrace(Uint eip, Uint ebp); +void StartupPrint(char *Str); // === GLOBALS === const char *csaERROR_NAMES[] = { @@ -30,7 +35,10 @@ const char *csaERROR_NAMES[] = { }; // === CODE === -void __stack_chk_fail() +/** + * \brief Keeps GCC happy + */ +void __stack_chk_fail(void) { Panic("FATAL ERROR: Stack Check Failed\n"); for(;;); @@ -39,6 +47,7 @@ void __stack_chk_fail() /** * \fn void ErrorHandler(tRegs *Regs) * \brief General Error Handler + * \param Regs Register state at error */ void ErrorHandler(tRegs *Regs) { @@ -66,10 +75,39 @@ 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); + + LogF("CPU %i Error %i - %s, Code: 0x%x - At %08x", + GetCPUNum(), + Regs->int_num, csaERROR_NAMES[Regs->int_num], Regs->err_code, + Regs->eip); + + //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); + __ASM__ ("xchg %bx, %bx"); if(Regs->cs == 0x08) Warning(" SS:ESP = 0x0010:%08x", (Uint)Regs+sizeof(tRegs)); else @@ -110,6 +148,8 @@ void ErrorHandler(tRegs *Regs) /** * \fn void Error_Backtrace(Uint eip, Uint ebp) * \brief Unrolls the stack to trace execution + * \param eip Current Instruction Pointer + * \param ebp Current Base Pointer (Stack Frame) */ void Error_Backtrace(Uint eip, Uint ebp) { @@ -162,6 +202,8 @@ void Error_Backtrace(Uint eip, Uint ebp) /** * \fn void StartupPrint(char *Str) + * \brief Str String to print + * \note WHY IS THIS HERE?!?! */ void StartupPrint(char *Str) { @@ -174,7 +216,9 @@ void StartupPrint(char *Str) Str ++; } - while(i < 80) buf[line*80 + i++] = 0x0720; + // Clear the rest of the line + while(i < 80) + buf[line*80 + i++] = 0x0720; line ++; if(line == 25)