From b9a4530e542874486f74f4f91933fd0c2cab2dec Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 16 Jan 2023 21:50:50 +0200 Subject: [PATCH] Kernel: Kernel::Panic now dumps stacktrace to com1 --- kernel/arch/i386/boot.S | 1 + kernel/include/kernel/Panic.h | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/kernel/arch/i386/boot.S b/kernel/arch/i386/boot.S index 501647d3..efe1c65f 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 434e964e..402b07db 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);