From 5d62fa3f1038757d9de0742aa42165d45dc3a390 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 16 Jan 2026 16:31:35 +0200 Subject: [PATCH] Kernel: Clenup stacktrace printing on exception Start from current ip and bp. This removes kernel call stack to debug printing function from the stack trace --- kernel/include/kernel/Debug.h | 1 + kernel/kernel/Debug.cpp | 23 ++++++++++++++--------- kernel/kernel/IDT.cpp | 6 +++++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/kernel/include/kernel/Debug.h b/kernel/include/kernel/Debug.h index b0545d39..c81d773f 100644 --- a/kernel/include/kernel/Debug.h +++ b/kernel/include/kernel/Debug.h @@ -76,6 +76,7 @@ namespace Debug { void dump_stack_trace(); + void dump_stack_trace(uintptr_t ip, uintptr_t bp); void dump_qr_code(); void putchar(char); diff --git a/kernel/kernel/Debug.cpp b/kernel/kernel/Debug.cpp index f2bc233b..95b9e741 100644 --- a/kernel/kernel/Debug.cpp +++ b/kernel/kernel/Debug.cpp @@ -29,28 +29,33 @@ namespace Debug static uint8_t s_debug_ansi_state { 0 }; void dump_stack_trace() + { + dump_stack_trace(0, reinterpret_cast(__builtin_frame_address(0))); + } + + void dump_stack_trace(uintptr_t ip, uintptr_t bp) { using namespace Kernel; struct stackframe { stackframe* bp; - uintptr_t ip; + void* ip; }; SpinLockGuard _(s_debug_lock); - stackframe* frame = (stackframe*)__builtin_frame_address(0); - if (!frame) - { - dprintln("Could not get frame address"); - return; - } - uintptr_t first_ip = frame->ip; - uintptr_t last_ip = 0; + const stackframe* frame = reinterpret_cast(bp); + + void* first_ip = frame->ip; + void* last_ip = 0; bool first = true; BAN::Formatter::print(Debug::putchar, "\e[36mStack trace:\r\n"); + + if (ip != 0) + BAN::Formatter::print(Debug::putchar, " {}\r\n", reinterpret_cast(ip)); + while (frame) { if (!PageTable::is_valid_pointer((vaddr_t)frame)) diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index 2350d5ba..3ea48954 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -277,7 +277,11 @@ namespace Kernel #endif if (isr == ISR::PageFault) PageTable::current().debug_dump(); - Debug::dump_stack_trace(); +#if ARCH(x86_64) + Debug::dump_stack_trace(interrupt_stack->ip, regs->rbp); +#elif ARCH(i686) + Debug::dump_stack_trace(interrupt_stack->ip, regs->ebp); +#endif Debug::s_debug_lock.unlock(InterruptState::Disabled);