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