1*4aed0296SPaolo Bonzini // Copyright 2024, Linaro Limited 2*4aed0296SPaolo Bonzini // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org> 3*4aed0296SPaolo Bonzini // SPDX-License-Identifier: GPL-2.0-or-later 4*4aed0296SPaolo Bonzini 5*4aed0296SPaolo Bonzini //! Macro to register blocks of code that run as QEMU starts up. 6*4aed0296SPaolo Bonzini 7*4aed0296SPaolo Bonzini #[macro_export] 8*4aed0296SPaolo Bonzini macro_rules! module_init { 9*4aed0296SPaolo Bonzini ($type:ident => $body:block) => { 10*4aed0296SPaolo Bonzini const _: () = { 11*4aed0296SPaolo Bonzini #[used] 12*4aed0296SPaolo Bonzini #[cfg_attr( 13*4aed0296SPaolo Bonzini not(any(target_vendor = "apple", target_os = "windows")), 14*4aed0296SPaolo Bonzini link_section = ".init_array" 15*4aed0296SPaolo Bonzini )] 16*4aed0296SPaolo Bonzini #[cfg_attr(target_vendor = "apple", link_section = "__DATA,__mod_init_func")] 17*4aed0296SPaolo Bonzini #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")] 18*4aed0296SPaolo Bonzini pub static LOAD_MODULE: extern "C" fn() = { 19*4aed0296SPaolo Bonzini extern "C" fn init_fn() { 20*4aed0296SPaolo Bonzini $body 21*4aed0296SPaolo Bonzini } 22*4aed0296SPaolo Bonzini 23*4aed0296SPaolo Bonzini extern "C" fn ctor_fn() { 24*4aed0296SPaolo Bonzini unsafe { 25*4aed0296SPaolo Bonzini $crate::bindings::register_module_init( 26*4aed0296SPaolo Bonzini Some(init_fn), 27*4aed0296SPaolo Bonzini $crate::bindings::module_init_type::$type, 28*4aed0296SPaolo Bonzini ); 29*4aed0296SPaolo Bonzini } 30*4aed0296SPaolo Bonzini } 31*4aed0296SPaolo Bonzini 32*4aed0296SPaolo Bonzini ctor_fn 33*4aed0296SPaolo Bonzini }; 34*4aed0296SPaolo Bonzini }; 35*4aed0296SPaolo Bonzini }; 36*4aed0296SPaolo Bonzini 37*4aed0296SPaolo Bonzini // shortcut because it's quite common that $body needs unsafe {} 38*4aed0296SPaolo Bonzini ($type:ident => unsafe $body:block) => { 39*4aed0296SPaolo Bonzini $crate::module_init! { 40*4aed0296SPaolo Bonzini $type => { unsafe { $body } } 41*4aed0296SPaolo Bonzini } 42*4aed0296SPaolo Bonzini }; 43*4aed0296SPaolo Bonzini } 44