qemu-rust
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 13/15] rust: memory: wrap MemoryRegion with Opaque<>


From: Paolo Bonzini
Subject: Re: [PATCH 13/15] rust: memory: wrap MemoryRegion with Opaque<>
Date: Tue, 25 Feb 2025 10:47:54 +0100
User-agent: Mozilla Thunderbird

On 2/25/25 10:14, Zhao Liu wrote:
  impl MemoryRegion {
      // inline to ensure that it is not included in tests, which only
@@ -174,13 +174,15 @@ pub fn init_io<T: IsA<Object>>(
          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(),

I'm not sure why the wrapper doesn't work here.

If I change this to `self.as_mut_ptr()`, then compiler tries to apply
`ObjectDeref::as_mut_ptr` and complains:

the trait `qom::ObjectType` is not implemented for `bindings::MemoryRegion`

It's because the implementation of ObjectDeref for "&mut MemoryRegion" wins over coercing "&mut MemoryRegion" to "&MemoryRegion" and then calling MemoryRegion::as_mut_ptr().

I added a comment

        // 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.

Paolo


But when I modify the function signature to &self like:

diff --git a/rust/qemu-api/src/memory.rs b/rust/qemu-api/src/memory.rs
index fdb1ea11fcf9..a82348c4a564 100644
--- a/rust/qemu-api/src/memory.rs
+++ b/rust/qemu-api/src/memory.rs
@@ -167,7 +167,7 @@ unsafe fn do_init_io(
      }

      pub fn init_io<T: IsA<Object>>(
-        &mut self,
+        &self,
          owner: *mut T,
          ops: &'static MemoryRegionOps<T>,
          name: &'static str,

Then the Wrapper's as_mut_ptr() can work.

+                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 {
--
2.48.1








reply via email to

[Prev in Thread] Current Thread [Next in Thread]