From f46ab8ca2050ee77edf6e6b979875426bdaf29dc Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 13 Mar 2024 09:58:22 -0400 Subject: fix incorrect tss rsp assignment --- arch/x86_64/idt.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'arch/x86_64/idt.c') 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); } -- cgit v1.2.1