mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 14:53:54 -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 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 {}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue