X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ferrors.c;h=15fe22b0002edc3336476b945382b1c73aba52f5;hb=b68b764267d33a45539b4c910db13fbdae48f193;hp=d1d9cb7280d5cd842ba22971cf9fe3ab72532f43;hpb=5beb98670f040b2d4e697e4d8690cd46d2d30cf3;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/errors.c b/Kernel/arch/x86/errors.c index d1d9cb72..15fe22b0 100644 --- a/Kernel/arch/x86/errors.c +++ b/Kernel/arch/x86/errors.c @@ -12,16 +12,22 @@ // === IMPORTS === extern void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs); extern void VM8086_GPF(tRegs *Regs); -extern void Threads_Dump(void); +extern void Threads_Dump(void); extern void Threads_Fault(int Num); +extern int GetCPUNum(void); +extern void MM_DumpTables(tVAddr, tVAddr); // === PROTOTYPES === +void __stack_chk_fail(void); +void ErrorHandler(tRegs *Regs); +void Proc_PrintBacktrace(void); void Error_Backtrace(Uint eip, Uint ebp); +void StartupPrint(char *Str); // === GLOBALS === const char *csaERROR_NAMES[] = { "Divide By Zero", "Debug", "NMI Exception", "INT3", - "INTO", "Out of Bounds", "Invalid Opcode", "Coprocessor not avaliable", + "INTO Instr - Overflow", "BOUND Instr - Out of Bounds", "Invalid Opcode", "Coprocessor not avaliable", "Double Fault", "Coprocessor Segment Overrun", "Bad TSS", "Segment Not Present", "Stack Fault Exception", "GPF", "#PF", "Reserved", "Floating Point Exception", "Alignment Check Exception", "Machine Check Exception", "Reserved", @@ -31,7 +37,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(;;); @@ -40,6 +49,7 @@ void __stack_chk_fail() /** * \fn void ErrorHandler(tRegs *Regs) * \brief General Error Handler + * \param Regs Register state at error */ void ErrorHandler(tRegs *Regs) { @@ -52,9 +62,22 @@ void ErrorHandler(tRegs *Regs) __asm__ __volatile__ ("cli"); + // Debug exception (used for single-stepping) + if(Regs->int_num == 1) + { + static Uint32 lastEIP = 0; + tThread *thread = Proc_GetCurThread(); + if( Regs->eip == lastEIP ) + return; + Log("%p(%i %s) IP=%08x", thread, thread->TID, thread->ThreadName, Regs->eip); + lastEIP = Regs->eip; + return ; + } + // Page Fault if(Regs->int_num == 14) { + __asm__ __volatile__ ("sti"); // Should be OK, TODO: Test __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr)); MM_PageFault( cr, Regs->err_code, Regs ); return ; @@ -73,6 +96,7 @@ void ErrorHandler(tRegs *Regs) csaERROR_NAMES[Regs->int_num], Regs->err_code); Log_Warning("Arch", "at CS:EIP %04x:%08x", Regs->cs, Regs->eip); + MM_DumpTables(0, KERNEL_BASE); switch( Regs->int_num ) { // Division by Zero @@ -90,9 +114,16 @@ void ErrorHandler(tRegs *Regs) } 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 @@ -130,9 +161,19 @@ void ErrorHandler(tRegs *Regs) for(;;) __asm__ __volatile__ ("hlt"); } + +void Proc_PrintBacktrace(void) +{ + Uint32 ebp; + __asm__ __volatile__ ("mov %%ebp, %0" : "=r" (ebp)); + Error_Backtrace( *(Uint32*)(ebp+4), *(Uint32*)ebp ); +} + /** * \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) { @@ -185,6 +226,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) { @@ -197,7 +240,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)