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 63dc655416..f7baa67e66 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 e33cb220c5..4e66a6781b 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 ff01f38edf..518a9f2984 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); }