refactor: decouple i386 specific instruction invocation
[lunaix-os.git] / lunaix-os / kernel / asm / i386 / intr_routines.c
1 #include <arch/i386/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/tty/tty.h>
10
11 #include <klibc/stdio.h>
12
13 #include <hal/apic.h>
14
15 LOG_MODULE("INTR")
16
17 extern void
18 intr_routine_page_fault(const isr_param* param);
19
20 extern u32_t debug_resv;
21
22 void
23 __print_panic_msg(const char* msg, const isr_param* param)
24 {
25     volatile struct exec_param* execp = param->execp;
26
27     kprint_panic("  INT %u: (%x) [%p: %p] %s",
28                  execp->vector,
29                  execp->err_code,
30                  execp->cs,
31                  execp->eip,
32                  msg);
33 }
34
35 void
36 intr_routine_divide_zero(const isr_param* param)
37 {
38     console_flush();
39     __print_panic_msg("Divide by zero!", param);
40     spin();
41 }
42
43 void
44 intr_routine_general_protection(const isr_param* param)
45 {
46     kprintf(KERROR "Pid: %d\n", __current->pid);
47     kprintf(KERROR "Addr: %p\n", (&debug_resv)[0]);
48     kprintf(KERROR "Expected: %p\n", (&debug_resv)[1]);
49     console_flush();
50     __print_panic_msg("General Protection", param);
51     spin();
52 }
53
54 void
55 intr_routine_sys_panic(const isr_param* param)
56 {
57     console_flush();
58     __print_panic_msg((char*)(param->registers.edi), param);
59     spin();
60 }
61
62 void
63 intr_routine_fallback(const isr_param* param)
64 {
65     console_flush();
66     __print_panic_msg("Unknown Interrupt", param);
67     spin();
68 }
69
70 /**
71  * @brief ISR for Spurious interrupt
72  *
73  * @param isr_param passed by CPU
74  */
75 void
76 intr_routine_apic_spi(const isr_param* param)
77 {
78     // FUTURE: do nothing for now
79 }
80
81 void
82 intr_routine_apic_error(const isr_param* param)
83 {
84     u32_t error_reg = apic_read_reg(APIC_ESR);
85     char buf[32];
86     ksprintf(buf, "APIC error, ESR=0x%x", error_reg);
87     console_flush();
88     __print_panic_msg(buf, param);
89     spin();
90 }
91
92 void
93 intr_routine_sched(const isr_param* param)
94 {
95     schedule();
96 }
97
98 void
99 intr_routine_init()
100 {
101     isrm_bindiv(FAULT_DIVISION_ERROR, intr_routine_divide_zero);
102     isrm_bindiv(FAULT_GENERAL_PROTECTION, intr_routine_general_protection);
103     isrm_bindiv(FAULT_PAGE_FAULT, intr_routine_page_fault);
104     isrm_bindiv(FAULT_STACK_SEG_FAULT, intr_routine_page_fault);
105
106     isrm_bindiv(LUNAIX_SYS_PANIC, intr_routine_sys_panic);
107     isrm_bindiv(LUNAIX_SCHED, intr_routine_sched);
108
109     isrm_bindiv(APIC_SPIV_IV, intr_routine_apic_spi);
110     isrm_bindiv(APIC_ERROR_IV, intr_routine_apic_error);
111 }