/* * crash.c * * Created on: Aug 19, 2011 * Author: Tiberiu */ #include 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); }