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.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/x86_64/idt.c b/arch/x86_64/idt.c
index 567dead..05dcf43 100644
--- a/arch/x86_64/idt.c
+++ b/arch/x86_64/idt.c
@@ -5,7 +5,7 @@
PAGEALIGN
static struct InterruptTrapGate s_idtd[48];
-static struct InterruptState *(*s_int_handlers[48])(struct Registers*);
+static struct Registers *(*s_int_handlers[48])(struct Registers*);
static struct XDTR s_idtr = {
.length = sizeof(s_idtd) - 1,
.address = (uintptr_t)&s_idtd
@@ -14,13 +14,19 @@ static struct XDTR s_idtr = {
uint64_t __isr_err;
uint64_t __isr_num;
+void
+int_set_handler(uint8_t code, struct Registers *(*handler)(struct Registers*))
+{
+ if(code >= 48) return;
+ s_int_handlers[code] = handler;
+}
+
struct Registers*
irq_handle(struct Registers *state)
{
if(__isr_num < 48) {
if(s_int_handlers[__isr_num] != NULL) {
- s_int_handlers[__isr_num](state);
- return state;
+ return s_int_handlers[__isr_num](state);
}
}
klogf("Interrupt %i\nerror code %#016X\n", __isr_num, __isr_err);
@@ -52,10 +58,9 @@ x86_64_load_idt(void)
for(int i = 0; i < 22; i++)
{
uintptr_t base = __isr_stubs[i];
- klogf("INT %2i : %#016X\n", i, base);
s_idtd[i] = (struct InterruptTrapGate){
.base_0_15 = (base & 0xFFFF),
- .segment_selector = 0x10,
+ .segment_selector = 0x8,
.ist = 0,
.zero_0 = 0,
.type = 0xE,
@@ -63,8 +68,10 @@ x86_64_load_idt(void)
.dpl = 0,
.p = 1,
.base_16_31 = (base >> 16) & 0xFFFF,
- .base_32_63 = (base >> 32) & 0xFFFFFFFF
+ .base_32_63 = (base >> 32) & 0xFFFFFFFF,
+ .resv = 0
};
+ klogf("INT %2i : %#016X (%016X)\n", i, base, s_idtd[i]);
}
x86_64_lidt(&s_idtr);
}