sel4_microkit/
panicking.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use 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}