fix: race condition and partial state issue on injecting signal context into user...
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / intr_routines.c
1 #include <arch/x86/interrupts.h>
2 #include <lunaix/lxconsole.h>
3 #include <lunaix/process.h>
4 #include <lunaix/spike.h>
5 #include <lunaix/syslog.h>
6 #include <lunaix/tty/tty.h>
7
8 #include <klibc/stdio.h>
9
10 #include <hal/apic.h>
11
12 LOG_MODULE("INTR")
13
14 extern void
15 intr_routine_page_fault(const isr_param* param);
16
17 extern uint32_t debug_resv;
18
19 void
20 __print_panic_msg(const char* msg, const isr_param* param)
21 {
22     kprint_panic("  INT %u: (%x) [%p: %p] %s",
23                  param->vector,
24                  param->err_code,
25                  param->cs,
26                  param->eip,
27                  msg);
28 }
29
30 void
31 intr_routine_divide_zero(const isr_param* param)
32 {
33     __print_panic_msg("Divide by zero!", param);
34     spin();
35 }
36
37 void
38 intr_routine_general_protection(const isr_param* param)
39 {
40     kprintf(KERROR "Pid: %d\n", __current->pid);
41     kprintf(KERROR "Addr: %p\n", (&debug_resv)[0]);
42     kprintf(KERROR "Expected: %p\n", (&debug_resv)[1]);
43     console_flush(0);
44     __print_panic_msg("General Protection", param);
45     spin();
46 }
47
48 void
49 intr_routine_sys_panic(const isr_param* param)
50 {
51     __print_panic_msg((char*)(param->registers.edi), param);
52     spin();
53 }
54
55 void
56 intr_routine_fallback(const isr_param* param)
57 {
58     __print_panic_msg("Unknown Interrupt", param);
59     spin();
60 }
61
62 /**
63  * @brief ISR for Spurious interrupt
64  *
65  * @param isr_param passed by CPU
66  */
67 void
68 intr_routine_apic_spi(const isr_param* param)
69 {
70     // FUTURE: do nothing for now
71 }
72
73 void
74 intr_routine_apic_error(const isr_param* param)
75 {
76     uint32_t error_reg = apic_read_reg(APIC_ESR);
77     char buf[32];
78     sprintf(buf, "APIC error, ESR=0x%x", error_reg);
79     __print_panic_msg(buf, param);
80     spin();
81 }
82
83 void
84 intr_routine_init()
85 {
86     intr_subscribe(FAULT_DIVISION_ERROR, intr_routine_divide_zero);
87     intr_subscribe(FAULT_GENERAL_PROTECTION, intr_routine_general_protection);
88     intr_subscribe(FAULT_PAGE_FAULT, intr_routine_page_fault);
89     intr_subscribe(FAULT_STACK_SEG_FAULT, intr_routine_page_fault);
90     intr_subscribe(LUNAIX_SYS_PANIC, intr_routine_sys_panic);
91     intr_subscribe(APIC_SPIV_IV, intr_routine_apic_spi);
92     intr_subscribe(APIC_ERROR_IV, intr_routine_apic_error);
93
94     intr_set_fallback_handler(intr_routine_fallback);
95 }