summaryrefslogtreecommitdiff
path: root/kernel/src/cpu
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 06:54:25 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-26 06:54:25 +0100
commit40eecaecc552945f72a2b90f4122bf929960671c (patch)
treef8b500c024eda02672bb66ccde7a6124a2abfa40 /kernel/src/cpu
parentb2f41efabf95f85dd6d24e460cf15f8c9ac17978 (diff)
using one isr_stub for everything
Diffstat (limited to 'kernel/src/cpu')
-rw-r--r--kernel/src/cpu/irq.c27
-rw-r--r--kernel/src/cpu/irq_stub.S22
2 files changed, 27 insertions, 22 deletions
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