The current legacy virtio devices have a fundamental flaw: they all share data between host and guest with guest endianness ordering. This is ok for nearly all architectures that have fixed endianness. Unfortunately, it breaks for recent PPC64 and ARM targets that can change endianness at runtime. The virtio-1.0 specification fixes the issue by enforcing little-endian ordering. It may take some time though until the code for 1.0 gets available and supported, and all the users can migrate. There have been discussions for some monthes about supporting such oddity: now we have little-endian PPC64 distros available, it is worth to propose something.
This patch set brings legacy virtio support for cross-endian targets. The rationale is that we add a new device_endianness property to VirtIODevice. This property is used as a runtime indicator to decide wether we should do little-endian or big-endian conversion, as opposed to the compile time choice we have now with TARGTE_WORDS_BIGENDIAN. The choice was made to sample the device endianness out of the endianness mode of the guest CPU that does the reset. It is an evil but logical consequence of the initial flaw in the virtio specification, and it was agreed that the concept would be a good common base for ARM and PPC64 enablement at least. Please note also that this new property is state and must be preserved across migrations. There are several parts in the serie: - patches 1 and 2 are simple fixes - patches 3 to 9 introduce VMState based subsections in the virtio migration code. This is needed because we introduce a new property in VirtIODevice that we want to migrate without ruining compatibility efforts - patches 10 to 13 bring virtio device endianness and memory accessors to be used by the virtio code - patches 14 to 20 wire the new memory accessors everywhere accross the virtio code - patch 21 is the PPC64 enablement - patch 22 is a follow-up workaround to disable vhost-net acceleration in the case the host and guest have different endianness, because it is not supported for the moment Changes since v8 are provided in each patch. Cheers. --- Alexander Graf (1): virtio-serial: don't migrate the config space Cédric Le Goater (1): virtio-net: byteswap virtio-net header Greg Kurz (14): virtio: introduce device specific migration calls virtio-net: implement per-device migration calls virtio-blk: implement per-device migration calls virtio-serial: implement per-device migration calls virtio-balloon: implement per-device migration calls virtio-rng: implement per-device migration calls virtio: add subsections to the migration stream exec: introduce target_words_bigendian() helper cpu: introduce CPUClass::virtio_is_big_endian() virtio: add endian-ambivalent support to VirtIODevice virtio: memory accessors for endian-ambivalent targets virtio-9p: use virtio wrappers to access headers target-ppc: enable virtio endian ambivalent support vhost-net: disable when cross-endian Rusty Russell (6): virtio: allow byte swapping for vring virtio-net: use virtio wrappers to access headers virtio-balloon: use virtio wrappers to access page frame numbers virtio-blk: use virtio wrappers to access headers virtio-scsi: use virtio wrappers to access headers virtio-serial-bus: use virtio wrappers to access headers exec.c | 8 - hw/9pfs/virtio-9p-device.c | 3 - hw/block/virtio-blk.c | 62 ++++++----- hw/char/virtio-serial-bus.c | 94 ++++++++++------ hw/net/vhost_net.c | 19 +++ hw/net/virtio-net.c | 56 +++++++--- hw/scsi/virtio-scsi.c | 40 ++++--- hw/virtio/virtio-balloon.c | 33 +++--- hw/virtio/virtio-pci.c | 11 +- hw/virtio/virtio-rng.c | 12 +- hw/virtio/virtio.c | 216 ++++++++++++++++++++++++++++--------- include/hw/virtio/virtio-access.h | 170 +++++++++++++++++++++++++++++ include/hw/virtio/virtio.h | 17 +++ include/qom/cpu.h | 1 qom/cpu.c | 6 + target-ppc/cpu.h | 2 target-ppc/translate_init.c | 15 +++ 17 files changed, 583 insertions(+), 182 deletions(-) create mode 100644 include/hw/virtio/virtio-access.h -- Greg