summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/idt.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/idt.c')
-rw-r--r--arch/x86_64/idt.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/x86_64/idt.c b/arch/x86_64/idt.c
index 1080f92..2eebf41 100644
--- a/arch/x86_64/idt.c
+++ b/arch/x86_64/idt.c
@@ -1,12 +1,20 @@
#include "arch/x86_64/tables.h"
#include "arch/x86_64/idt.h"
+#include "print.h"
__attribute__((aligned(0x10)))
-interrupt_gate_t s_idtd[256];
+static interrupt_gate_t s_idtd[256];
+
+kernel_isr_handler_t kernel_isr_handles[256];
void
isr_handle(ivt_state_t* state)
{
+ kernel_isr_handler_t kernel_handle = kernel_isr_handles[state->num];
+ if(kernel_handle) {
+ kernel_handle(state);
+ return;
+ }
kpanic_state(state, "Unhandled interrupt %i", state->num);
}
@@ -34,6 +42,8 @@ idt_setup(processor_t *processor)
processor->idtr.base = (uintptr_t)&s_idtd;
processor->idtr.length = sizeof(s_idtd) - 1;
- extern void idt_load(void* idtr);
- idt_load(&processor->idtr);
+ klogf("%X\n", s_idtd[0].type_flags);
+
+ __asm__ volatile("lidt %0":: "m"(processor->idtr));
+ __asm__ volatile("cli");
}