From a789a2d36560f64952dcfc25d330f1ac04206c14 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 13 Jul 2025 00:24:08 +0000 Subject: kernel: Avoid using kprintf() during panic Avoid using kprintf() during a system panic event as it relies on internal locking that may hang the system preventing diagnostics from being logged Signed-off-by: Ian Moffett --- sys/kern/kern_panic.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'sys/kern') diff --git a/sys/kern/kern_panic.c b/sys/kern/kern_panic.c index 2df4537..13b4964 100644 --- a/sys/kern/kern_panic.c +++ b/sys/kern/kern_panic.c @@ -34,6 +34,7 @@ #include #include #include +#include #if defined(__PANIC_SCR) #define PANIC_SCR __PANIC_SCR @@ -41,6 +42,15 @@ #define PANIC_SCR 0 #endif +static void +panic_puts(const char *str) +{ + size_t len; + + len = strlen(str); + cons_putstr(&g_root_scr, str, len); +} + /* * Burn and sizzle - the core logic that really ends * things ::) @@ -56,11 +66,11 @@ bas(bool do_trace, int reboot_type) spinlock_acquire(&lock); /* Never released */ if (do_trace) { - kprintf(OMIT_TIMESTAMP "** backtrace\n"); + panic_puts(" ** backtrace\n"); md_backtrace(); } - kprintf(OMIT_TIMESTAMP "\n-- ALL CORES HAVE BEEN HALTED --\n"); + panic_puts("\n-- ALL CORES HAVE BEEN HALTED --\n"); cpu_reboot(reboot_type); __builtin_unreachable(); } @@ -82,7 +92,8 @@ static void do_panic(const char *fmt, va_list *ap) { syslog_silence(false); - kprintf(OMIT_TIMESTAMP "panic: "); + spinlock_release(&g_root_scr.lock); + panic_puts("panic: "); vkprintf(fmt, ap); bas(true, REBOOT_HALT); -- cgit v1.2.3