From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marc Zyngier Subject: [PATCH v3 3/9] kvmtool: sample CPU endianness on virtio-mmio device reset Date: Thu, 24 Apr 2014 19:17:17 +0100 Message-ID: <1398363443-3764-4-git-send-email-marc.zyngier@arm.com> References: <1398363443-3764-1-git-send-email-marc.zyngier@arm.com> Cc: Will Deacon , Pekka Enberg To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Return-path: Received: from fw-tnat.austin.arm.com ([217.140.110.23]:20279 "EHLO collaborate-mta1.arm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758655AbaDXSR2 (ORCPT ); Thu, 24 Apr 2014 14:17:28 -0400 In-Reply-To: <1398363443-3764-1-git-send-email-marc.zyngier@arm.com> Sender: kvm-owner@vger.kernel.org List-ID: Save the CPU endianness when the device is reset. It is widely assumed that the guest won't change its endianness after, or at least not without reseting the device first. A default implementation of the endianness sampling just returns the default "host endianness" value so that unsuspecting architectures are not affected. Signed-off-by: Marc Zyngier --- tools/kvm/include/kvm/kvm-cpu.h | 1 + tools/kvm/include/kvm/virtio.h | 1 + tools/kvm/kvm-cpu.c | 6 ++++++ tools/kvm/virtio/mmio.c | 3 +++ 4 files changed, 11 insertions(+) diff --git a/tools/kvm/include/kvm/kvm-cpu.h b/tools/kvm/include/kvm/kvm-cpu.h index 0ece28c..aa0cb54 100644 --- a/tools/kvm/include/kvm/kvm-cpu.h +++ b/tools/kvm/include/kvm/kvm-cpu.h @@ -15,6 +15,7 @@ void kvm_cpu__run(struct kvm_cpu *vcpu); void kvm_cpu__reboot(struct kvm *kvm); int kvm_cpu__start(struct kvm_cpu *cpu); bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu); +int kvm_cpu__get_endianness(struct kvm_cpu *vcpu); int kvm_cpu__get_debug_fd(void); void kvm_cpu__set_debug_fd(int fd); diff --git a/tools/kvm/include/kvm/virtio.h b/tools/kvm/include/kvm/virtio.h index f6bddd9..1180a3e 100644 --- a/tools/kvm/include/kvm/virtio.h +++ b/tools/kvm/include/kvm/virtio.h @@ -132,6 +132,7 @@ struct virtio_device { bool use_vhost; void *virtio; struct virtio_ops *ops; + u16 endian; }; struct virtio_ops { diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c index 5c70b00..9575b32 100644 --- a/tools/kvm/kvm-cpu.c +++ b/tools/kvm/kvm-cpu.c @@ -3,6 +3,7 @@ #include "kvm/symbol.h" #include "kvm/util.h" #include "kvm/kvm.h" +#include "kvm/virtio.h" #include #include @@ -14,6 +15,11 @@ extern __thread struct kvm_cpu *current_kvm_cpu; +int __attribute__((weak)) kvm_cpu__get_endianness(struct kvm_cpu *vcpu) +{ + return VIRTIO_ENDIAN_HOST; +} + void kvm_cpu__enable_singlestep(struct kvm_cpu *vcpu) { struct kvm_guest_debug debug = { diff --git a/tools/kvm/virtio/mmio.c b/tools/kvm/virtio/mmio.c index 9d385e2..3a2bd62 100644 --- a/tools/kvm/virtio/mmio.c +++ b/tools/kvm/virtio/mmio.c @@ -4,6 +4,7 @@ #include "kvm/ioport.h" #include "kvm/virtio.h" #include "kvm/kvm.h" +#include "kvm/kvm-cpu.h" #include "kvm/irq.h" #include "kvm/fdt.h" @@ -159,6 +160,8 @@ static void virtio_mmio_config_out(struct kvm_cpu *vcpu, break; case VIRTIO_MMIO_STATUS: vmmio->hdr.status = ioport__read32(data); + if (!vmmio->hdr.status) /* Sample endianness on reset */ + vdev->endian = kvm_cpu__get_endianness(vcpu); if (vdev->ops->notify_status) vdev->ops->notify_status(kvm, vmmio->dev, vmmio->hdr.status); break; -- 1.8.3.4