rust: re-export qemu macros from common/qom/hwcore

This is just a bit nicer.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Link: https://lore.kernel.org/r/20250827104147.717203-22-marcandre.lureau@redhat.com
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Marc-André Lureau 2025-09-08 12:50:02 +02:00 committed by Paolo Bonzini
parent b0f6bf8a5b
commit e4444d71e8
34 changed files with 35 additions and 45 deletions

View file

@ -278,7 +278,7 @@ a raw pointer, for use in calls to C functions. It can be used for
example as follows:: example as follows::
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_api_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct Object(Opaque<bindings::Object>); pub struct Object(Opaque<bindings::Object>);
where the special ``derive`` macro provides useful methods such as where the special ``derive`` macro provides useful methods such as

8
rust/Cargo.lock generated
View file

@ -58,7 +58,6 @@ dependencies = [
"bql", "bql",
"common", "common",
"migration", "migration",
"qemu_macros",
"qom", "qom",
"util", "util",
] ]
@ -68,6 +67,7 @@ name = "common"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"libc", "libc",
"qemu_macros",
] ]
[[package]] [[package]]
@ -93,7 +93,6 @@ dependencies = [
"common", "common",
"hwcore", "hwcore",
"migration", "migration",
"qemu_macros",
"qom", "qom",
"system", "system",
"util", "util",
@ -133,7 +132,6 @@ name = "migration"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"common", "common",
"qemu_macros",
"util", "util",
] ]
@ -149,7 +147,6 @@ dependencies = [
"common", "common",
"hwcore", "hwcore",
"migration", "migration",
"qemu_macros",
"qom", "qom",
"system", "system",
"util", "util",
@ -232,7 +229,6 @@ name = "system"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"common", "common",
"qemu_macros",
"qom", "qom",
"util", "util",
] ]
@ -246,7 +242,6 @@ dependencies = [
"common", "common",
"hwcore", "hwcore",
"migration", "migration",
"qemu_macros",
"qom", "qom",
"system", "system",
"util", "util",
@ -266,7 +261,6 @@ dependencies = [
"common", "common",
"foreign", "foreign",
"libc", "libc",
"qemu_macros",
] ]
[[package]] [[package]]

View file

@ -18,7 +18,6 @@ bql = { path = "../bql" }
migration = { path = "../migration" } migration = { path = "../migration" }
qom = { path = "../qom" } qom = { path = "../qom" }
util = { path = "../util" } util = { path = "../util" }
qemu_macros = { path = "../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -38,4 +38,4 @@ _chardev_rs = static_library(
dependencies: [common_rs, qemu_macros], dependencies: [common_rs, qemu_macros],
) )
chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [qemu_macros, chardev, qemuutil]) chardev_rs = declare_dependency(link_with: [_chardev_rs], dependencies: [chardev, qemuutil])

View file

@ -26,7 +26,7 @@ use crate::bindings;
/// A safe wrapper around [`bindings::Chardev`]. /// A safe wrapper around [`bindings::Chardev`].
#[repr(transparent)] #[repr(transparent)]
#[derive(qemu_macros::Wrapper)] #[derive(common::Wrapper)]
pub struct Chardev(Opaque<bindings::Chardev>); pub struct Chardev(Opaque<bindings::Chardev>);
pub type ChardevClass = bindings::ChardevClass; pub type ChardevClass = bindings::ChardevClass;

View file

@ -14,6 +14,7 @@ rust-version.workspace = true
[dependencies] [dependencies]
libc.workspace = true libc.workspace = true
qemu_macros = { path = "../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -19,7 +19,7 @@ _common_rs = static_library(
override_options: ['rust_std=2021', 'build.rust_std=2021'], override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust', rust_abi: 'rust',
rust_args: _common_cfg, rust_args: _common_cfg,
dependencies: [libc_rs], dependencies: [libc_rs, qemu_macros],
) )
common_rs = declare_dependency(link_with: [_common_rs]) common_rs = declare_dependency(link_with: [_common_rs])

View file

@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
pub use qemu_macros::{TryInto, Wrapper};
pub mod assertions; pub mod assertions;
pub mod bitops; pub mod bitops;

View file

