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 <[email protected]>
> Subject: [PATCH 16/33] rust: split Rust-only "common" crate
> X-Mailer: git-send-email 2.51.0
>
> From: Marc-André Lureau <[email protected]>
>
> Signed-off-by: Marc-André Lureau <[email protected]>
> Link:
> https://lore.kernel.org/r/[email protected]
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
> 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 <[email protected]>