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>



Reply via email to