xref: /qemu/rust/qemu-api/src/module.rs (revision e3a207722b783675b362db4ae22a449f42a26b24)
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