From ad5e8bbb4fb827d4710cbe90c77511eee22b5d28 Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Wed, 21 Sep 2022 14:33:39 +0200 Subject: [PATCH] Kernel: Add ability to dump backtrace from provided frame pointer When an exception happens it is sometimes hard to figure out where exactly the exception happened, so use the frame pointer of the trap frame to print a backtrace. --- Kernel/Arch/aarch64/init.cpp | 2 ++ Kernel/KSyms.cpp | 5 +++++ Kernel/KSyms.h | 1 + 3 files changed, 8 insertions(+) diff --git a/Kernel/Arch/aarch64/init.cpp b/Kernel/Arch/aarch64/init.cpp index 63dc6554165..f7baa67e66d 100644 --- a/Kernel/Arch/aarch64/init.cpp +++ b/Kernel/Arch/aarch64/init.cpp @@ -49,6 +49,8 @@ extern "C" void exception_common(Kernel::TrapFrame const* const trap_frame) auto esr_el1 = Kernel::Aarch64::ESR_EL1::read(); dbgln("esr_el1: EC({:#b}) IL({:#b}) ISS({:#b}) ISS2({:#b})", esr_el1.EC, esr_el1.IL, esr_el1.ISS, esr_el1.ISS2); + + dump_backtrace_from_base_pointer(trap_frame->x[29]); } Kernel::Processor::halt(); diff --git a/Kernel/KSyms.cpp b/Kernel/KSyms.cpp index e33cb220c55..4e66a6781b3 100644 --- a/Kernel/KSyms.cpp +++ b/Kernel/KSyms.cpp @@ -161,6 +161,11 @@ NEVER_INLINE static void dump_backtrace_impl(FlatPtr base_pointer, bool use_ksym } } +void dump_backtrace_from_base_pointer(FlatPtr base_pointer) +{ + dump_backtrace_impl(base_pointer, g_kernel_symbols_available, PrintToScreen::Yes); +} + void dump_backtrace(PrintToScreen print_to_screen) { static bool in_dump_backtrace = false; diff --git a/Kernel/KSyms.h b/Kernel/KSyms.h index ff01f38edfb..518a9f2984e 100644 --- a/Kernel/KSyms.h +++ b/Kernel/KSyms.h @@ -29,5 +29,6 @@ extern FlatPtr g_lowest_kernel_symbol_address; extern FlatPtr g_highest_kernel_symbol_address; void dump_backtrace(PrintToScreen print_to_screen = PrintToScreen::No); +void dump_backtrace_from_base_pointer(FlatPtr base_pointer); }