97 lines
3.2 KiB
C
97 lines
3.2 KiB
C
|
/*
|
||
|
* crash.c
|
||
|
*
|
||
|
* Created on: Aug 19, 2011
|
||
|
* Author: Tiberiu
|
||
|
*/
|
||
|
|
||
|
#include <debugio.h>
|
||
|
|
||
|
string errorCodes[] =
|
||
|
{
|
||
|
"Division by zero", //0
|
||
|
"Debugger", //1
|
||
|
"Non maskable interrupt", //2
|
||
|
"Breakpoint", //3
|
||
|
"Overflow", //4
|
||
|
"Bounds", //5
|
||
|
"Invalid opcode", //6
|
||
|
"Coprocessor not available", //7
|
||
|
"Double fault", //8
|
||
|
"Coprocessor segment overrun",//9
|
||
|
"Invalid task state segment", //A
|
||
|
"Segment not present", //B
|
||
|
"Stack fault", //C
|
||
|
"General protection fault", //D
|
||
|
"Page fault", //E
|
||
|
"", //F
|
||
|
"Math fault", //10
|
||
|
"Alignment check", //11
|
||
|
"Machine check", //12
|
||
|
"SIMD floating-point exception" //13
|
||
|
};
|
||
|
|
||
|
void CrashMessage(_RegsStack32 *r)
|
||
|
{
|
||
|
ConsoleSetDefaultColor(ColorLightRed);
|
||
|
ConsoleWrite("\n"); uint32 i;
|
||
|
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
|
||
|
|
||
|
ConsoleWrite("%#\t\t\t\tSomething went terribly wrong :(\n\n", ColorWhite);
|
||
|
ConsoleWrite("There was an unhandled exception: ");
|
||
|
|
||
|
if (r->int_no < 20)
|
||
|
ConsoleWrite("%#%s (INT%u)", ColorWhite, errorCodes[r->int_no], r->int_no);
|
||
|
else ConsoleWrite("%#INT%u", ColorWhite, r->int_no);
|
||
|
|
||
|
ConsoleWrite("\nTo protect your computer, it had to be halted.\n\n");
|
||
|
ConsoleWrite("Here, this might help find the problem:\n");
|
||
|
|
||
|
Point a = {4, -1}, b = {22, -1}, c = {40, -1}, d = {58, -1};
|
||
|
|
||
|
ConsoleSetDefaultColor(ColorWhite);
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("eax=0x%x", r->eax);
|
||
|
ConsoleCursorGoto(b); ConsoleWrite("ebx=0x%x", r->ebx);
|
||
|
ConsoleCursorGoto(c); ConsoleWrite("ecx=0x%x", r->ecx);
|
||
|
ConsoleCursorGoto(d); ConsoleWrite("edx=0x%x\n", r->edx);
|
||
|
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("edi=0x%x", r->edi);
|
||
|
ConsoleCursorGoto(b); ConsoleWrite("esi=0x%x", r->esi);
|
||
|
ConsoleCursorGoto(c); ConsoleWrite("ebp=0x%x", r->ebp);
|
||
|
ConsoleCursorGoto(d); ConsoleWrite("esp=0x%x\n", r->esp);
|
||
|
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->gs);
|
||
|
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->fs);
|
||
|
ConsoleCursorGoto(c); ConsoleWrite("es=0x%x", r->es);
|
||
|
ConsoleCursorGoto(d); ConsoleWrite("ds=0x%x\n", r->ds);
|
||
|
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("eip=0x%x", r->eip);
|
||
|
ConsoleCursorGoto(b); ConsoleWrite("cs=0x%x", r->cs);
|
||
|
ConsoleCursorGoto(c); ConsoleWrite("eflags=0x%x", r->eflags);
|
||
|
ConsoleCursorGoto(d); ConsoleWrite("useresp=0x%x\n", r->useresp);
|
||
|
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("gs=0x%x", r->ss);
|
||
|
ConsoleCursorGoto(b); ConsoleWrite("fs=0x%x", r->int_no);
|
||
|
ConsoleCursorGoto(c); ConsoleWrite("err_code=0x%x", r->err_code);
|
||
|
|
||
|
// Useful info about page fault
|
||
|
if (r->int_no == 0xE)
|
||
|
{
|
||
|
uint32 faulting_address;
|
||
|
asm volatile("mov %%cr2, %0" : "=r" (faulting_address));
|
||
|
|
||
|
ConsoleCursorGoto(d); ConsoleWrite("address=0x%x\n", faulting_address);
|
||
|
ConsoleCursorGoto(a); ConsoleWrite("reason: ");
|
||
|
|
||
|
if (!(r->err_code & 1)) ConsoleWrite("%#PAGE_NOT_PRESENT; ", ColorLightGray);
|
||
|
if (r->err_code & 2) ConsoleWrite("%#WRITE_OPERATION; ", ColorLightGray);
|
||
|
if (r->err_code & 4) ConsoleWrite("%#CPU_IN_USER_MODE; ", ColorLightGray);
|
||
|
if (r->err_code & 8) ConsoleWrite("%#CPU_RESERVED_PAGE_ENTRY_OVERWRITTEN; ", ColorLightGray);
|
||
|
if (r->err_code & 0x10) ConsoleWrite("%#INSTRUCTION_FETCH; ", ColorLightGray);
|
||
|
}
|
||
|
|
||
|
ConsoleSetDefaultColor(ColorLightRed);
|
||
|
ConsoleWrite("\n");
|
||
|
for (i = 0; i < 80; i++) ConsoleWrite("%c", 205);
|
||
|
}
|