update project structures
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
1 #include <arch/x86/interrupts.h>
2 #include <hal/cpu.h>
3 #include <libc/stdio.h>
4 #include <lunaix/tty/tty.h>
5
6 void
7 panic_msg(const char* msg)
8 {
9     tty_set_theme(VGA_COLOR_WHITE, VGA_COLOR_RED);
10     tty_clear_line(10);
11     tty_clear_line(11);
12     tty_clear_line(12);
13     tty_set_cpos(0, 11);
14     printf("  %s", msg);
15 }
16
17 void
18 panic(const char* msg, isr_param* param)
19 {
20     char buf[1024];
21     sprintf(buf,
22             "INT %u: (%x) [%p: %p] %s",
23             param->vector,
24             param->err_code,
25             param->cs,
26             param->eip,
27             msg);
28     panic_msg(buf);
29     while (1)
30         ;
31 }
32
33 void
34 interrupt_handler(isr_param* param)
35 {
36     switch (param->vector) {
37         case 0:
38             panic("Division by 0", param);
39             break; // never reach
40         case FAULT_GENERAL_PROTECTION:
41             panic("General Protection", param);
42             break; // never reach
43         case FAULT_PAGE_FAULT:
44             void* pg_fault_ptr = cpu_rcr2();
45             if (pg_fault_ptr) {
46                 panic("Page Fault", param);
47             } else {
48                 panic("Null pointer reference", param);
49             }
50             break; // never reach
51         case LUNAIX_SYS_PANIC:
52             panic_msg((char*)(param->registers.edi));
53             while (1)
54                 ;
55             break; // never reach
56         default:
57             panic("Unknown Interrupt", param);
58             break; // never reach
59     }
60 }