sel4_microkit/
panicking.rs
1use core::panic::PanicInfo;
8
9use sel4_immediate_sync_once_cell::ImmediateSyncOnceCell;
10use sel4_panicking::set_hook as set_outer_hook;
11use sel4_panicking_env::debug_println;
12
13pub use sel4_panicking::{catch_unwind, PanicHook};
14
15use crate::pd_name;
16
17static PANIC_HOOK: ImmediateSyncOnceCell<PanicHook> = ImmediateSyncOnceCell::new();
18
19pub fn set_hook(hook: PanicHook) {
20 PANIC_HOOK.set(hook).unwrap_or_else(|_| panic!())
21}
22
23fn get_hook() -> &'static PanicHook {
24 const DEFAULT_HOOK: PanicHook = &default_hook;
25 PANIC_HOOK.get().unwrap_or(&DEFAULT_HOOK)
26}
27
28fn default_hook(info: &PanicInfo) {
29 debug_println!("{}: {}", pd_name().unwrap_or("?"), info);
30}
31
32fn outer_hook(info: &PanicInfo) {
33 (get_hook())(info)
34}
35
36pub(crate) fn init_panicking() {
37 set_outer_hook(&outer_hook)
38}