diff options
| author | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-02-26 06:54:25 +0100 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksa@vuckovic.cc> | 2023-02-26 06:54:25 +0100 |
| commit | 40eecaecc552945f72a2b90f4122bf929960671c (patch) | |
| tree | f8b500c024eda02672bb66ccde7a6124a2abfa40 | |
| parent | b2f41efabf95f85dd6d24e460cf15f8c9ac17978 (diff) | |
using one isr_stub for everything
| -rw-r--r-- | kernel/include/x86_64_regs.S | 19 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 27 | ||||
| -rw-r--r-- | kernel/src/cpu/irq_stub.S | 22 |
3 files changed, 40 insertions, 28 deletions
diff --git a/kernel/include/x86_64_regs.S b/kernel/include/x86_64_regs.S index 7b72d76..4b20539 100644 --- a/kernel/include/x86_64_regs.S +++ b/kernel/include/x86_64_regs.S @@ -8,6 +8,13 @@ * else use push/pop_callee_saved with push/pop_caller_saved */ +.set ERROR_OFF, 0x80 +.set RIP_OFF, 0x88 +.set CS_OFF, 0x90 +.set RFLAGS_OFF, 0x98 +.set RSP_OFF, 0x100 +.set SS_OFF, 0x108 + /* push 0x30 bytes to stack */ .macro push_callee_saved push %rbx @@ -20,12 +27,12 @@ /* pop 0x30 bytes from stack */ .macro pop_callee_saved - push %rbx - push %rbp - push %r12 - push %r13 - push %r14 - push %r15 + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %rbp + pop %rbx .endm /* push 0x50 bytes to stack */ 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 |
