Kernel address space isolation and make the kernel heap global to all processes.
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / interrupts.c
1 #include <arch/x86/interrupts.h>
2 #include <hal/apic.h>
3 #include <hal/cpu.h>
4 #include <lunaix/syslog.h>
5 #include <lunaix/tty/tty.h>
6 #include <lunaix/process.h>
7 #include <lunaix/sched.h>
8 #include <lunaix/mm/page.h>
9
10 LOG_MODULE("intr")
11
12 static int_subscriber subscribers[256];
13
14 static int_subscriber fallback = (int_subscriber) 0;
15
16 void
17 intr_subscribe(const uint8_t vector, int_subscriber subscriber) {
18     subscribers[vector] = subscriber;
19 }
20
21 void
22 intr_unsubscribe(const uint8_t vector, int_subscriber subscriber) {
23     if (subscribers[vector] == subscriber) {
24         subscribers[vector] = (int_subscriber) 0;
25     }
26 }
27
28 void
29 intr_set_fallback_handler(int_subscriber subscribers) {
30     fallback = subscribers;
31 }
32
33 extern x86_page_table* __kernel_ptd;
34
35 void
36 intr_handler(isr_param* param)
37 {
38     // if (param->vector == LUNAIX_SYS_CALL) {
39     //     kprintf(KDEBUG "%p", param->registers.esp);
40     // }
41     __current->intr_ctx = *param;
42
43     cpu_lcr3(__kernel_ptd);
44
45     isr_param *lparam = &__current->intr_ctx;
46     
47     if (lparam->vector <= 255) {
48         int_subscriber subscriber = subscribers[lparam->vector];
49         if (subscriber) {
50             subscriber(lparam);
51             goto done;
52         }
53     }
54
55     if (fallback) {
56         fallback(lparam);
57         goto done;
58     }
59     
60     kprint_panic("INT %u: (%x) [%p: %p] Unknown",
61             lparam->vector,
62             lparam->err_code,
63             lparam->cs,
64             lparam->eip);
65
66 done:
67
68     // if (__current->state != PROC_RUNNING) {
69     //     schedule();
70     // }
71
72     // for all external interrupts except the spurious interrupt
73     //  this is required by Intel Manual Vol.3A, section 10.8.1 & 10.8.5
74     if (lparam->vector >= EX_INTERRUPT_BEGIN && lparam->vector != APIC_SPIV_IV) {
75         apic_done_servicing();
76     }
77
78     cpu_lcr3(__current->page_table);
79
80     *param = __current->intr_ctx;
81
82     return;
83 }