summaryrefslogtreecommitdiff
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
parentb2f41efabf95f85dd6d24e460cf15f8c9ac17978 (diff)
using one isr_stub for everything
-rw-r--r--kernel/include/x86_64_regs.S19
-rw-r--r--kernel/src/cpu/irq.c27
-rw-r--r--kernel/src/cpu/irq_stub.S22
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