From 70d6094f46dac1846d4ba9d892097e0a8ce4d34c Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 10 Feb 2021 01:10:26 -0800 Subject: [PATCH] [kernel] Add fake preludes to isr handler to trick GDB By adding more debug information to the symbols and adding function frame preludes to the isr handler assembly functions, GDB sees them as valid locations for stack frames, and can display backtraces through interrupts. --- src/kernel/interrupts.s | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/kernel/interrupts.s b/src/kernel/interrupts.s index 7be0de9..e867529 100644 --- a/src/kernel/interrupts.s +++ b/src/kernel/interrupts.s @@ -1,8 +1,14 @@ %include "push_all.inc" +section .text + extern isr_handler -global isr_handler_prelude +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 @@ -10,10 +16,15 @@ isr_handler_prelude: mov rsi, rsp call isr_handler jmp isr_handler_return +.end: extern irq_handler -global irq_handler_prelude +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 @@ -21,36 +32,41 @@ irq_handler_prelude: mov rsi, rsp call irq_handler ; fall through to isr_handler_return +.end: -global isr_handler_return +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 + global %1:function (%1.end - %1) %1: push 0 push %2 - jmp isr_handler_prelude + jmp isr_handler_prelude.real + .end: %endmacro %macro EMIT_EISR 2 - global %1 + global %1:function (%1.end - %1) %1: push %2 - jmp isr_handler_prelude + jmp isr_handler_prelude.real + .end: %endmacro %macro EMIT_IRQ 2 - global %1 + global %1:function (%1.end - %1) %1: push 0 push %2 - jmp irq_handler_prelude + jmp irq_handler_prelude.real + .end: %endmacro %define EISR(i, s, name) EMIT_EISR name, i ; ISR with error code