X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/cd09c4b222e4ddf45a42522563ae2471a829d1c8..b0c2a4be2d1f4f93ab01d0858979a12ef0735ec1:/lunaix-os/kernel/asm/x86/interrupts.c?ds=inline diff --git a/lunaix-os/kernel/asm/x86/interrupts.c b/lunaix-os/kernel/asm/x86/interrupts.c index 39682a3..c79ed07 100644 --- a/lunaix-os/kernel/asm/x86/interrupts.c +++ b/lunaix-os/kernel/asm/x86/interrupts.c @@ -1,17 +1,60 @@ #include +#include #include +#include -void isr0 (isr_param* param) { - tty_clear(); - printf("[PANIC] Exception (%d) CS=0x%X, EIP=0x%X", param->vector, param->cs, param->eip); +void +panic_msg(const char* msg) +{ + tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED); + tty_clear_line(10); + tty_clear_line(11); + tty_clear_line(12); + tty_set_cpos(0, 11); + printf(" %s", msg); } -void -interrupt_handler(isr_param* param) { - switch (param->vector) - { +void +panic(const char* msg, isr_param* param) +{ + char buf[1024]; + sprintf(buf, + "INT %u: (%x) [%p: %p] %s", + param->vector, + param->err_code, + param->cs, + param->eip, + msg); + panic_msg(buf); + while (1) + ; +} + +void +interrupt_handler(isr_param* param) +{ + switch (param->vector) { case 0: - isr0(param); - break; + panic("Division by 0", param); + break; // never reach + case FAULT_GENERAL_PROTECTION: + panic("General Protection", param); + break; // never reach + case FAULT_PAGE_FAULT: + void* pg_fault_ptr = cpu_rcr2(); + if (pg_fault_ptr) { + panic("Page Fault", param); + } else { + panic("Null pointer reference", param); + } + break; // never reach + case LUNAIX_SYS_PANIC: + panic_msg((char*)(param->registers.edi)); + while (1) + ; + break; // never reach + default: + panic("Unknown Interrupt", param); + break; // never reach } } \ No newline at end of file