From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43412) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WzUBg-0006vI-Jo for qemu-devel@nongnu.org; Tue, 24 Jun 2014 13:07:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WzUBW-0005YH-Sw for qemu-devel@nongnu.org; Tue, 24 Jun 2014 13:07:16 -0400 Received: from e06smtp10.uk.ibm.com ([195.75.94.106]:46809) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WzUBW-0005Xg-Ki for qemu-devel@nongnu.org; Tue, 24 Jun 2014 13:07:06 -0400 Received: from /spool/local by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 24 Jun 2014 18:07:04 +0100 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp03.portsmouth.uk.ibm.com (Postfix) with ESMTP id 3038D1B0806B for ; Tue, 24 Jun 2014 18:07:34 +0100 (BST) Received: from d06av12.portsmouth.uk.ibm.com (d06av12.portsmouth.uk.ibm.com [9.149.37.247]) by b06cxnps3075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id s5OH72Xq35848332 for ; Tue, 24 Jun 2014 17:07:02 GMT Received: from d06av12.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av12.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id s5OH71E4020826 for ; Tue, 24 Jun 2014 11:07:01 -0600 From: Greg Kurz Date: Tue, 24 Jun 2014 19:06:58 +0200 Message-ID: <20140624151955.17522.62537.stgit@bahia.local> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v9 00/22] legacy virtio support for cross-endian targets List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Peter Maydell , Stefan Hajnoczi , Juan Quintela , Rusty Russell , Alexander Graf , "Michael S. Tsirkin" , aneesh.kumar@linux.vnet.ibm.com, Anthony Liguori , Amit Shah , Paolo Bonzini , Andreas =?utf-8?q?F=C3=A4rber?= 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