From 3c4e11b917f0030daf0c65aa4a4c6b247d89c0c4 Mon Sep 17 00:00:00 2001 From: Nick Spinale Date: Wed, 17 Jan 2024 06:36:38 +0000 Subject: [PATCH] Add UnwindSafe bound to catch_unwind Signed-off-by: Nick Spinale --- .../support/sel4-simple-task/runtime/src/declare_main.rs | 3 ++- crates/private/support/sel4-simple-task/threading/src/lib.rs | 3 ++- crates/sel4-microkit/src/entry.rs | 4 +++- crates/sel4-panicking/src/lib.rs | 4 ++-- crates/sel4-root-task/src/lib.rs | 5 +++-- crates/sel4-test-harness/src/run_tests.rs | 3 ++- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/crates/private/support/sel4-simple-task/runtime/src/declare_main.rs b/crates/private/support/sel4-simple-task/runtime/src/declare_main.rs index 8362fd2b4..50d773ee5 100644 --- a/crates/private/support/sel4-simple-task/runtime/src/declare_main.rs +++ b/crates/private/support/sel4-simple-task/runtime/src/declare_main.rs @@ -5,6 +5,7 @@ // use core::fmt; +use core::panic::UnwindSafe; use serde::Deserialize; @@ -45,7 +46,7 @@ where } } -pub fn wrap(f: impl FnOnce()) { +pub fn wrap(f: impl FnOnce() + UnwindSafe) { let _ = catch_unwind(|| { f(); }); diff --git a/crates/private/support/sel4-simple-task/threading/src/lib.rs b/crates/private/support/sel4-simple-task/threading/src/lib.rs index 3f74041cd..d352eca7b 100644 --- a/crates/private/support/sel4-simple-task/threading/src/lib.rs +++ b/crates/private/support/sel4-simple-task/threading/src/lib.rs @@ -44,6 +44,7 @@ impl From for StaticThread { #[cfg(feature = "alloc")] mod when_alloc { use alloc::boxed::Box; + use core::panic::UnwindSafe; use sel4::Word; use sel4_panicking::catch_unwind; @@ -62,7 +63,7 @@ mod when_alloc { } extern "C" fn entry(f_arg: Word) { - let f = unsafe { Box::from_raw(f_arg as *mut Box) }; + let f = unsafe { Box::from_raw(f_arg as *mut Box) }; let _ = catch_unwind(f); } } diff --git a/crates/sel4-microkit/src/entry.rs b/crates/sel4-microkit/src/entry.rs index be166bb19..be3a235ba 100644 --- a/crates/sel4-microkit/src/entry.rs +++ b/crates/sel4-microkit/src/entry.rs @@ -4,6 +4,8 @@ // SPDX-License-Identifier: BSD-2-Clause // +use core::panic::UnwindSafe; + pub use sel4_panicking::catch_unwind; pub use sel4_panicking_env::abort; @@ -59,7 +61,7 @@ macro_rules! declare_init { } #[allow(clippy::missing_safety_doc)] -pub fn run_main(init: impl FnOnce() -> T) { +pub fn run_main(init: impl FnOnce() -> T + UnwindSafe) { let result = catch_unwind(|| match run_handler(init()) { Ok(absurdity) => match absurdity {}, Err(err) => err, diff --git a/crates/sel4-panicking/src/lib.rs b/crates/sel4-panicking/src/lib.rs index 57b156c45..247f1fae0 100644 --- a/crates/sel4-panicking/src/lib.rs +++ b/crates/sel4-panicking/src/lib.rs @@ -19,7 +19,7 @@ extern crate alloc; use core::fmt; use core::mem::ManuallyDrop; use core::panic::Location; -use core::panic::PanicInfo; +use core::panic::{PanicInfo, UnwindSafe}; use sel4_panicking_env::abort; @@ -108,7 +108,7 @@ fn do_panic(info: ExternalPanicInfo) -> ! { } } -pub fn catch_unwind R>(f: F) -> Result { +pub fn catch_unwind R + UnwindSafe>(f: F) -> Result { union Data { f: ManuallyDrop, r: ManuallyDrop, diff --git a/crates/sel4-root-task/src/lib.rs b/crates/sel4-root-task/src/lib.rs index 622fade34..247e27267 100644 --- a/crates/sel4-root-task/src/lib.rs +++ b/crates/sel4-root-task/src/lib.rs @@ -9,6 +9,7 @@ #![feature(never_type)] use core::fmt; +use core::panic::UnwindSafe; pub use sel4_panicking_env::{abort, debug_print, debug_println}; pub use sel4_root_task_macros::root_task; @@ -70,12 +71,12 @@ macro_rules! declare_main { #[doc(hidden)] #[allow(clippy::missing_safety_doc)] -pub fn run_main(f: impl Fn(&sel4::BootInfo) -> T, bootinfo: &sel4::BootInfo) +pub fn run_main(f: impl FnOnce(&sel4::BootInfo) -> T + UnwindSafe, bootinfo: &sel4::BootInfo) where T: Termination, T::Error: fmt::Debug, { - let result = panicking::catch_unwind(|| f(bootinfo).report()); + let result = panicking::catch_unwind(move || f(bootinfo).report()); match result { Ok(err) => abort!("main thread terminated with error: {err:?}"), Err(_) => abort!("uncaught panic in main thread"), diff --git a/crates/sel4-test-harness/src/run_tests.rs b/crates/sel4-test-harness/src/run_tests.rs index 57c291c94..e00029caa 100644 --- a/crates/sel4-test-harness/src/run_tests.rs +++ b/crates/sel4-test-harness/src/run_tests.rs @@ -6,6 +6,7 @@ use alloc::string::String; use core::fmt; +use core::panic::AssertUnwindSafe; use sel4_panicking::catch_unwind; use sel4_panicking_env::{debug_print, debug_println}; @@ -111,7 +112,7 @@ impl fmt::Display for TestResult { } fn wrap_run(should_panic: ShouldPanic, f: impl FnOnce() -> Result<(), String>) -> TestResult { - match catch_unwind(f) { + match catch_unwind(AssertUnwindSafe(f)) { Err(_) => TestResult::from(should_panic.should_panic()), Ok(Ok(())) => TestResult::from(!should_panic.should_panic()), Ok(Err(msg)) => {