diff --git a/src/runtime/src/kernel/core1.rs b/src/runtime/src/kernel/core1.rs index e1b7884..41f18f0 100644 --- a/src/runtime/src/kernel/core1.rs +++ b/src/runtime/src/kernel/core1.rs @@ -189,5 +189,7 @@ pub fn terminate(exception: &'static eh_artiq::Exception<'static>, backtrace: &' let core1_tx: &mut sync_channel::Sender = unsafe { mem::transmute(KERNEL_CHANNEL_1TO0) }; core1_tx.send(Message::KernelException(exception, &backtrace[..cursor])); + // TODO: remove after implementing graceful kernel termination. + error!("Core1 uncaught exception"); loop {} } diff --git a/src/runtime/src/panic.rs b/src/runtime/src/panic.rs index ab9b8d2..a972be1 100644 --- a/src/runtime/src/panic.rs +++ b/src/runtime/src/panic.rs @@ -1,8 +1,21 @@ use libboard_zynq::{print, println}; +use libregister::RegisterR; +use libcortex_a9::regs::MPIDR; use unwind::backtrace; +static mut PANICKED: [bool; 2] = [false; 2]; + #[panic_handler] fn panic(info: &core::panic::PanicInfo) -> ! { + let id = MPIDR.read().cpu_id() as usize; + print!("Core {} ", id); + unsafe { + if PANICKED[id] { + println!("nested panic!"); + loop {} + } + PANICKED[id] = true; + } print!("panic at "); if let Some(location) = info.location() { print!("{}:{}:{}", location.file(), location.line(), location.column());