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