rust: re-export C types from qemu-api submodules

Long term we do not want device code to use "bindings" at all, so make it
possible to get the relevant types from the other modules of qemu-api.

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-10-31 10:14:11 +01:00
parent 4aed0296b3
commit 716d89f9cc
5 changed files with 25 additions and 17 deletions

View file

@ -6,10 +6,13 @@
use std::ffi::CStr; use std::ffi::CStr;
pub use bindings::{DeviceClass, DeviceState, Property};
use crate::{ use crate::{
bindings::{self, DeviceClass, DeviceState, Error, ObjectClass, Property, VMStateDescription}, bindings::{self, Error},
prelude::*, prelude::*,
qom::ClassInitImpl, qom::{ClassInitImpl, ObjectClass},
vmstate::VMStateDescription,
}; };
/// Trait providing the contents of [`DeviceClass`]. /// Trait providing the contents of [`DeviceClass`].

View file

@ -33,7 +33,9 @@
use std::{ffi::CStr, os::raw::c_void}; use std::{ffi::CStr, os::raw::c_void};
use crate::bindings::{self, Object, ObjectClass, TypeInfo}; pub use bindings::{Object, ObjectClass};
use crate::bindings::{self, TypeInfo};
unsafe extern "C" fn rust_instance_init<T: ObjectImpl>(obj: *mut Object) { unsafe extern "C" fn rust_instance_init<T: ObjectImpl>(obj: *mut Object) {
// SAFETY: obj is an instance of T, since rust_instance_init<T> // SAFETY: obj is an instance of T, since rust_instance_init<T>
@ -164,9 +166,9 @@ pub trait ObjectImpl: ObjectType + ClassInitImpl<Self::Class> {
/// ///
/// Each struct will implement this trait with `T` equal to each /// Each struct will implement this trait with `T` equal to each
/// superclass. For example, a device should implement at least /// superclass. For example, a device should implement at least
/// `ClassInitImpl<`[`DeviceClass`](crate::bindings::DeviceClass)`>` and /// `ClassInitImpl<`[`DeviceClass`](crate::qdev::DeviceClass)`>` and
/// `ClassInitImpl<`[`ObjectClass`](crate::bindings::ObjectClass)`>`. /// `ClassInitImpl<`[`ObjectClass`]`>`. Such implementations are made
/// Such implementations are made in one of two ways. /// in one of two ways.
/// ///
/// For most superclasses, `ClassInitImpl` is provided by the `qemu-api` /// For most superclasses, `ClassInitImpl` is provided by the `qemu-api`
/// crate itself. The Rust implementation of methods will come from a /// crate itself. The Rust implementation of methods will come from a
@ -221,7 +223,7 @@ pub trait ClassInitImpl<T> {
/// ///
/// The virtual method implementations usually come from another /// The virtual method implementations usually come from another
/// trait, for example [`DeviceImpl`](crate::qdev::DeviceImpl) /// trait, for example [`DeviceImpl`](crate::qdev::DeviceImpl)
/// when `T` is [`DeviceClass`](crate::bindings::DeviceClass). /// when `T` is [`DeviceClass`](crate::qdev::DeviceClass).
/// ///
/// On entry, `klass`'s parent class is initialized, while the other fields /// On entry, `klass`'s parent class is initialized, while the other fields
/// are all zero; it is therefore assumed that all fields in `T` can be /// are all zero; it is therefore assumed that all fields in `T` can be

View file

@ -7,10 +7,7 @@ use std::{ffi::CStr, ptr::addr_of};
pub use bindings::{SysBusDevice, SysBusDeviceClass}; pub use bindings::{SysBusDevice, SysBusDeviceClass};
use crate::{ use crate::{
bindings::{self, DeviceClass}, bindings, cell::bql_locked, irq::InterruptSource, prelude::*, qdev::DeviceClass,
cell::bql_locked,
irq::InterruptSource,
prelude::*,
qom::ClassInitImpl, qom::ClassInitImpl,
}; };

View file

@ -10,6 +10,8 @@
//! [`vmstate_fields`](crate::vmstate_fields) are meant to be used when //! [`vmstate_fields`](crate::vmstate_fields) are meant to be used when
//! declaring a device model state struct. //! declaring a device model state struct.
pub use crate::bindings::VMStateDescription;
#[doc(alias = "VMSTATE_UNUSED_BUFFER")] #[doc(alias = "VMSTATE_UNUSED_BUFFER")]
#[macro_export] #[macro_export]
macro_rules! vmstate_unused_buffer { macro_rules! vmstate_unused_buffer {
@ -328,7 +330,7 @@ macro_rules! vmstate_fields {
} }
/// A transparent wrapper type for the `subsections` field of /// A transparent wrapper type for the `subsections` field of
/// [`VMStateDescription`](crate::bindings::VMStateDescription). /// [`VMStateDescription`].
/// ///
/// This is necessary to be able to declare subsection descriptions as statics, /// This is necessary to be able to declare subsection descriptions as statics,
/// because the only way to implement `Sync` for a foreign type (and `*const` /// because the only way to implement `Sync` for a foreign type (and `*const`
@ -342,9 +344,8 @@ pub struct VMStateSubsectionsWrapper(pub &'static [*const crate::bindings::VMSta
unsafe impl Sync for VMStateSubsectionsWrapper {} unsafe impl Sync for VMStateSubsectionsWrapper {}
/// Helper macro to declare a list of subsections /// Helper macro to declare a list of subsections ([`VMStateDescription`])
/// ([`VMStateDescription`](`crate::bindings::VMStateDescription`)) into a /// into a static and return a pointer to the array of pointers it created.
/// static and return a pointer to the array of pointers it created.
#[macro_export] #[macro_export]
macro_rules! vmstate_subsections { macro_rules! vmstate_subsections {
($($subsection:expr),*$(,)*) => {{ ($($subsection:expr),*$(,)*) => {{

View file

@ -5,8 +5,13 @@
use std::ffi::CStr; use std::ffi::CStr;
use qemu_api::{ use qemu_api::{
bindings::*, c_str, declare_properties, define_property, prelude::*, qdev::DeviceImpl, bindings::*,
qom::ObjectImpl, zeroable::Zeroable, c_str, declare_properties, define_property,
prelude::*,
qdev::{DeviceImpl, DeviceState, Property},
qom::ObjectImpl,
vmstate::VMStateDescription,
zeroable::Zeroable,
}; };
#[test] #[test]