summaryrefslogtreecommitdiff
path: root/sys/kern/kern_panic.c
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-13 00:24:08 +0000
committerIan Moffett <ian@osmora.org>2025-07-13 00:24:08 +0000
commita789a2d36560f64952dcfc25d330f1ac04206c14 (patch)
tree516073a81cf273a4f8d0129e4d4706168abc71d1 /sys/kern/kern_panic.c
parent85ddd63bddfa20bedce3a387c69dcf66f882a8ea (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.c17
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);