sel4_microkit/
entry.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7use core::panic::UnwindSafe;
8
9use sel4_microkit_base::ipc_buffer_ptr;
10use sel4_panicking::catch_unwind;
11use sel4_panicking_env::abort;
12
13use crate::{panicking::init_panicking, Handler};
14
15sel4_runtime_common::declare_entrypoint! {
16    () -> ! {
17        init_panicking();
18
19        let ipc_buffer = unsafe { ipc_buffer_ptr().as_mut().unwrap() };
20        sel4::set_ipc_buffer(ipc_buffer);
21
22        unsafe {
23            __sel4_microkit__main();
24        }
25    }
26}
27
28extern "C" {
29    fn __sel4_microkit__main() -> !;
30}
31
32#[doc(hidden)]
33#[macro_export]
34macro_rules! declare_init {
35    ($init:expr) => {
36        #[allow(non_snake_case)]
37        #[no_mangle]
38        fn __sel4_microkit__main() -> ! {
39            $crate::_private::run_main($init);
40        }
41    };
42}
43
44#[doc(hidden)]
45#[allow(clippy::missing_safety_doc)]
46pub fn run_main<T: Handler>(init: impl FnOnce() -> T + UnwindSafe) -> ! {
47    let result = catch_unwind(|| match init().run() {
48        #[allow(unreachable_patterns)]
49        Ok(absurdity) => match absurdity {},
50        Err(err) => err,
51    });
52    match result {
53        Ok(err) => abort!("main thread terminated with error: {err}"),
54        Err(_) => abort!("main thread panicked"),
55    }
56}