Commenting is nice (also disabled debug in FDD driver)
[tpg/acess2.git] / Kernel / arch / x86 / errors.c
index 31c385f..3ae4bb2 100644 (file)
@@ -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);

UCC git Repository :: git.ucc.asn.au