From 1726d10554075001394a443faca7dbd1fbf1dce3 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Mon, 21 May 2018 22:57:43 -0700 Subject: [PATCH] Unify syscall/interrupt handling of rsp --- src/kernel/interrupts.cpp | 20 ++++++++------------ src/kernel/interrupts.s | 4 ++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 38032e2..b6c267c 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -11,8 +11,8 @@ extern "C" { addr_t isr_handler(addr_t, cpu_state); - void irq_handler(cpu_state); - void syscall_handler(cpu_state); + addr_t irq_handler(addr_t, cpu_state); + addr_t syscall_handler(addr_t, cpu_state); #define ISR(i, name) extern void name (); #define EISR(i, name) extern void name (); @@ -138,11 +138,6 @@ isr_handler(addr_t return_rsp, cpu_state regs) case isr::isrIgnore5: case isr::isrIgnore6: case isr::isrIgnore7: - - /* - cons->printf("\nIGNORED PIC INTERRUPT %d\n", - (regs.interrupt % 0xff) - 0xf0); - */ break; case isr::isrGPFault: { @@ -288,8 +283,8 @@ isr_handler(addr_t return_rsp, cpu_state regs) return return_rsp; } -void -irq_handler(cpu_state regs) +addr_t +irq_handler(addr_t return_rsp, cpu_state regs) { console *cons = console::get(); uint8_t irq = get_irq(regs.interrupt); @@ -318,10 +313,11 @@ irq_handler(cpu_state regs) } *reinterpret_cast(0xffffff80fee000b0) = 0; + return return_rsp; } -void -syscall_handler(cpu_state regs) +addr_t +syscall_handler(addr_t return_rsp, cpu_state regs) { console *cons = console::get(); cons->printf("SYSCALL\n"); @@ -351,5 +347,5 @@ syscall_handler(cpu_state regs) cons->puts("\n"); print_reg("rip", regs.rip); - + return return_rsp; } diff --git a/src/kernel/interrupts.s b/src/kernel/interrupts.s index 3fd68ec..2eb7fed 100644 --- a/src/kernel/interrupts.s +++ b/src/kernel/interrupts.s @@ -100,7 +100,9 @@ global irq_handler_prelude irq_handler_prelude: push_all_and_segments + mov rdi, rsp call irq_handler + mov rsp, rax pop_all_and_segments @@ -152,7 +154,9 @@ syscall_handler_prelude: push 0 ; bogus errorcode push_all_and_segments + mov rdi, rsp call syscall_handler + mov rsp, rax pop_all_and_segments add rsp, 16 ; ignore bogus interrupt / error