mirror of https://github.com/proxmox/mirror_qemu
virtio: endianness checks for virtio 1.0 devices
Add code that checks for the VERSION_1 feature bit in order to make decisions about the device's endianness. This allows us to support transitional devices. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>master
parent
24bfa207ef
commit
3c185597c8
|
@ -903,7 +903,11 @@ static bool virtio_device_endian_needed(void *opaque)
|
||||||
VirtIODevice *vdev = opaque;
|
VirtIODevice *vdev = opaque;
|
||||||
|
|
||||||
assert(vdev->device_endian != VIRTIO_DEVICE_ENDIAN_UNKNOWN);
|
assert(vdev->device_endian != VIRTIO_DEVICE_ENDIAN_UNKNOWN);
|
||||||
return vdev->device_endian != virtio_default_endian();
|
if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) {
|
||||||
|
return vdev->device_endian != virtio_default_endian();
|
||||||
|
}
|
||||||
|
/* Devices conforming to VIRTIO 1.0 or later are always LE. */
|
||||||
|
return vdev->device_endian != VIRTIO_DEVICE_ENDIAN_LITTLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool virtio_64bit_features_needed(void *opaque)
|
static bool virtio_64bit_features_needed(void *opaque)
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
|
|
||||||
static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
|
static inline bool virtio_access_is_big_endian(VirtIODevice *vdev)
|
||||||
{
|
{
|
||||||
|
if (virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) {
|
||||||
|
/* Devices conforming to VIRTIO 1.0 or later are always LE. */
|
||||||
|
return false;
|
||||||
|
}
|
||||||
#if defined(TARGET_IS_BIENDIAN)
|
#if defined(TARGET_IS_BIENDIAN)
|
||||||
return virtio_is_big_endian(vdev);
|
return virtio_is_big_endian(vdev);
|
||||||
#elif defined(TARGET_WORDS_BIGENDIAN)
|
#elif defined(TARGET_WORDS_BIGENDIAN)
|
||||||
|
|
|
@ -252,7 +252,11 @@ static inline bool virtio_has_feature(VirtIODevice *vdev, unsigned int fbit)
|
||||||
|
|
||||||
static inline bool virtio_is_big_endian(VirtIODevice *vdev)
|
static inline bool virtio_is_big_endian(VirtIODevice *vdev)
|
||||||
{
|
{
|
||||||
assert(vdev->device_endian != VIRTIO_DEVICE_ENDIAN_UNKNOWN);
|
if (!virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) {
|
||||||
return vdev->device_endian == VIRTIO_DEVICE_ENDIAN_BIG;
|
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;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue