From 40eecaecc552945f72a2b90f4122bf929960671c Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Sun, 26 Feb 2023 06:54:25 +0100 Subject: using one isr_stub for everything --- kernel/src/cpu/irq.c | 27 ++++++++++++++++++--------- kernel/src/cpu/irq_stub.S | 22 +++++++++------------- 2 files changed, 27 insertions(+), 22 deletions(-) (limited to 'kernel/src') diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index 5eadd39..a7288c0 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -47,10 +47,9 @@ const char *const exception_name[] = { "Reserved", }; -void isr_def_handler(uint64_t number, uint64_t error) -{ +void exception(uint64_t number, uint64_t error) { switch (number) { - case 14: + case 0xe: printf("%s, error: 0x%x\n", exception_name[14], error); page_fault(error); break; @@ -62,9 +61,9 @@ void isr_def_handler(uint64_t number, uint64_t error) void eoi(uint64_t number) { if (PIT) { - if (number < 8) { + if (number < 0x28) { outb(PIC1_COMMAND, PIC_EOI); - } else if (number < 16) { + } else if (number < 0x30) { outb(PIC1_COMMAND, PIC_EOI); outb(PIC2_COMMAND, PIC_EOI); } @@ -73,18 +72,28 @@ void eoi(uint64_t number) } } -void irq_def_handler(uint64_t number) +void interrupt(uint64_t number) { switch (number) { - case 0: + case 0x20: timer_handler(); + eoi(number); break; - case 1: + case 0x21: keyboard_handler(); + eoi(number); break; default: printf("spurious interrupt\n"); break; } - eoi(number); +} + +void isr_def_handler(uint64_t number, uint64_t error) +{ + if (number < 0x20) { + exception(number, error); + } else { + interrupt(number); + } } diff --git a/kernel/src/cpu/irq_stub.S b/kernel/src/cpu/irq_stub.S index 33d87e1..a80b721 100644 --- a/kernel/src/cpu/irq_stub.S +++ b/kernel/src/cpu/irq_stub.S @@ -2,13 +2,16 @@ #include "x86_64_regs.S" -.macro isrstub +.macro isrstub number push_caller_saved + push_callee_saved /* get error code from stack */ - mov 0x50(%rsp), %rsi + mov ERROR_OFF(%rsp), %rsi mov %rsp, panic_rsp + mov $\number, %rdi cld call isr_def_handler + pop_callee_saved pop_caller_saved add $8, %rsp iretq @@ -18,27 +21,20 @@ .global isr\number isr\number: push $0 - mov $\number, %rdi - isrstub + isrstub \number .endm .macro isr_error number .global isr\number isr\number: - mov $\number, %rdi - isrstub + isrstub \number .endm .macro irq number .global irq\number irq\number: - push_caller_saved - mov $\number, %rdi - mov %rsp, panic_rsp - cld - call irq_def_handler - pop_caller_saved - iretq + push $0 + isrstub (\number + 0x20) .endm isr_no_error 0 -- cgit v1.2.3