On Mon, Sep 08, 2025 at 12:49:48PM +0200, Paolo Bonzini wrote: > Date: Mon, 8 Sep 2025 12:49:48 +0200 > From: Paolo Bonzini <pbonz...@redhat.com> > Subject: [PATCH 16/33] rust: split Rust-only "common" crate > X-Mailer: git-send-email 2.51.0 > > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > Link: > https://lore.kernel.org/r/20250827104147.717203-6-marcandre.lur...@redhat.com > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > MAINTAINERS | 1 + > rust/Cargo.lock | 10 + > rust/Cargo.toml | 1 + > rust/common/Cargo.toml | 19 ++ > rust/common/meson.build | 34 +++ > rust/{qemu-api => common}/src/assertions.rs | 16 +- > rust/{qemu-api => common}/src/bitops.rs | 1 - > rust/{qemu-api => common}/src/callbacks.rs | 10 +- > rust/{qemu-api => common}/src/errno.rs | 8 +- > rust/common/src/lib.rs | 20 ++ > rust/common/src/opaque.rs | 238 ++++++++++++++++++++ > rust/{qemu-api => common}/src/uninit.rs | 2 +- > rust/common/src/zeroable.rs | 18 ++ > rust/hw/char/pl011/Cargo.toml | 1 + > rust/hw/char/pl011/meson.build | 3 +- > rust/hw/char/pl011/src/device.rs | 3 +- > rust/hw/timer/hpet/Cargo.toml | 1 + > rust/hw/timer/hpet/meson.build | 3 +- > rust/hw/timer/hpet/src/device.rs | 2 +- > rust/hw/timer/hpet/src/fw_cfg.rs | 3 +- > rust/meson.build | 1 + > rust/qemu-api-macros/src/lib.rs | 16 +- > rust/qemu-api-macros/src/tests.rs | 6 +- > rust/qemu-api/Cargo.toml | 1 + > rust/qemu-api/meson.build | 14 +- > rust/qemu-api/src/bindings.rs | 21 ++ > rust/qemu-api/src/cell.rs | 235 +------------------ > rust/qemu-api/src/chardev.rs | 5 +- > rust/qemu-api/src/error.rs | 3 +- > rust/qemu-api/src/irq.rs | 3 +- > rust/qemu-api/src/lib.rs | 6 - > rust/qemu-api/src/log.rs | 4 +- > rust/qemu-api/src/memory.rs | 5 +- > rust/qemu-api/src/prelude.rs | 6 +- > rust/qemu-api/src/qdev.rs | 10 +- > rust/qemu-api/src/qom.rs | 3 +- > rust/qemu-api/src/sysbus.rs | 3 +- > rust/qemu-api/src/timer.rs | 8 +- > rust/qemu-api/src/vmstate.rs | 23 +- > rust/qemu-api/src/zeroable.rs | 37 --- > rust/qemu-api/tests/vmstate_tests.rs | 3 +- > 41 files changed, 448 insertions(+), 359 deletions(-) > create mode 100644 rust/common/Cargo.toml > create mode 100644 rust/common/meson.build > rename rust/{qemu-api => common}/src/assertions.rs (92%) > rename rust/{qemu-api => common}/src/bitops.rs (98%) > rename rust/{qemu-api => common}/src/callbacks.rs (97%) > rename rust/{qemu-api => common}/src/errno.rs (98%) > create mode 100644 rust/common/src/lib.rs > create mode 100644 rust/common/src/opaque.rs > rename rust/{qemu-api => common}/src/uninit.rs (98%) > create mode 100644 rust/common/src/zeroable.rs > delete mode 100644 rust/qemu-api/src/zeroable.rs
... > +/// Stores an opaque value that is shared with C code. > +/// > +/// Often, C structs can changed when calling a C function even if they are nit typo (found in kvm forum :) ): s/can changed/can be changed/ > +/// behind a shared Rust reference, or they can be initialized lazily and > have > +/// invalid bit patterns (e.g. `3` for a [`bool`]). This goes against Rust's > +/// strict aliasing rules, which normally prevent mutation through shared > +/// references. > +/// > +/// Wrapping the struct with `Opaque<T>` ensures that the Rust compiler does > not > +/// assume the usual constraints that Rust structs require, and allows using > +/// shared references on the Rust side. > +/// > +/// `Opaque<T>` is `#[repr(transparent)]`, so that it matches the memory > layout > +/// of `T`. > +#[repr(transparent)] > +pub struct Opaque<T> { > + value: UnsafeCell<MaybeUninit<T>>, > + // PhantomPinned also allows multiple references to the `Opaque<T>`, i.e. > + // one `&mut Opaque<T>` can coexist with a `&mut T` or any number of > `&T`; > + // see https://docs.rs/pinned-aliasable/latest/pinned_aliasable/. > + _pin: PhantomPinned, > +} Reviewed-by: Zhao Liu <zhao1....@intel.com>