100df0ba2f84628321c4bb67031e98a6ca4d3807
[lunaix-os.git] / lunaix-os / arch / i386 / exceptions / intr_routines.c
1 #include <sys/interrupts.h>
2
3 #include <lunaix/isrm.h>
4 #include <lunaix/lxconsole.h>
5 #include <lunaix/process.h>
6 #include <lunaix/sched.h>
7 #include <lunaix/spike.h>
8 #include <lunaix/syslog.h>
9 #include <lunaix/trace.h>
10 #include <lunaix/tty/tty.h>
11
12 #include <klibc/stdio.h>
13
14 #include <sys/apic.h>
15 #include <sys/i386_intr.h>
16
17 LOG_MODULE("INTR")
18
19 extern void
20 intr_routine_page_fault(const isr_param* param);
21
22 extern u32_t debug_resv;
23
24 void
25 __print_panic_msg(const char* msg, const isr_param* param)
26 {
27     kprintf(KERROR "panic: %s\n", msg);
28     trace_printstack_isr(param);
29 }
30
31 void
32 intr_routine_divide_zero(const isr_param* param)
33 {
34     __print_panic_msg("div zero", param);
35
36     console_flush();
37     spin();
38 }
39
40 void
41 intr_routine_general_protection(const isr_param* param)
42 {
43     __print_panic_msg("general protection", param);
44
45     console_flush();
46     spin();
47 }
48
49 void
50 intr_routine_sys_panic(const isr_param* param)
51 {
52     __print_panic_msg((char*)(param->registers.edi), param);
53
54     console_flush();
55     spin();
56 }
57
58 void
59 intr_routine_fallback(const isr_param* param)
60 {
61     __print_panic_msg("unknown interrupt", param);
62
63     console_flush();
64     spin();
65 }
66
67 /**
68  * @brief ISR for Spurious interrupt
69  *
70  * @param isr_param passed by CPU
71  */
72 void
73 intr_routine_apic_spi(const isr_param* param)
74 {
75     // FUTURE: do nothing for now
76 }
77
78 void
79 intr_routine_apic_error(const isr_param* param)
80 {
81     u32_t error_reg = apic_read_reg(APIC_ESR);
82     char buf[32];
83     ksprintf(buf, "APIC error, ESR=0x%x", error_reg);
84
85     __print_panic_msg(buf, param);
86
87     console_flush();
88     spin();
89 }
90
91 void
92 intr_routine_sched(const isr_param* param)
93 {
94     schedule();
95 }
96
97 void
98 intr_routine_init()
99 {
100     isrm_bindiv(FAULT_DIVISION_ERROR, intr_routine_divide_zero);
101     isrm_bindiv(FAULT_GENERAL_PROTECTION, intr_routine_general_protection);
102     isrm_bindiv(FAULT_PAGE_FAULT, intr_routine_page_fault);
103     isrm_bindiv(FAULT_STACK_SEG_FAULT, intr_routine_page_fault);
104
105     isrm_bindiv(LUNAIX_SYS_PANIC, intr_routine_sys_panic);
106     isrm_bindiv(LUNAIX_SCHED, intr_routine_sched);
107
108     isrm_bindiv(APIC_SPIV_IV, intr_routine_apic_spi);
109     isrm_bindiv(APIC_ERROR_IV, intr_routine_apic_error);
110 }