diff options
author | Ian Moffett <ian@osmora.org> | 2025-07-13 00:24:08 +0000 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-07-13 00:24:08 +0000 |
commit | a789a2d36560f64952dcfc25d330f1ac04206c14 (patch) | |
tree | 516073a81cf273a4f8d0129e4d4706168abc71d1 /sys/kern/kern_panic.c | |
parent | 85ddd63bddfa20bedce3a387c69dcf66f882a8ea (diff) |
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 <ian@osmora.org>
Diffstat (limited to 'sys/kern/kern_panic.c')
-rw-r--r-- | sys/kern/kern_panic.c | 17 |
1 files changed, 14 insertions, 3 deletions
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 <dev/cons/cons.h> #include <machine/cdefs.h> #include <machine/cpu.h> +#include <string.h> #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); |