diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2024-10-29 14:15:27 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2024-12-19 19:36:37 +0100 |
commit | 4aed0296b307b6e2e3b7d38ee6c5204cf2dfe1ca (patch) | |
tree | b71d0ba5edc20818a6816b6e7530649a3763443f /rust/qemu-api/src/module.rs | |
parent | cb36da9bd84076470f36da56542e85a2436e3d95 (diff) | |
download | qemu-4aed0296b307b6e2e3b7d38ee6c5204cf2dfe1ca.zip qemu-4aed0296b307b6e2e3b7d38ee6c5204cf2dfe1ca.tar.gz qemu-4aed0296b307b6e2e3b7d38ee6c5204cf2dfe1ca.tar.bz2 |
rust: rename qemu-api modules to follow C code a bit more
A full match would mean calling them qom::object and hw::core::qdev. For now,
keep the names shorter but still a bit easier to find.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'rust/qemu-api/src/module.rs')
-rw-r--r-- | rust/qemu-api/src/module.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/rust/qemu-api/src/module.rs b/rust/qemu-api/src/module.rs new file mode 100644 index 0000000..fa5cea3 --- /dev/null +++ b/rust/qemu-api/src/module.rs @@ -0,0 +1,43 @@ +// Copyright 2024, Linaro Limited +// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org> +// SPDX-License-Identifier: GPL-2.0-or-later + +//! Macro to register blocks of code that run as QEMU starts up. + +#[macro_export] +macro_rules! module_init { + ($type:ident => $body:block) => { + const _: () = { + #[used] + #[cfg_attr( + not(any(target_vendor = "apple", target_os = "windows")), + link_section = ".init_array" + )] + #[cfg_attr(target_vendor = "apple", link_section = "__DATA,__mod_init_func")] + #[cfg_attr(target_os = "windows", link_section = ".CRT$XCU")] + pub static LOAD_MODULE: extern "C" fn() = { + extern "C" fn init_fn() { + $body + } + + extern "C" fn ctor_fn() { + unsafe { + $crate::bindings::register_module_init( + Some(init_fn), + $crate::bindings::module_init_type::$type, + ); + } + } + + ctor_fn + }; + }; + }; + + // shortcut because it's quite common that $body needs unsafe {} + ($type:ident => unsafe $body:block) => { + $crate::module_init! { + $type => { unsafe { $body } } + } + }; +} |