From: Zhao Liu <zhao1.liu@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org, qemu-rust@nongnu.org
Subject: Re: [PATCH 1/5] rust: qemu_api: introduce MaybeUninit field projection
Date: Wed, 11 Jun 2025 19:09:00 +0800 [thread overview]
Message-ID: <aEljzPOf/76W25iC@intel.com> (raw)
In-Reply-To: <20250609154423.706056-2-pbonzini@redhat.com>
On Mon, Jun 09, 2025 at 05:44:19PM +0200, Paolo Bonzini wrote:
> Date: Mon, 9 Jun 2025 17:44:19 +0200
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: [PATCH 1/5] rust: qemu_api: introduce MaybeUninit field projection
> X-Mailer: git-send-email 2.49.0
>
> Add a macro that makes it possible to convert a MaybeUninit<> into
> another MaybeUninit<> for a single field within it. Furthermore, it is
> possible to use the resulting MaybeUninitField<> in APIs that take the
> parent object, such as memory_region_init_io().
>
> This allows removing some of the undefined behavior from instance_init()
> functions, though this may not be the definitive implementation.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> rust/qemu-api/meson.build | 1 +
> rust/qemu-api/src/lib.rs | 1 +
> rust/qemu-api/src/uninit.rs | 85 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 87 insertions(+)
> create mode 100644 rust/qemu-api/src/uninit.rs
...
> +impl<'a, T, U> Deref for MaybeUninitField<'a, T, U> {
> + type Target = MaybeUninit<U>;
> +
> + fn deref(&self) -> &MaybeUninit<U> {
> + // SAFETY: self.child was obtained by dereferencing a valid mutable
> + // reference; the content of the memory may be invalid or uninitialized
> + // but MaybeUninit<_> makes no assumption on it
> + unsafe { &*(self.child.cast()) }
> + }
> +}
> +
> +impl<'a, T, U> DerefMut for MaybeUninitField<'a, T, U> {
> + fn deref_mut(&mut self) -> &mut MaybeUninit<U> {
> + // SAFETY: self.child was obtained by dereferencing a valid mutable
> + // reference; the content of the memory may be invalid or uninitialized
> + // but MaybeUninit<_> makes no assumption on it
> + unsafe { &mut *(self.child.cast()) }
> + }
> +}
Nice trick.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
next prev parent reply other threads:[~2025-06-11 10:47 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-09 15:44 [PATCH 0/5] rust: make instance_init implementations use safe Rust Paolo Bonzini
2025-06-09 15:44 ` [PATCH 1/5] rust: qemu_api: introduce MaybeUninit field projection Paolo Bonzini
2025-06-11 11:09 ` Zhao Liu [this message]
2025-06-09 15:44 ` [PATCH 2/5] rust: hpet: fully initialize object after instance_init Paolo Bonzini
2025-06-11 9:43 ` Zhao Liu
2025-06-09 15:44 ` [PATCH 3/5] rust: qom: introduce ParentInit Paolo Bonzini
2025-06-11 15:25 ` Zhao Liu
2025-06-09 15:44 ` [PATCH 4/5] rust: qom: make ParentInit lifetime-invariant Paolo Bonzini
2025-06-12 9:21 ` Zhao Liu
2025-06-12 9:07 ` Paolo Bonzini
2025-06-12 9:41 ` Zhao Liu
2025-06-12 9:24 ` Paolo Bonzini
2025-06-12 10:31 ` Zhao Liu
2025-06-09 15:44 ` [PATCH 5/5] rust: qom: change instance_init to take a ParentInit<> Paolo Bonzini
2025-06-12 15:25 ` Zhao Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aEljzPOf/76W25iC@intel.com \
--to=zhao1.liu@intel.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.