From c46bf5f48a3f08e245568de5e6fca18219d9b620 Mon Sep 17 00:00:00 2001 From: Nick Spinale Date: Wed, 24 Jan 2024 11:00:29 +0000 Subject: [PATCH] Add support for .init_array --- .../sel4-simple-task/runtime/src/lib.rs | 1 + crates/sel4-microkit/src/entry.rs | 1 + crates/sel4-root-task/src/lib.rs | 1 + crates/sel4-runtime-common/src/ctors.rs | 40 +++++++++++++++++++ crates/sel4-runtime-common/src/lib.rs | 4 ++ 5 files changed, 47 insertions(+) create mode 100644 crates/sel4-runtime-common/src/ctors.rs diff --git a/crates/private/support/sel4-simple-task/runtime/src/lib.rs b/crates/private/support/sel4-simple-task/runtime/src/lib.rs index e893590c0..c34b3e9b4 100644 --- a/crates/private/support/sel4-simple-task/runtime/src/lib.rs +++ b/crates/private/support/sel4-simple-task/runtime/src/lib.rs @@ -79,6 +79,7 @@ pub unsafe extern "C" fn cont_fn(cont_arg: *mut sel4_runtime_common::ContArg) -> CONFIG.set(config.clone()).unwrap(); sel4_runtime_common::set_eh_frame_finder().unwrap(); sel4_panicking::set_hook(&panic_hook); + sel4_runtime_common::run_ctors(); __sel4_simple_task_main(config.arg()); } else { let endpoint = Endpoint::from_bits(thread_config.endpoint().unwrap()); diff --git a/crates/sel4-microkit/src/entry.rs b/crates/sel4-microkit/src/entry.rs index be3a235ba..4ba7882cf 100644 --- a/crates/sel4-microkit/src/entry.rs +++ b/crates/sel4-microkit/src/entry.rs @@ -39,6 +39,7 @@ fn inner_entry() -> ! { unsafe { sel4::set_ipc_buffer(get_ipc_buffer()); + sel4_runtime_common::run_ctors(); __sel4_microkit__main(); } diff --git a/crates/sel4-root-task/src/lib.rs b/crates/sel4-root-task/src/lib.rs index 073fe474d..4138dd4d5 100644 --- a/crates/sel4-root-task/src/lib.rs +++ b/crates/sel4-root-task/src/lib.rs @@ -48,6 +48,7 @@ fn inner_entry(bootinfo: *const sel4::sys::seL4_BootInfo) -> ! { unsafe { let bootinfo = sel4::BootInfo::from_ptr(bootinfo); sel4::set_ipc_buffer(bootinfo.ipc_buffer()); + sel4_runtime_common::run_ctors(); __sel4_root_task__main(&bootinfo); } diff --git a/crates/sel4-runtime-common/src/ctors.rs b/crates/sel4-runtime-common/src/ctors.rs new file mode 100644 index 000000000..fd88ef0fb --- /dev/null +++ b/crates/sel4-runtime-common/src/ctors.rs @@ -0,0 +1,40 @@ +// +// Copyright 2024, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +use core::mem; +use core::ptr; +use core::slice; + +use sel4_panicking_env::abort; + +type Ctor = unsafe extern "C" fn(); + +extern "C" { + static __init_array_start: Ctor; + static __init_array_end: Ctor; +} + +pub unsafe fn run_ctors() { + let start = ptr::addr_of!(__init_array_start); + let end = ptr::addr_of!(__init_array_end); + + // Cast to usize for comparison, otherwise rustc seems to apply an erroneous optimization + // assuming __init_array_start != __init_array_end. + if start as usize != end as usize { + if start.align_offset(mem::size_of::()) != 0 + || end.align_offset(mem::size_of::()) != 0 + { + // sel4_panicking_env::debug_println!("{:#x?} {:#x?}", start, end); + abort!("'.init_array' section is not properly aligned"); + } + + let len = (end as usize - start as usize) / mem::size_of::(); + let ctors = slice::from_raw_parts(start, len); + for ctor in ctors { + (ctor)(); + } + } +} diff --git a/crates/sel4-runtime-common/src/lib.rs b/crates/sel4-runtime-common/src/lib.rs index 66b055c94..634ddf685 100644 --- a/crates/sel4-runtime-common/src/lib.rs +++ b/crates/sel4-runtime-common/src/lib.rs @@ -7,6 +7,10 @@ #![no_std] #![feature(cfg_target_thread_local)] +mod ctors; + +pub use ctors::run_ctors; + #[cfg(feature = "start")] mod start;