update project structures
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
index 39682a38a2c850e8df3b1e4a7dee6da55eec347c..c79ed07300e12492d01e8c97ed6a4383543c2ca2 100644 (file)
@@ -1,17 +1,60 @@
 #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