From aba82564f543f419fe33647f537218a0e40d4865 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 16 Apr 2023 00:04:49 +0300 Subject: [PATCH] Kernel: Panic wont print stacktrace if it has already paniced This prevents stack trace dump to panic and loop --- kernel/CMakeLists.txt | 1 + kernel/include/kernel/Panic.h | 25 ++++++++++++++----------- kernel/kernel/Panic.cpp | 6 ++++++ 3 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 kernel/kernel/Panic.cpp diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 9c88bc1d6..7e25c039e 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -27,6 +27,7 @@ set(KERNEL_SOURCES kernel/kernel.cpp kernel/Memory/Heap.cpp kernel/Memory/kmalloc.cpp + kernel/Panic.cpp kernel/PCI.cpp kernel/PIC.cpp kernel/PIT.cpp diff --git a/kernel/include/kernel/Panic.h b/kernel/include/kernel/Panic.h index 75e15b8d8..74d82ecae 100644 --- a/kernel/include/kernel/Panic.h +++ b/kernel/include/kernel/Panic.h @@ -4,23 +4,26 @@ #define panic(...) detail::panic_impl(__FILE__, __LINE__, __VA_ARGS__) -namespace Kernel +namespace Kernel::detail { - namespace detail + extern bool g_paniced; + + template + __attribute__((__noreturn__)) + static void panic_impl(const char* file, int line, const char* message, Args... args) { - template - __attribute__((__noreturn__)) - static void panic_impl(const char* file, int line, const char* message, Args... args) + asm volatile("cli"); + derrorln("Kernel panic at {}:{}", file, line); + derrorln(message, args...); + if (!g_paniced) { - asm volatile("cli"); - derrorln("Kernel panic at {}:{}", file, line); - derrorln(message, args...); + g_paniced = true; Debug::dump_stack_trace(); - for (;;) - asm volatile("hlt"); - __builtin_unreachable(); } + for (;;) + asm volatile("hlt"); + __builtin_unreachable(); } } \ No newline at end of file diff --git a/kernel/kernel/Panic.cpp b/kernel/kernel/Panic.cpp new file mode 100644 index 000000000..1c0ad8a7a --- /dev/null +++ b/kernel/kernel/Panic.cpp @@ -0,0 +1,6 @@ +#include + +namespace Kernel::detail +{ + bool g_paniced = false; +}