use core::panic::PanicInfo;
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
match axpanic::enter_panic(current_cpu_id()) {
axpanic::PanicDisposition::Primary => panic_primary(info),
axpanic::PanicDisposition::Recursive | axpanic::PanicDisposition::Concurrent => {
halt_current_cpu()
}
}
}
fn panic_primary(info: &PanicInfo) -> ! {
let _oops_guard = axpanic::enter_oops();
panic_message(info);
panic_backtrace();
panic_shutdown()
}
fn panic_message(info: &PanicInfo) {
ax_println!("{}", info);
}
fn panic_backtrace() {
if should_print_panic_backtrace() {
ax_println!("{}", axbacktrace::Backtrace::capture());
}
}
fn should_print_panic_backtrace() -> bool {
axpanic::should_emit_panic_backtrace()
}
fn panic_shutdown() -> ! {
ax_hal::power::system_off()
}
fn halt_current_cpu() -> ! {
loop {
ax_hal::asm::halt();
core::hint::spin_loop();
}
}
fn current_cpu_id() -> usize {
#[cfg(feature = "smp")]
{
ax_hal::percpu::this_cpu_id()
}
#[cfg(not(feature = "smp"))]
{
0
}
}