On 23/7/26 09:00, Bernhard Beschow wrote:
As indicated in the comments, the `mb[]` a.k.a. `mbs []` views should
cover 0x400 (1024) bytes. However, the `mb[]` array covers four times
the size since `sizeof(FlexcanRegsMessageBuffer)` returns the size in
bytes instead of counting the number of uint32_t fields. This shifts the
subsequent register offsets by 0xc00 which is not intended. Fix the size
and thus the offsets by dropping the now unused `mb[]` view.

Note that the different size changes the migration layout. Since the device
model is new, no change in the version fields is needed.

typedef struct FlexcanState {
    ...
    union {
        FlexcanRegs     regs;
        uint32_t        regs_raw[sizeof(FlexcanRegs) / 4];
    };
    ...
} FlexcanState;

static const VMStateDescription vmstate_can = {
    .name = TYPE_CAN_FLEXCAN,
    .version_id = 1,
    .minimum_version_id = 1,
    .fields = (const VMStateField[]) {
        ...
VMSTATE_UINT32_ARRAY(regs_raw, FlexcanState, sizeof(FlexcanRegs) / 4),

        ^^^

This "consider this structure as a casted array of u32" is very fragile
anyway, and will unlikely scale over time.

        ...
        VMSTATE_END_OF_LIST(),
    },
};

Reviewed-by: Philippe Mathieu-Daudé <[email protected]>

Signed-off-by: Bernhard Beschow <[email protected]>
---
  include/hw/net/flexcan.h | 6 ++----
  1 file changed, 2 insertions(+), 4 deletions(-)

Reply via email to