mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
rust: memory: wrap MemoryRegion with Opaque<>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f4751c7a42
commit
af0868cba3
2 changed files with 21 additions and 17 deletions
|
@ -34,9 +34,6 @@ unsafe impl Sync for CharBackend {}
|
|||
unsafe impl Send for Chardev {}
|
||||
unsafe impl Sync for Chardev {}
|
||||
|
||||
unsafe impl Send for MemoryRegion {}
|
||||
unsafe impl Sync for MemoryRegion {}
|
||||
|
||||
unsafe impl Send for ObjectClass {}
|
||||
unsafe impl Sync for ObjectClass {}
|
||||
|
||||
|
|
|
@ -6,9 +6,8 @@
|
|||
|
||||
use std::{
|
||||
ffi::{CStr, CString},
|
||||
marker::{PhantomData, PhantomPinned},
|
||||
marker::PhantomData,
|
||||
os::raw::{c_uint, c_void},
|
||||
ptr::addr_of,
|
||||
};
|
||||
|
||||
pub use bindings::{hwaddr, MemTxAttrs};
|
||||
|
@ -16,6 +15,7 @@ pub use bindings::{hwaddr, MemTxAttrs};
|
|||
use crate::{
|
||||
bindings::{self, device_endian, memory_region_init_io},
|
||||
callbacks::FnCall,
|
||||
cell::Opaque,
|
||||
prelude::*,
|
||||
zeroable::Zeroable,
|
||||
};
|
||||
|
@ -132,13 +132,13 @@ impl<T> Default for MemoryRegionOpsBuilder<T> {
|
|||
}
|
||||
}
|
||||
|
||||
/// A safe wrapper around [`bindings::MemoryRegion`]. Compared to the
|
||||
/// underlying C struct it is marked as pinned because the QOM tree
|
||||
/// contains a pointer to it.
|
||||
pub struct MemoryRegion {
|
||||
inner: bindings::MemoryRegion,
|
||||
_pin: PhantomPinned,
|
||||
}
|
||||
/// A safe wrapper around [`bindings::MemoryRegion`].
|
||||
#[repr(transparent)]
|
||||
#[derive(qemu_api_macros::Wrapper)]
|
||||
pub struct MemoryRegion(Opaque<bindings::MemoryRegion>);
|
||||
|
||||
unsafe impl Send for MemoryRegion {}
|
||||
unsafe impl Sync for MemoryRegion {}
|
||||
|
||||
impl MemoryRegion {
|
||||
// inline to ensure that it is not included in tests, which only
|
||||
|
@ -174,13 +174,20 @@ impl MemoryRegion {
|
|||
size: u64,
|
||||
) {
|
||||
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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue