d63628b3803296d8f8118ddf9765ff0d28f798fc
[lunaix-os.git] / lunaix-os / arch / i386 / exceptions / interrupts.c
1 #include <arch/i386/interrupts.h>
2 #include <arch/i386/tss.h>
3
4 #include <hal/apic.h>
5 #include <hal/cpu.h>
6
7 #include <arch/exception.h>
8
9 #include <lunaix/isrm.h>
10 #include <lunaix/mm/page.h>
11 #include <lunaix/mm/vmm.h>
12 #include <lunaix/process.h>
13 #include <lunaix/sched.h>
14 #include <lunaix/syslog.h>
15 #include <lunaix/tty/tty.h>
16
17 #include "i386_intr.h"
18
19 LOG_MODULE("INTR")
20
21 extern x86_page_table* __kernel_ptd;
22
23 void
24 exception_init()
25 {
26     exception_install_handler();
27     isrm_init();
28     intr_routine_init();
29 }
30
31 void
32 intr_handler(isr_param* param)
33 {
34     param->execp->saved_prev_ctx = __current->intr_ctx;
35     __current->intr_ctx = param;
36
37     volatile struct exec_param* execp = __current->intr_ctx->execp;
38
39     if (execp->vector <= 255) {
40         isr_cb subscriber = isrm_get(execp->vector);
41         subscriber(param);
42         goto done;
43     }
44
45     kprint_panic("INT %u: (%x) [%p: %p] Unknown",
46                  execp->vector,
47                  execp->err_code,
48                  execp->cs,
49                  execp->eip);
50
51 done:
52     // for all external interrupts except the spurious interrupt
53     //  this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
54     if (execp->vector >= IV_EX && execp->vector != APIC_SPIV_IV) {
55         apic_done_servicing();
56     }
57
58     return;
59 }