Files
jsix/src/kernel/interrupts.s
Justin C. Miller 24f324552a [kernel] Get rid of fake stack frame in isr_prelude
The isr_prelude (and its IRQ equivalent) had been pushing RIP and RBP in
order to create a fake stack frame. This was in an effor to make GDB
display tracebacks more reliably, but GDB has other reasons for being
finnicky about stack frames, so this was just wasted. This commit gets
rid of it to make looking at the stack clearer.
2022-03-13 17:54:27 -07:00

81 lines
1.5 KiB
ArmAsm

%include "push_all.inc"
section .text
extern isr_handler
global isr_handler_prelude:function (isr_handler_prelude.end - isr_handler_prelude)
isr_handler_prelude:
push rbp ; Never executed, fake function prelude
mov rbp, rsp ; to calm down gdb
.real:
push_all
check_swap_gs
mov rdi, rsp
call isr_handler
jmp isr_handler_return
.end:
extern irq_handler
global irq_handler_prelude:function (irq_handler_prelude.end - irq_handler_prelude)
irq_handler_prelude:
push rbp ; Never executed, fake function prelude
mov rbp, rsp ; to calm down gdb
.real:
push_all
check_swap_gs
mov rdi, rsp
mov rsi, rsp
call irq_handler
; fall through to isr_handler_return
.end:
global isr_handler_return:function (isr_handler_return.end - isr_handler_return)
isr_handler_return:
check_swap_gs
pop_all
add rsp, 16 ; because the ISRs added err/num
iretq
.end:
%macro EMIT_ISR 2
global %1:function (%1.end - %1)
%1:
push 0
push %2
jmp isr_handler_prelude.real
.end:
%endmacro
%macro EMIT_EISR 2
global %1:function (%1.end - %1)
%1:
push %2
jmp isr_handler_prelude.real
.end:
%endmacro
%macro EMIT_IRQ 2
global %1:function (%1.end - %1)
%1:
push 0
push %2
jmp irq_handler_prelude.real
.end:
%endmacro
%define EISR(i, s, name) EMIT_EISR name, i ; ISR with error code
%define ISR(i, s, name) EMIT_ISR name, i
%define IRQ(i, q, name) EMIT_IRQ name, i
%define NISR(i, s, name) ; We don't emit a handler for NMI
section .isrs
%include "interrupt_isrs.inc"