update project structures
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
index 8dfb23bf32a176e33a935b3bd455c834360fe189..c79ed07300e12492d01e8c97ed6a4383543c2ca2 100644 (file)
@@ -1,8 +1,11 @@
 #include <arch/x86/interrupts.h>
-#include <lunaix/tty/tty.h>
+#include <hal/cpu.h>
 #include <libc/stdio.h>
+#include <lunaix/tty/tty.h>
 
-void panic_msg(const char* msg) {
+void
+panic_msg(const char* msg)
+{
     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
     tty_clear_line(10);
     tty_clear_line(11);
@@ -11,32 +14,47 @@ void panic_msg(const char* msg) {
     printf("  %s", msg);
 }
 
-void panic (const char* msg, isr_param* param) {
+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);
+    sprintf(buf,
+            "INT %u: (%x) [%p: %p] %s",
+            param->vector,
+            param->err_code,
+            param->cs,
+            param->eip,
+            msg);
     panic_msg(buf);
-    while(1);
+    while (1)
+        ;
 }
 
-void 
-interrupt_handler(isr_param* param) {
-    switch (param->vector)
-    {
+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
+            while (1)
+                ;
+            break; // never reach
         default:
             panic("Unknown Interrupt", param);
-            break;  // never reach
+            break; // never reach
     }
 }
\ No newline at end of file