@ -192,7 +192,7 @@ impl<T: Default> Opaque<T> {
/// Annotates [`Self`] as a transparent wrapper for another type. /// Annotates [`Self`] as a transparent wrapper for another type.
/// ///
/// Usually defined via the [`qemu_macros::Wrapper`] derive macro. /// Usually defined via the [`crate::Wrapper`] derive macro.
/// ///
/// # Examples /// # Examples
/// ///
@ -227,8 +227,6 @@ impl<T: Default> Opaque<T> {
/// ``` /// ```
/// ///
/// They are not defined here to allow them to be `const`. /// They are not defined here to allow them to be `const`.
///
/// [`qemu_macros::Wrapper`]: ../../qemu_macros/derive.Wrapper.html
pub unsafe trait Wrapper { pub unsafe trait Wrapper {
type Wrapped; type Wrapped;
} }

View file

@ -24,7 +24,6 @@ qom = { path = "../../../qom" }
chardev = { path = "../../../chardev" } chardev = { path = "../../../chardev" }
system = { path = "../../../system" } system = { path = "../../../system" }
hwcore = { path = "../../../hw/core" } hwcore = { path = "../../../hw/core" }
qemu_macros = { path = "../../../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -35,7 +35,6 @@ _libpl011_rs = static_library(
util_rs, util_rs,
migration_rs, migration_rs,
bql_rs, bql_rs,
qemu_macros,
qom_rs, qom_rs,
chardev_rs, chardev_rs,
system_rs, system_rs,

View file

@ -97,7 +97,7 @@ pub struct PL011Registers {
} }
#[repr(C)] #[repr(C)]
#[derive(qemu_macros::Object, qemu_macros::Device)] #[derive(qom::Object, hwcore::Device)]
/// PL011 Device Model in QEMU /// PL011 Device Model in QEMU
pub struct PL011State { pub struct PL011State {
pub parent_obj: ParentField<SysBusDevice>, pub parent_obj: ParentField<SysBusDevice>,
@ -683,7 +683,7 @@ pub unsafe extern "C" fn pl011_create(
} }
#[repr(C)] #[repr(C)]
#[derive(qemu_macros::Object, qemu_macros::Device)] #[derive(qom::Object, hwcore::Device)]
/// PL011 Luminary device model. /// PL011 Luminary device model.
pub struct PL011Luminary { pub struct PL011Luminary {
parent_obj: ParentField<PL011State>, parent_obj: ParentField<PL011State>,

View file

@ -16,7 +16,7 @@ use migration::{impl_vmstate_bitsized, impl_vmstate_forward};
#[doc(alias = "offset")] #[doc(alias = "offset")]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[repr(u64)] #[repr(u64)]
#[derive(Debug, Eq, PartialEq, qemu_macros::TryInto)] #[derive(Debug, Eq, PartialEq, common::TryInto)]
pub enum RegisterOffset { pub enum RegisterOffset {
/// Data Register /// Data Register
/// ///

View file

@ -13,6 +13,7 @@ repository.workspace = true
rust-version.workspace = true rust-version.workspace = true
[dependencies] [dependencies]
qemu_macros = { path = "../../qemu-macros" }
common = { path = "../../common" } common = { path = "../../common" }
bql = { path = "../../bql" } bql = { path = "../../bql" }
qom = { path = "../../qom" } qom = { path = "../../qom" }
@ -20,7 +21,6 @@ chardev = { path = "../../chardev" }
migration = { path = "../../migration" } migration = { path = "../../migration" }
system = { path = "../../system" } system = { path = "../../system" }
util = { path = "../../util" } util = { path = "../../util" }
qemu_macros = { path = "../../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -71,7 +71,7 @@ test('rust-hwcore-rs-integration',
override_options: ['rust_std=2021', 'build.rust_std=2021'], override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_args: ['--test'], rust_args: ['--test'],
install: false, install: false,
dependencies: [common_rs, hwcore_rs, bql_rs, migration_rs, qemu_macros, util_rs]), dependencies: [common_rs, hwcore_rs, bql_rs, migration_rs, util_rs]),
args: [ args: [
'--test', '--test-threads', '1', '--test', '--test-threads', '1',
'--format', 'pretty', '--format', 'pretty',

View file

@ -18,7 +18,7 @@ use crate::bindings::{self, qemu_set_irq};
/// An opaque wrapper around [`bindings::IRQState`]. /// An opaque wrapper around [`bindings::IRQState`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct IRQState(Opaque<bindings::IRQState>); pub struct IRQState(Opaque<bindings::IRQState>);
/// Interrupt sources are used by devices to pass changes to a value (typically /// Interrupt sources are used by devices to pass changes to a value (typically

View file

@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
pub use qemu_macros::Device;
pub use qom; pub use qom;
pub mod bindings; pub mod bindings;

View file

@ -23,7 +23,7 @@ use crate::{
/// A safe wrapper around [`bindings::Clock`]. /// A safe wrapper around [`bindings::Clock`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct Clock(Opaque<bindings::Clock>); pub struct Clock(Opaque<bindings::Clock>);
unsafe impl Send for Clock {} unsafe impl Send for Clock {}
@ -31,7 +31,7 @@ unsafe impl Sync for Clock {}
/// A safe wrapper around [`bindings::DeviceState`]. /// A safe wrapper around [`bindings::DeviceState`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct DeviceState(Opaque<bindings::DeviceState>); pub struct DeviceState(Opaque<bindings::DeviceState>);
unsafe impl Send for DeviceState {} unsafe impl Send for DeviceState {}

View file

@ -19,7 +19,7 @@ use crate::{
/// A safe wrapper around [`bindings::SysBusDevice`]. /// A safe wrapper around [`bindings::SysBusDevice`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct SysBusDevice(Opaque<bindings::SysBusDevice>); pub struct SysBusDevice(Opaque<bindings::SysBusDevice>);
unsafe impl Send for SysBusDevice {} unsafe impl Send for SysBusDevice {}

View file

@ -17,7 +17,7 @@ pub const VMSTATE: VMStateDescription<DummyState> = VMStateDescriptionBuilder::<
.build(); .build();
#[repr(C)] #[repr(C)]
#[derive(qemu_macros::Object, qemu_macros::Device)] #[derive(qom::Object, hwcore::Device)]
pub struct DummyState { pub struct DummyState {
parent: ParentField<DeviceState>, parent: ParentField<DeviceState>,
#[property(rename = "migrate-clk", default = true)] #[property(rename = "migrate-clk", default = true)]
@ -54,7 +54,7 @@ impl DeviceImpl for DummyState {
} }
#[repr(C)] #[repr(C)]
#[derive(qemu_macros::Object, qemu_macros::Device)] #[derive(qom::Object, hwcore::Device)]
pub struct DummyChildState { pub struct DummyChildState {
parent: ParentField<DummyState>, parent: ParentField<DummyState>,
} }

View file

@ -17,7 +17,6 @@ migration = { path = "../../../migration" }
bql = { path = "../../../bql" } bql = { path = "../../../bql" }
qom = { path = "../../../qom" } qom = { path = "../../../qom" }
system = { path = "../../../system" } system = { path = "../../../system" }
qemu_macros = { path = "../../../qemu-macros" }
hwcore = { path = "../../../hw/core" } hwcore = { path = "../../../hw/core" }
[lints] [lints]

View file

@ -8,7 +8,6 @@ _libhpet_rs = static_library(
util_rs, util_rs,
migration_rs, migration_rs,
bql_rs, bql_rs,
qemu_macros,
qom_rs, qom_rs,
system_rs, system_rs,
hwcore_rs, hwcore_rs,

View file

@ -97,7 +97,7 @@ const HPET_TN_CFG_FSB_CAP_SHIFT: usize = 15;
/// Timer N Interrupt Routing Capability (bits 32:63) /// Timer N Interrupt Routing Capability (bits 32:63)
const HPET_TN_CFG_INT_ROUTE_CAP_SHIFT: usize = 32; const HPET_TN_CFG_INT_ROUTE_CAP_SHIFT: usize = 32;
#[derive(qemu_macros::TryInto)] #[derive(common::TryInto)]
#[repr(u64)] #[repr(u64)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
/// Timer registers, masked by 0x18 /// Timer registers, masked by 0x18
@ -110,7 +110,7 @@ enum TimerRegister {
ROUTE = 16, ROUTE = 16,
} }
#[derive(qemu_macros::TryInto)] #[derive(common::TryInto)]
#[repr(u64)] #[repr(u64)]
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
/// Global registers /// Global registers
@ -520,7 +520,7 @@ impl HPETTimer {
/// HPET Event Timer Block Abstraction /// HPET Event Timer Block Abstraction
#[repr(C)] #[repr(C)]
#[derive(qemu_macros::Object)] #[derive(qom::Object)]
pub struct HPETState { pub struct HPETState {
parent_obj: ParentField<SysBusDevice>, parent_obj: ParentField<SysBusDevice>,
iomem: MemoryRegion, iomem: MemoryRegion,

View file

@ -20,8 +20,9 @@ proc_macro2_rs_native = dependency('proc-macro2-1-rs', native: true)
genrs = [] genrs = []
subdir('common')
subdir('qemu-macros') subdir('qemu-macros')
subdir('common')
subdir('bits') subdir('bits')
subdir('util') subdir('util')
subdir('migration') subdir('migration')

View file

@ -15,7 +15,6 @@ rust-version.workspace = true
[dependencies] [dependencies]
common = { path = "../common" } common = { path = "../common" }
util = { path = "../util" } util = { path = "../util" }
qemu_macros = { path = "../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -1,5 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
pub use qemu_macros::Object;
pub mod bindings; pub mod bindings;
// preserve one-item-per-"use" syntax, it is clearer // preserve one-item-per-"use" syntax, it is clearer

View file

@ -112,7 +112,7 @@ pub use crate::bindings::{type_register_static, ObjectClass};
/// A safe wrapper around [`bindings::Object`]. /// A safe wrapper around [`bindings::Object`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct Object(Opaque<bindings::Object>); pub struct Object(Opaque<bindings::Object>);
unsafe impl Send for Object {} unsafe impl Send for Object {}
@ -173,7 +173,7 @@ macro_rules! qom_isa {
/// ///
/// ```ignore /// ```ignore
/// #[repr(C)] /// #[repr(C)]
/// #[derive(qemu_macros::Object)] /// #[derive(qom::Object)]
/// pub struct MyDevice { /// pub struct MyDevice {
/// parent: ParentField<DeviceState>, /// parent: ParentField<DeviceState>,
/// ... /// ...

View file

@ -16,7 +16,6 @@ rust-version.workspace = true
common = { path = "../common" } common = { path = "../common" }
qom = { path = "../qom" } qom = { path = "../qom" }
util = { path = "../util" } util = { path = "../util" }
qemu_macros = { path = "../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -39,4 +39,4 @@ _system_rs = static_library(
) )
system_rs = declare_dependency(link_with: [_system_rs], system_rs = declare_dependency(link_with: [_system_rs],
dependencies: [qemu_macros, hwcore]) dependencies: [hwcore])

View file

@ -129,7 +129,7 @@ impl<T> Default for MemoryRegionOpsBuilder<T> {
/// A safe wrapper around [`bindings::MemoryRegion`]. /// A safe wrapper around [`bindings::MemoryRegion`].
#[repr(transparent)] #[repr(transparent)]
#[derive(qemu_macros::Wrapper)] #[derive(common::Wrapper)]
pub struct MemoryRegion(Opaque<bindings::MemoryRegion>); pub struct MemoryRegion(Opaque<bindings::MemoryRegion>);
unsafe impl Send for MemoryRegion {} unsafe impl Send for MemoryRegion {}

View file

@ -19,7 +19,6 @@ hwcore = { path = "../hw/core" }
migration = { path = "../migration" } migration = { path = "../migration" }
util = { path = "../util" } util = { path = "../util" }
bql = { path = "../bql" } bql = { path = "../bql" }
qemu_macros = { path = "../qemu-macros" }
qom = { path = "../qom" } qom = { path = "../qom" }
system = { path = "../system" } system = { path = "../system" }

View file

@ -17,7 +17,6 @@ anyhow = { workspace = true }
foreign = { workspace = true } foreign = { workspace = true }
libc = { workspace = true } libc = { workspace = true }
common = { path = "../common" } common = { path = "../common" }
qemu_macros = { path = "../qemu-macros" }
[lints] [lints]
workspace = true workspace = true

View file

@ -39,7 +39,7 @@ _util_rs = static_library(
), ),
override_options: ['rust_std=2021', 'build.rust_std=2021'], override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust', rust_abi: 'rust',
dependencies: [anyhow_rs, libc_rs, foreign_rs, common_rs, qemu_macros, qom, qemuutil], dependencies: [anyhow_rs, libc_rs, foreign_rs, common_rs, qom, qemuutil],
) )
util_rs = declare_dependency(link_with: [_util_rs], dependencies: [qemuutil, qom]) util_rs = declare_dependency(link_with: [_util_rs], dependencies: [qemuutil, qom])

View file

@ -15,14 +15,14 @@ use crate::bindings::{
/// A safe wrapper around [`bindings::QEMUTimer`]. /// A safe wrapper around [`bindings::QEMUTimer`].
#[repr(transparent)] #[repr(transparent)]
#[derive(Debug, qemu_macros::Wrapper)] #[derive(Debug, common::Wrapper)]
pub struct Timer(Opaque<bindings::QEMUTimer>); pub struct Timer(Opaque<bindings::QEMUTimer>);
unsafe impl Send for Timer {} unsafe impl Send for Timer {}
unsafe impl Sync for Timer {} unsafe impl Sync for Timer {}
#[repr(transparent)] #[repr(transparent)]
#[derive(qemu_macros::Wrapper)] #[derive(common::Wrapper)]
pub struct TimerListGroup(Opaque<bindings::QEMUTimerListGroup>); pub struct TimerListGroup(Opaque<bindings::QEMUTimerListGroup>);
unsafe impl Send for TimerListGroup {} unsafe impl Send for TimerListGroup {}