From 54569fb001ac19af3471c3bfb2f900ee8e73a7bd Mon Sep 17 00:00:00 2001 From: Alexey Gerenkov Date: Thu, 27 Jan 2022 00:39:52 +0300 Subject: [PATCH] riscv: Fixes GDB backtrace of interrupted threads Save missed SP value on stack --- components/riscv/vectors.S | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/components/riscv/vectors.S b/components/riscv/vectors.S index f7169a73d6..b046dfee1b 100644 --- a/components/riscv/vectors.S +++ b/components/riscv/vectors.S @@ -201,6 +201,17 @@ _interrupt_handler: save_general_regs save_mepc + /* Though it is not necessary we save GP and SP here. + * SP is necessary to help GDB to properly unwind + * the backtrace of threads preempted by interrupts (OS tick etc.). + * GP is saved just to have its proper value in GDB. */ + /* As gp register is not saved by the macro, save it here */ + sw gp, RV_STK_GP(sp) + /* Same goes for the SP value before trapping */ + addi t0, sp, CONTEXT_SIZE /* restore sp with the value when interrupt happened */ + /* Save SP */ + sw t0, RV_STK_SP(sp) + /* Before doing anythig preserve the stack pointer */ /* It will be saved in current TCB, if needed */ mv a0, sp