diff --git a/kernel/arch/i386/boot.S b/kernel/arch/i386/boot.S index 501647d35..efe1c65f8 100644 --- a/kernel/arch/i386/boot.S +++ b/kernel/arch/i386/boot.S @@ -117,6 +117,7 @@ _start: call _init # call to the kernel itself + xorl %ebp, %ebp call kernel_main system_halt: diff --git a/kernel/include/kernel/Panic.h b/kernel/include/kernel/Panic.h index 434e964e7..402b07db2 100644 --- a/kernel/include/kernel/Panic.h +++ b/kernel/include/kernel/Panic.h @@ -9,12 +9,31 @@ namespace Kernel { + static void dump_stacktrace() + { + struct stackframe + { + stackframe* ebp; + uint32_t eip; + }; + + stackframe* frame; + asm volatile("movl %%ebp, %0" : "=r"(frame)); + BAN::Formatter::println(Serial::serial_putc, "\e[36mStack trace:"); + while (frame) + { + BAN::Formatter::println(Serial::serial_putc, " 0x{8H}", frame->eip); + frame = frame->ebp; + } + } + template __attribute__((__noreturn__)) static void PanicImpl(const char* file, int line, const char* message, Args... args) { derrorln("Kernel panic at {}:{}", file, line); derrorln(message, args...); + dump_stacktrace(); if (TTY::IsInitialized()) { kprint("\e[31mKernel panic at {}:{}\n", file, line);