mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 05:13:54 -06:00
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:
parent
4aed0296b3
commit
716d89f9cc
5 changed files with 25 additions and 17 deletions
|
@ -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`].
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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),*$(,)*) => {{
|
||||||
|
|
|
@ -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]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue