new file mode 100644
@@ -0,0 +1,56 @@
+//! Bindings for the QOM Device class
+//!
+//! @author Paolo Bonzini
+
+use crate::qom::object::ObjectType;
+
+use crate::qom::refs::IsA;
+use crate::qom::refs::ObjectCast;
+
+use crate::bindings;
+use crate::bindings::device_cold_reset;
+use crate::bindings::device_realize;
+use crate::bindings::DeviceState;
+use crate::bindings::Object;
+
+use crate::qom_isa;
+
+use crate::Result;
+
+use std::ffi::CStr;
+use std::ops::Deref;
+use std::ptr::null_mut;
+
+unsafe impl ObjectType for DeviceState {
+ const TYPE: &'static CStr = c"device";
+}
+
+qom_isa!(DeviceState, Object);
+
+/// Trait for methods exposed by the Object class. The methods can be
+/// called on all objects that have the trait `IsA<Object>`.
+///
+/// The trait should only be used through the blanket implementation,
+/// which guarantees safety via `IsA`
+pub trait DeviceMethods: Deref
+where
+ Self::Target: IsA<DeviceState>,
+{
+ fn realize(&self) -> Result<()> {
+ let device = self.upcast::<DeviceState>();
+ let mut err: *mut bindings::Error = null_mut();
+ // SAFETY: safety of this is the requirement for implementing IsA
+ unsafe {
+ device_realize(device.as_mut_ptr(), &mut err);
+ crate::Error::err_or_default(err)
+ }
+ }
+
+ fn cold_reset(&self) {
+ let device = self.upcast::<DeviceState>();
+ // SAFETY: safety of this is the requirement for implementing IsA
+ unsafe { device_cold_reset(device.as_mut_ptr()) }
+ }
+}
+
+impl<R: Deref> DeviceMethods for R where R::Target: IsA<DeviceState> {}
new file mode 100644
@@ -0,0 +1 @@
+pub mod device;
new file mode 100644
@@ -0,0 +1 @@
+pub mod core;
@@ -2,8 +2,12 @@
#![allow(dead_code)]
pub mod bindings;
+pub use bindings::DeviceState;
pub use bindings::Object;
+pub mod hw;
+pub use hw::core::device::DeviceMethods;
+
pub mod qom;
pub use qom::object::ObjectClassMethods;
pub use qom::object::ObjectMethods;
Provide a trait that can be used to invoke methods of the QOM Device class. The trait extends Deref and has a blanket implementation for any type that dereferences to IsA<DeviceState>. This way, it can be used on any struct that dereferences to Object or a subclass. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- qemu/src/hw/core/device.rs | 56 ++++++++++++++++++++++++++++++++++++++ qemu/src/hw/core/mod.rs | 1 + qemu/src/hw/mod.rs | 1 + qemu/src/lib.rs | 4 +++ 4 files changed, 62 insertions(+) create mode 100644 qemu/src/hw/core/device.rs create mode 100644 qemu/src/hw/core/mod.rs create mode 100644 qemu/src/hw/mod.rs