X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86%2Ferrors.c;h=dcedcd5c92a1e9732f3fafc4d954cb6ea41a53c0;hb=717454930aa0e255517c68c837927deac49bd78e;hp=796300f622d30c4d2617417f65c00e54354d3370;hpb=586a47ab9343a85c944a2cf7b27a74cf459a8423;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86/errors.c b/Kernel/arch/x86/errors.c index 796300f6..dcedcd5c 100644 --- a/Kernel/arch/x86/errors.c +++ b/Kernel/arch/x86/errors.c @@ -14,6 +14,7 @@ extern void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs); extern void VM8086_GPF(tRegs *Regs); extern void Threads_Dump(void); extern void Threads_Fault(int Num); +extern int GetCPUNum(void); // === PROTOTYPES === void __stack_chk_fail(void); @@ -59,9 +60,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 ; @@ -97,9 +111,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