A Rust version implementation has been designed for BusState, which will be used for the subsequent I2CBus implementation.
Signed-off-by: chenmiao <[email protected]> --- rust/hw/core/meson.build | 1 + rust/hw/core/src/bus.rs | 51 ++++++++++++++++++++++++++++++++++++++++ rust/hw/core/src/lib.rs | 3 +++ 3 files changed, 55 insertions(+) create mode 100644 rust/hw/core/src/bus.rs diff --git a/rust/hw/core/meson.build b/rust/hw/core/meson.build index 1560dd2..efcda50 100644 --- a/rust/hw/core/meson.build +++ b/rust/hw/core/meson.build @@ -50,6 +50,7 @@ _hwcore_rs = static_library( [ 'src/lib.rs', 'src/bindings.rs', + 'src/bus.rs', 'src/irq.rs', 'src/qdev.rs', 'src/sysbus.rs', diff --git a/rust/hw/core/src/bus.rs b/rust/hw/core/src/bus.rs new file mode 100644 index 0000000..c87d18d --- /dev/null +++ b/rust/hw/core/src/bus.rs @@ -0,0 +1,51 @@ +// Copyright 2025 HUST OpenAtom Open Source Club. +// Author(s): Chen Miao <[email protected]> +// SPDX-License-Identifier: GPL-2.0-or-later + +use std::{ffi::CStr, ptr::addr_of_mut}; + +pub use bindings::BusClass; +use common::Opaque; +use qom::{qom_isa, IsA, Object, ObjectCast, ObjectDeref, ObjectType}; + +use crate::{bindings, DeviceImpl}; + +#[repr(transparent)] +#[derive(Debug, common::Wrapper)] +pub struct BusState(Opaque<bindings::BusState>); + +unsafe impl Send for BusState {} +unsafe impl Sync for BusState {} + +unsafe impl ObjectType for BusState { + type Class = BusClass; + const TYPE_NAME: &'static std::ffi::CStr = + unsafe { CStr::from_bytes_with_nul_unchecked(bindings::TYPE_BUS) }; +} + +qom_isa!(BusState: Object); + +pub trait BusStateImpl: DeviceImpl + IsA<BusState> {} + +impl BusClass { + pub fn class_init<T: BusStateImpl>(self: &mut BusClass) { + self.parent_class.class_init::<T>(); + } +} + +pub trait BusStateMethods: ObjectDeref +where + Self::Target: IsA<BusState>, +{ + fn bus_realize(&self) { + assert!(bql::is_locked()); + unsafe { + bindings::qbus_realize( + self.upcast().as_mut_ptr(), + addr_of_mut!(util::bindings::error_fatal), + ); + } + } +} + +impl<R: ObjectDeref> BusStateMethods for R where R::Target: IsA<BusState> {} diff --git a/rust/hw/core/src/lib.rs b/rust/hw/core/src/lib.rs index b40801e..10cc516 100644 --- a/rust/hw/core/src/lib.rs +++ b/rust/hw/core/src/lib.rs @@ -13,3 +13,6 @@ mod sysbus; pub use sysbus::*; + +mod bus; +pub use bus::*; -- 2.43.0
