]> git.ipfire.org Git - thirdparty/qemu.git/commit
hw/char/pl011: Pad PL011State struct to same size as Rust impl
authorPeter Maydell <peter.maydell@linaro.org>
Fri, 21 Mar 2025 11:25:22 +0000 (11:25 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 21 Mar 2025 11:51:16 +0000 (12:51 +0100)
commit5b87a07e76816ed61e5968eb370859a5901b8516
treed69ee0508b33d7232662bc842cc17e3439eb9ced
parent9d116f42a38cb95a33da837e0b0b50d91e28906b
hw/char/pl011: Pad PL011State struct to same size as Rust impl

We have some users of the PL011 struct which embed it directly into
their own state structs. This means that the Rust version of the
device must have a state struct that is the same size or smaller
than the C struct.

In commit 9b642097d6b7 ("rust: pl011: switch to safe chardev operation")
the Rust PL011 state struct changed from having a bindings::CharBackend
to a chardev::CharBackend, which made it grow larger than the C
version. This results in an assertion at startup when QEMU was
built with Rust enabled:

 $ qemu-system-arm -M raspi2b -display none
 ERROR:../../qom/object.c:562:object_initialize_with_type: assertion
 failed: (size >= type->instance_size)

The long-term better approach to this problem would be to move
our C device code patterns away from "embed a struct" and (back)
to "have a pointer to the device", so we can make the C PL011State
struct a private implementation detail rather than exposed to
its users.

For the short term, add a padding field at the end of the C struct
so it's big enough that the Rust state struct can fit.

Fixes: 9b642097d6b7 ("rust: pl011: switch to safe chardev operation")
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Link: https://lore.kernel.org/r/20250321112523.1774131-3-peter.maydell@linaro.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
include/hw/char/pl011.h