From: Philippe Mathieu-Daudé <[email protected]> VirtIODevice::access_is_big_endian boolean field, initialized on device realize, and updated when setting device features. This happens on reset or when configuring device after initial realize. It represents whether load/store accesses are ordered using big endianness.
Signed-off-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Pierrick Bouvier <[email protected]> --- include/hw/virtio/virtio.h | 5 +++++ hw/virtio/virtio.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 65872f2c54c..0f792e24f23 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -154,6 +154,11 @@ struct VirtIODevice VMChangeStateEntry *vmstate; char *bus_name; uint8_t device_endian; + /** + * @access_is_big_endian: whether load/store memory accesses are ordered + * using big endianness. + */ + bool access_is_big_endian; /** * @user_guest_notifier_mask: gate usage of ->guest_notifier_mask() callback. * This is used to suppress the masking of guest updates for diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 77ca54e5206..a429ff7de39 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3154,6 +3154,10 @@ static int virtio_set_features_nocheck(VirtIODevice *vdev, const uint64_t *val) } virtio_features_copy(vdev->guest_features_ex, tmp); + if (!bad) { + /* set_features might enable VIRTIO_F_VERSION_1 */ + vdev->access_is_big_endian = virtio_access_is_big_endian(vdev); + } return bad ? -1 : 0; } @@ -4075,6 +4079,7 @@ static void virtio_device_realize(DeviceState *dev, Error **errp) vdev->listener.commit = virtio_memory_listener_commit; vdev->listener.name = "virtio"; memory_listener_register(&vdev->listener, vdev->dma_as); + vdev->access_is_big_endian = virtio_access_is_big_endian(vdev); } static void virtio_device_unrealize(DeviceState *dev) -- 2.47.3
