LoongArch exception and syscall entry code saves pt_regs on the kernel
stack before calling the C handlers. When a backtrace reaches one of
these entry symbols, crash needs to recover the saved pt_regs and
continue unwinding from the interrupted context.
Recognize the LoongArch entry symbols that leave a saved pt_regs at sp,
including syscall, exception, interrupt-vector and TLB page-fault paths
used by current upstream kernels and existing Loongnix variants. This
prevents backtraces from stopping at the first entry frame and allows
crash to print the saved pt_regs context without treating ordinary
handler call frames as exception frames.
Signed-off-by: Ming Wang <wangming01(a)loongson.cn>
---
loongarch64.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/loongarch64.c b/loongarch64.c
index 92481f3235b6..3ec184c908f8 100644
--- a/loongarch64.c
+++ b/loongarch64.c
@@ -707,7 +707,31 @@ loongarch64_is_exception_entry(struct syment *sym)
return STREQ(sym->name, "ret_from_exception") ||
STREQ(sym->name, "ret_from_irq") ||
STREQ(sym->name, "work_resched") ||
- STREQ(sym->name, "handle_sys");
+ STREQ(sym->name, "handle_sys") ||
+ STREQ(sym->name, "handle_syscall") ||
+ STREQ(sym->name, "handle_ade") ||
+ STREQ(sym->name, "handle_ale") ||
+ STREQ(sym->name, "handle_bce") ||
+ STREQ(sym->name, "handle_bp") ||
+ STREQ(sym->name, "handle_fpe") ||
+ STREQ(sym->name, "handle_fpu") ||
+ STREQ(sym->name, "handle_iasub") ||
+ STREQ(sym->name, "handle_ib") ||
+ STREQ(sym->name, "handle_int") ||
+ STREQ(sym->name, "handle_ipe") ||
+ STREQ(sym->name, "handle_lbt") ||
+ STREQ(sym->name, "handle_lsx") ||
+ STREQ(sym->name, "handle_mcheck") ||
+ STREQ(sym->name, "handle_oac") ||
+ STREQ(sym->name, "handle_parchk") ||
+ STREQ(sym->name, "handle_reserved") ||
+ STREQ(sym->name, "handle_ri") ||
+ STREQ(sym->name, "handle_tlb_protect") ||
+ STREQ(sym->name, "tlb_do_page_fault_0") ||
+ STREQ(sym->name, "tlb_do_page_fault_1") ||
+ STREQ(sym->name, "handle_vint") ||
+ STREQ(sym->name, "handle_watch") ||
+ STREQ(sym->name, "handle_lasx");
}
/*
--
2.43.0