#include <arch/x86/interrupts.h>
+#include <hal/cpu.h>
#include <libc/stdio.h>
+#include <lunaix/tty/tty.h>
-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