mirror of
https://github.com/justinian/jsix.git
synced 2025-12-10 00:14:32 -08:00
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.
81 lines
1.5 KiB
ArmAsm
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"
|