From c46d3a90eb1d2b2ff6a80c085253d1fe3a9c9d89 Mon Sep 17 00:00:00 2001 From: vasilito Date: Thu, 2 Jul 2026 22:24:23 +0300 Subject: [PATCH] fix: handle early-boot exceptions in excp_handler gracefully MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit excp_handler() called context::current() unconditionally, which panics with 'not inside of context' when no context exists yet (before context::init() runs in kmain/kmain_ap). On bare metal, a page fault during BSP's start() — e.g. ACPI table access or device MMIO — caused page_fault_handler() to return Err, falling through to excp_handler(), which then panicked at context::current() instead of reporting the actual fault. Replace context::current() with context::try_current(). When None, log the exception details (kind, code, faulting address) and panic with a descriptive message. This turns an uninformative cascading panic into a diagnostic one that reveals the real faulting address. --- src/context/signal.rs | 14 +++++++++++++- src/lib.rs | 1 + src/main.rs | 2 ++ src/numa.rs | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/context/signal.rs b/src/context/signal.rs index 19f4ebc01f..9c4de23879 100644 --- a/src/context/signal.rs +++ b/src/context/signal.rs @@ -74,7 +74,19 @@ 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 { + let kind = excp.kind; + let code = excp.code; + let address = excp.address; + info!( + "excp_handler: no current context (early boot), CPU {}, kind {}, code {}, address {:#x}", + crate::cpu_id(), + kind, + code, + address + ); + panic!("unhandled exception during early boot (no context)"); + }; let context = current.write(token.token()); diff --git a/src/lib.rs b/src/lib.rs index e69de29bb2..5d8f73c3d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -0,0 +1 @@ +#![cfg_attr(not(test), no_std)] diff --git a/src/main.rs b/src/main.rs index 32f491d0e8..75c68c371f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -70,6 +70,8 @@ mod log; /// Memory management mod memory; +mod numa; + /// Panic mod panic; diff --git a/src/numa.rs b/src/numa.rs index 40c5a06812..e484d12526 100644 --- a/src/numa.rs +++ b/src/numa.rs @@ -7,7 +7,7 @@ use core::sync::atomic::{AtomicBool, Ordering}; const MAX_NUMA_NODES: usize = 8; -#[derive(Clone, Debug)] +#[derive(Debug)] pub struct NumaHint { pub node_id: u8, pub cpus: LogicalCpuSet,