2 * Acess2 - x86 Architecture
10 #define MAX_BACKTRACE 8 //!< Maximum distance to trace the stack backwards
13 extern void MM_PageFault(Uint Addr, Uint ErrorCode, tRegs *Regs);
14 extern void VM8086_GPF(tRegs *Regs);
15 extern void Threads_Dump(void);
16 extern void Threads_Fault(int Num);
19 void __stack_chk_fail(void);
20 void ErrorHandler(tRegs *Regs);
21 void Error_Backtrace(Uint eip, Uint ebp);
22 void StartupPrint(char *Str);
25 const char *csaERROR_NAMES[] = {
26 "Divide By Zero", "Debug", "NMI Exception", "INT3",
27 "INTO", "Out of Bounds", "Invalid Opcode", "Coprocessor not avaliable",
28 "Double Fault", "Coprocessor Segment Overrun", "Bad TSS", "Segment Not Present",
29 "Stack Fault Exception", "GPF", "#PF", "Reserved",
30 "Floating Point Exception", "Alignment Check Exception", "Machine Check Exception", "Reserved",
31 "Reserved", "Reserved", "Reserved", "Reserved",
32 "Reserved", "Reserved", "Reserved", "Reserved",
33 "Reserved", "Reserved", "Reserved", "Reserved"
38 * \brief Keeps GCC happy
40 void __stack_chk_fail(void)
42 Panic("FATAL ERROR: Stack Check Failed\n");
47 * \fn void ErrorHandler(tRegs *Regs)
48 * \brief General Error Handler
49 * \param Regs Register state at error
51 void ErrorHandler(tRegs *Regs)
55 //if( Regs && !(Regs->int_num == 13 && Regs->eflags & 0x20000) )
56 // __asm__ __volatile__ ("xchg %bx, %bx");
57 //Log_Debug("X86", "Regs = %p", Regs);
58 //Log_Debug("X86", "Error %i at 0x%08x", Regs->int_num, Regs->eip);
60 __asm__ __volatile__ ("cli");
63 if(Regs->int_num == 14)
65 __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr));
66 MM_PageFault( cr, Regs->err_code, Regs );
71 if(Regs->int_num == 13 && Regs->eflags & 0x20000)
77 // Check if it's a user mode fault
78 if( Regs->eip < KERNEL_BASE || (Regs->cs & 3) == 3 ) {
79 Log_Warning("Arch", "User Fault - %s, Code: 0x%x",
80 csaERROR_NAMES[Regs->int_num], Regs->err_code);
81 Log_Warning("Arch", "at CS:EIP %04x:%08x",
83 switch( Regs->int_num )
86 case 0: Threads_Fault(FAULT_DIV0); break;
88 case 6: Threads_Fault(FAULT_OPCODE); break;
90 case 13: Threads_Fault(FAULT_ACCESS); break;
91 // Floating Point Exception
92 case 16: Threads_Fault(FAULT_FLOAT); break;
94 default: Threads_Fault(FAULT_MISC); break;
100 Warning("CPU Error %i - %s, Code: 0x%x",
101 Regs->int_num, csaERROR_NAMES[Regs->int_num], Regs->err_code);
102 Warning(" CS:EIP = 0x%04x:%08x", Regs->cs, Regs->eip);
104 Warning(" SS:ESP = 0x0010:%08x", (Uint)Regs+sizeof(tRegs));
106 Warning(" SS:ESP = 0x%04x:%08x", Regs->ss, Regs->esp);
107 Warning(" EFLAGS = 0x%08x", Regs->eflags);
108 Warning(" EAX %08x ECX %08x EDX %08x EBX %08x",
109 Regs->eax, Regs->ecx, Regs->edx, Regs->ebx);
110 Warning(" ESP %08x EBP %08x ESI %08x EDI %08x",
111 Regs->esp, Regs->ebp, Regs->esi, Regs->edi);
112 Warning(" DS %04x ES %04x FS %04x GS %04x",
113 Regs->ds, Regs->es, Regs->fs, Regs->gs);
116 __asm__ __volatile__ ("mov %%cr0, %0":"=r"(cr));
117 Warning(" CR0 0x%08x", cr);
118 __asm__ __volatile__ ("mov %%cr2, %0":"=r"(cr));
119 Warning(" CR2 0x%08x", cr);
120 __asm__ __volatile__ ("mov %%cr3, %0":"=r"(cr));
121 Warning(" CR3 0x%08x", cr);
123 switch( Regs->int_num )
126 Warning(" Offending bytes: %02x %02x %02x %02x",
127 *(Uint8*)Regs->eip+0, *(Uint8*)Regs->eip+1,
128 *(Uint8*)Regs->eip+2, *(Uint8*)Regs->eip+3);
132 // Print Stack Backtrace
133 Error_Backtrace(Regs->eip, Regs->ebp);
135 // Dump running threads
138 for(;;) __asm__ __volatile__ ("hlt");
141 * \fn void Error_Backtrace(Uint eip, Uint ebp)
142 * \brief Unrolls the stack to trace execution
143 * \param eip Current Instruction Pointer
144 * \param ebp Current Base Pointer (Stack Frame)
146 void Error_Backtrace(Uint eip, Uint ebp)
152 //if(eip < 0xC0000000 && eip > 0x1000)
154 // LogF("Backtrace: User - 0x%x\n", eip);
160 LogF("Backtrace: Data Area - 0x%x\n", eip);
166 LogF("Backtrace: Kernel Module - 0x%x\n", eip);
170 //str = Debug_GetSymbol(eip, &delta);
172 LogF("Backtrace: 0x%x", eip);
174 LogF("Backtrace: %s+0x%x", str, delta);
175 if(!MM_GetPhysAddr(ebp))
177 LogF("\nBacktrace: Invalid EBP, stopping\n");
182 while( MM_GetPhysAddr(ebp) && i < MAX_BACKTRACE )
184 //str = Debug_GetSymbol(*(Uint*)(ebp+4), &delta);
186 LogF(" >> 0x%x", *(Uint*)(ebp+4));
188 LogF(" >> %s+0x%x", str, delta);
196 * \fn void StartupPrint(char *Str)
197 * \brief Str String to print
198 * \note WHY IS THIS HERE?!?!
200 void StartupPrint(char *Str)
202 Uint16 *buf = (void*)0xC00B8000;
207 buf[line*80 + i++] = *Str | 0x0700;
211 // Clear the rest of the line
213 buf[line*80 + i++] = 0x0720;
219 memcpy(buf, &buf[80], 80*24*2);
220 memset(&buf[80*24], 0, 80*2);
225 EXPORT(__stack_chk_fail);