rust: memory: wrap MemoryRegion with Opaque<>

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-02-14 12:34:47 +01:00
parent f4751c7a42
commit af0868cba3
2 changed files with 21 additions and 17 deletions

View file

@ -34,9 +34,6 @@ unsafe impl Sync for CharBackend {}
unsafe impl Send for Chardev {} unsafe impl Send for Chardev {}
unsafe impl Sync for Chardev {} unsafe impl Sync for Chardev {}
unsafe impl Send for MemoryRegion {}
unsafe impl Sync for MemoryRegion {}
unsafe impl Send for ObjectClass {} unsafe impl Send for ObjectClass {}
unsafe impl Sync for ObjectClass {} unsafe impl Sync for ObjectClass {}

View file

@ -6,9 +6,8 @@
use std::{ use std::{
ffi::{CStr, CString}, ffi::{CStr, CString},
marker::{PhantomData, PhantomPinned}, marker::PhantomData,
os::raw::{c_uint, c_void}, os::raw::{c_uint, c_void},
ptr::addr_of,
}; };
pub use bindings::{hwaddr, MemTxAttrs}; pub use bindings::{hwaddr, MemTxAttrs};
@ -16,6 +15,7 @@ pub use bindings::{hwaddr, MemTxAttrs};
use crate::{ use crate::{
bindings::{self, device_endian, memory_region_init_io}, bindings::{self, device_endian, memory_region_init_io},
callbacks::FnCall, callbacks::FnCall,
cell::Opaque,
prelude::*, prelude::*,
zeroable::Zeroable, zeroable::Zeroable,
}; };
@ -132,13 +132,13 @@ impl<T> Default for MemoryRegionOpsBuilder<T> {
} }
} }
/// A safe wrapper around [`bindings::MemoryRegion`]. Compared to the /// A safe wrapper around [`bindings::MemoryRegion`].
/// underlying C struct it is marked as pinned because the QOM tree #[repr(transparent)]
/// contains a pointer to it. #[derive(qemu_api_macros::Wrapper)]
pub struct MemoryRegion { pub struct MemoryRegion(Opaque<bindings::MemoryRegion>);
inner: bindings::MemoryRegion,
_pin: PhantomPinned, unsafe impl Send for MemoryRegion {}
} unsafe impl Sync for MemoryRegion {}
impl MemoryRegion { impl MemoryRegion {
// inline to ensure that it is not included in tests, which only // inline to ensure that it is not included in tests, which only
@ -174,13 +174,20 @@ impl MemoryRegion {
size: u64, size: u64,
) { ) {
unsafe { unsafe {
Self::do_init_io(&mut self.inner, owner.cast::<Object>(), &ops.0, name, size); Self::do_init_io(
// self.0.as_mut_ptr() needed because Rust tries to call
// ObjectDeref::as_mut_ptr() on "&mut Self", instead of coercing
// to "&Self" and then calling MemoryRegion::as_mut_ptr().
// Revisit if/when ObjectCastMut is not needed anymore; it is
// only used in a couple places for initialization.
self.0.as_mut_ptr(),
owner.cast::<Object>(),
&ops.0,
name,
size,
);
} }
} }
pub(crate) const fn as_mut_ptr(&self) -> *mut bindings::MemoryRegion {
addr_of!(self.inner) as *mut _
}
} }
unsafe impl ObjectType for MemoryRegion { unsafe impl ObjectType for MemoryRegion {