On 2/25/26 15:19, Philippe Mathieu-Daudé wrote:
From: Pierrick Bouvier <[email protected]>

Thanks to previous refactoring, we can see more easily it is strictly
equivalent to always call virtio_vdev_is_big_endian.

static inline bool virtio_vdev_is_big_endian(VirtIODevice *vdev)
{
     if (virtio_vdev_is_legacy(vdev)) {
         assert(vdev->device_endian != VIRTIO_DEVICE_ENDIAN_UNKNOWN);
         return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
     }
     /* Devices conforming to VIRTIO 1.0 or later are always LE. */
     return false;
}

The key is to understand that vdev->device_endian is initialized as
expected. It always contains cpu endianness, and not
device endianness, ignoring if device is legacy or not.

By default, it's initialized to vdev->device_endian =
virtio_default_endian(), which matches target default endianness.
Then, on virtio_reset, it will be initialized with current_cpu
endianness (if there is one current_cpu).

void virtio_reset() {
     ...
     if (current_cpu) {
         /* Guest initiated reset */
         vdev->device_endian = virtio_current_cpu_endian();
     } else {
         /* System reset */
         vdev->device_endian = virtio_default_endian();
     }

Now, we can see how existing virtio_access_is_big_endian is equivalent
to virtio_vdev_is_big_endian. Let's break the existing function in its 3
variants, and compare that to virtio_vdev_is_big_endian.

static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
- #if defined(LEGACY_VIRTIO_IS_BIENDIAN)
     return virtio_vdev_is_big_endian(vdev);
   This is the exact replacement we did, so equivalent.
- #elif TARGET_BIG_ENDIAN
     if (!virtio_vdev_is_legacy(vdev)) {
         return false;
     }
     return true;

   we know target_is_big_endian(), so
   vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG.
   if (virtio_vdev_is_legacy(vdev)) {
       return VIRTIO_DEVICE_ENDIAN_BIG == VIRTIO_DEVICE_ENDIAN_BIG;
   }
   return false;
   It's written in opposite style compared to existing code (if legacy vs
   if modern), but it's strictly equivalent.
- #else
     return false;
   we know !target_is_big_endian(), so
   vdev->device_endian == VIRTIO_DEVICE_ENDIAN_LITTLE.
   if virtio_vdev_is_legacy(vdev) {
     return VIRTIO_DEVICE_ENDIAN_LITTLE == VIRTIO_DEVICE_ENDIAN_BIG;
   }
   return false;
   So it always return false, as expected.

Signed-off-by: Pierrick Bouvier <[email protected]>
Reviewed-by: Philippe Mathieu-Daudé <[email protected]>
Acked-by: Stefan Hajnoczi <[email protected]>
Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
---
  include/hw/virtio/virtio-access.h | 14 --------------
  1 file changed, 14 deletions(-)

Reviewed-by: Richard Henderson <[email protected]>

r~


diff --git a/include/hw/virtio/virtio-access.h 
b/include/hw/virtio/virtio-access.h
index b8aa7a520f5..e3148c23881 100644
--- a/include/hw/virtio/virtio-access.h
+++ b/include/hw/virtio/virtio-access.h
@@ -21,23 +21,9 @@
  #include "hw/virtio/virtio.h"
  #include "hw/virtio/virtio-bus.h"
-#if defined(TARGET_PPC64) || defined(TARGET_ARM)
-#define LEGACY_VIRTIO_IS_BIENDIAN 1
-#endif
-
  static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
  {
-#if defined(LEGACY_VIRTIO_IS_BIENDIAN)
      return virtio_vdev_is_big_endian(vdev);
-#elif TARGET_BIG_ENDIAN
-    if (!virtio_vdev_is_legacy(vdev)) {
-        /* Devices conforming to VIRTIO 1.0 or later are always LE. */
-        return false;
-    }
-    return true;
-#else
-    return false;
-#endif
  }
static inline void virtio_stw_p(VirtIODevice *vdev, void *ptr, uint16_t v)


Reply via email to