diff --git a/src/context/signal.rs b/src/context/signal.rs index 19f4ebc01f..a472bb69bd 100644 --- a/src/context/signal.rs +++ b/src/context/signal.rs @@ -74,7 +74,21 @@ pub fn signal_handler(token: &mut CleanLockToken) { pub fn excp_handler(excp: syscall::Exception) { let mut token = unsafe { CleanLockToken::new() }; - let current = context::current(); + let Some(current) = context::try_current() else { + // No context exists — this happens during early boot (before + // context::init() in kmain) or very early in AP startup. The + // exception details (page fault address, stack trace, etc.) have + // already been printed by the caller in the exception handler. + // There is no userspace context to deliver a signal to, so halt. + info!( + "excp_handler: no current context (early boot), CPU {}, kind {}, code {}, address {:#x}", + crate::cpu_id(), + excp.kind, + excp.code, + excp.address + ); + panic!("unhandled exception during early boot (no context)"); + }; let context = current.write(token.token());