fix bugs found in brk & add simple security checks on lx_free
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
index 39682a38a2c850e8df3b1e4a7dee6da55eec347c..8dfb23bf32a176e33a935b3bd455c834360fe189 100644 (file)
@@ -1,9 +1,21 @@
 #include <arch/x86/interrupts.h>
+#include <lunaix/tty/tty.h>
 #include <libc/stdio.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 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 
@@ -11,7 +23,20 @@ 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:
+            panic("Page Fault", 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