sel4_microkit/
entry.rs
1use 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}