update project structures
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
index 925c13de340acb108f72b337d27016afbaa11e98..c79ed07300e12492d01e8c97ed6a4383543c2ca2 100644 (file)
@@ -1,32 +1,60 @@
 #include <arch/x86/interrupts.h>
-#include <lunaix/assert.h>
+#include <hal/cpu.h>
 #include <libc/stdio.h>
+#include <lunaix/tty/tty.h>
 
-void panic (const char* msg, isr_param* param) {
+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(" INT %u: (%x) [0x%x: 0x%x] %s", param->vector, param->err_code, param->cs, param->eip, msg);
-    while(1);
+    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:
             panic("Division by 0", param);
-            break;  // never reach
+            break; // never reach
         case FAULT_GENERAL_PROTECTION:
             panic("General Protection", param);
-            break;  // never reach
+            break; // never reach
         case FAULT_PAGE_FAULT:
-            panic("Page Fault", param);
-            break;  // never reach
+            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
+            break; // never reach
     }
 }
\ No newline at end of file