From patchwork Thu Apr 24 18:17:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 4053411 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 46223BFF02 for ; Thu, 24 Apr 2014 18:19:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0AE7E20340 for ; Thu, 24 Apr 2014 18:19:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 89A5D20179 for ; Thu, 24 Apr 2014 18:19:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758533AbaDXSR2 (ORCPT ); Thu, 24 Apr 2014 14:17:28 -0400 Received: from fw-tnat.austin.arm.com ([217.140.110.23]:20178 "EHLO collaborate-mta1.arm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754261AbaDXSR1 (ORCPT ); Thu, 24 Apr 2014 14:17:27 -0400 Received: from e102391-lin.cambridge.arm.com (e102391-lin.cambridge.arm.com [10.1.209.166]) by collaborate-mta1.arm.com (Postfix) with ESMTP id 7FA7F13FB3D; Thu, 24 Apr 2014 13:17:25 -0500 (CDT) From: Marc Zyngier To: kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Cc: Will Deacon , Pekka Enberg Subject: [PATCH v3 1/9] kvmtool: pass trapped vcpu to MMIO accessors Date: Thu, 24 Apr 2014 19:17:15 +0100 Message-Id: <1398363443-3764-2-git-send-email-marc.zyngier@arm.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1398363443-3764-1-git-send-email-marc.zyngier@arm.com> References: <1398363443-3764-1-git-send-email-marc.zyngier@arm.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In order to be able to find out about the endianness of a virtual CPU, it is necessary to pass a pointer to the kvm_cpu structure down to the MMIO accessors. This patch just pushes such pointer as far as required for the MMIO accessors to have a play with the vcpu. Signed-off-by: Marc Zyngier --- tools/kvm/arm/include/arm-common/kvm-cpu-arch.h | 4 ++-- tools/kvm/arm/kvm-cpu.c | 10 +++++----- tools/kvm/hw/pci-shmem.c | 2 +- tools/kvm/include/kvm/kvm.h | 4 ++-- tools/kvm/kvm-cpu.c | 4 ++-- tools/kvm/mmio.c | 11 ++++++----- tools/kvm/pci.c | 3 ++- tools/kvm/powerpc/include/kvm/kvm-cpu-arch.h | 2 +- tools/kvm/powerpc/kvm-cpu.c | 4 ++-- tools/kvm/powerpc/spapr_pci.h | 6 +++--- tools/kvm/virtio/mmio.c | 18 +++++++++++------- tools/kvm/virtio/pci.c | 6 ++++-- tools/kvm/x86/include/kvm/kvm-cpu-arch.h | 4 ++-- 13 files changed, 43 insertions(+), 35 deletions(-) diff --git a/tools/kvm/arm/include/arm-common/kvm-cpu-arch.h b/tools/kvm/arm/include/arm-common/kvm-cpu-arch.h index bef1761..355a02d 100644 --- a/tools/kvm/arm/include/arm-common/kvm-cpu-arch.h +++ b/tools/kvm/arm/include/arm-common/kvm-cpu-arch.h @@ -42,8 +42,8 @@ static inline bool kvm_cpu__emulate_io(struct kvm *kvm, u16 port, void *data, return false; } -bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, - u8 is_write); +bool kvm_cpu__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, + u32 len, u8 is_write); unsigned long kvm_cpu__get_vcpu_mpidr(struct kvm_cpu *vcpu); diff --git a/tools/kvm/arm/kvm-cpu.c b/tools/kvm/arm/kvm-cpu.c index 9c9616f..53afa35 100644 --- a/tools/kvm/arm/kvm-cpu.c +++ b/tools/kvm/arm/kvm-cpu.c @@ -98,17 +98,17 @@ bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu) return false; } -bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, - u8 is_write) +bool kvm_cpu__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, + u32 len, u8 is_write) { if (arm_addr_in_virtio_mmio_region(phys_addr)) { - return kvm__emulate_mmio(kvm, phys_addr, data, len, is_write); + return kvm__emulate_mmio(vcpu, phys_addr, data, len, is_write); } else if (arm_addr_in_ioport_region(phys_addr)) { int direction = is_write ? KVM_EXIT_IO_OUT : KVM_EXIT_IO_IN; u16 port = (phys_addr - KVM_IOPORT_AREA) & USHRT_MAX; - return kvm__emulate_io(kvm, port, data, direction, len, 1); + return kvm__emulate_io(vcpu->kvm, port, data, direction, len, 1); } else if (arm_addr_in_pci_region(phys_addr)) { - return kvm__emulate_mmio(kvm, phys_addr, data, len, is_write); + return kvm__emulate_mmio(vcpu, phys_addr, data, len, is_write); } return false; diff --git a/tools/kvm/hw/pci-shmem.c b/tools/kvm/hw/pci-shmem.c index 34de747..4b837eb 100644 --- a/tools/kvm/hw/pci-shmem.c +++ b/tools/kvm/hw/pci-shmem.c @@ -105,7 +105,7 @@ static struct ioport_operations shmem_pci__io_ops = { .io_out = shmem_pci__io_out, }; -static void callback_mmio_msix(u64 addr, u8 *data, u32 len, u8 is_write, void *ptr) +static void callback_mmio_msix(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len, u8 is_write, void *ptr) { void *mem; diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h index d05b936..f1b71a0 100644 --- a/tools/kvm/include/kvm/kvm.h +++ b/tools/kvm/include/kvm/kvm.h @@ -84,10 +84,10 @@ int kvm_timer__exit(struct kvm *kvm); void kvm__irq_line(struct kvm *kvm, int irq, int level); void kvm__irq_trigger(struct kvm *kvm, int irq); bool kvm__emulate_io(struct kvm *kvm, u16 port, void *data, int direction, int size, u32 count); -bool kvm__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write); +bool kvm__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write); int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr); int kvm__register_mmio(struct kvm *kvm, u64 phys_addr, u64 phys_addr_len, bool coalesce, - void (*mmio_fn)(u64 addr, u8 *data, u32 len, u8 is_write, void *ptr), + void (*mmio_fn)(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len, u8 is_write, void *ptr), void *ptr); bool kvm__deregister_mmio(struct kvm *kvm, u64 phys_addr); void kvm__pause(struct kvm *kvm); diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c index be05c49..5c70b00 100644 --- a/tools/kvm/kvm-cpu.c +++ b/tools/kvm/kvm-cpu.c @@ -54,7 +54,7 @@ static void kvm_cpu__handle_coalesced_mmio(struct kvm_cpu *cpu) while (cpu->ring->first != cpu->ring->last) { struct kvm_coalesced_mmio *m; m = &cpu->ring->coalesced_mmio[cpu->ring->first]; - kvm_cpu__emulate_mmio(cpu->kvm, + kvm_cpu__emulate_mmio(cpu, m->phys_addr, m->data, m->len, @@ -138,7 +138,7 @@ int kvm_cpu__start(struct kvm_cpu *cpu) */ kvm_cpu__handle_coalesced_mmio(cpu); - ret = kvm_cpu__emulate_mmio(cpu->kvm, + ret = kvm_cpu__emulate_mmio(cpu, cpu->kvm_run->mmio.phys_addr, cpu->kvm_run->mmio.data, cpu->kvm_run->mmio.len, diff --git a/tools/kvm/mmio.c b/tools/kvm/mmio.c index 5d65d28..705ce27f 100644 --- a/tools/kvm/mmio.c +++ b/tools/kvm/mmio.c @@ -1,4 +1,5 @@ #include "kvm/kvm.h" +#include "kvm/kvm-cpu.h" #include "kvm/rbtree-interval.h" #include "kvm/brlock.h" @@ -16,7 +17,7 @@ struct mmio_mapping { struct rb_int_node node; - void (*mmio_fn)(u64 addr, u8 *data, u32 len, u8 is_write, void *ptr); + void (*mmio_fn)(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len, u8 is_write, void *ptr); void *ptr; }; @@ -59,7 +60,7 @@ static const char *to_direction(u8 is_write) } int kvm__register_mmio(struct kvm *kvm, u64 phys_addr, u64 phys_addr_len, bool coalesce, - void (*mmio_fn)(u64 addr, u8 *data, u32 len, u8 is_write, void *ptr), + void (*mmio_fn)(struct kvm_cpu *vcpu, u64 addr, u8 *data, u32 len, u8 is_write, void *ptr), void *ptr) { struct mmio_mapping *mmio; @@ -119,7 +120,7 @@ bool kvm__deregister_mmio(struct kvm *kvm, u64 phys_addr) return true; } -bool kvm__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write) +bool kvm__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write) { struct mmio_mapping *mmio; @@ -127,9 +128,9 @@ bool kvm__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_ mmio = mmio_search(&mmio_tree, phys_addr, len); if (mmio) - mmio->mmio_fn(phys_addr, data, len, is_write, mmio->ptr); + mmio->mmio_fn(vcpu, phys_addr, data, len, is_write, mmio->ptr); else { - if (kvm->cfg.mmio_debug) + if (vcpu->kvm->cfg.mmio_debug) fprintf(stderr, "Warning: Ignoring MMIO %s at %016llx (length %u)\n", to_direction(is_write), phys_addr, len); } diff --git a/tools/kvm/pci.c b/tools/kvm/pci.c index c2da152..5d60585 100644 --- a/tools/kvm/pci.c +++ b/tools/kvm/pci.c @@ -179,7 +179,8 @@ void pci__config_rd(struct kvm *kvm, union pci_config_address addr, void *data, } } -static void pci_config_mmio_access(u64 addr, u8 *data, u32 len, u8 is_write, void *kvm) +static void pci_config_mmio_access(struct kvm_cpu *vcpu, u64 addr, u8 *data, + u32 len, u8 is_write, void *kvm) { union pci_config_address cfg_addr; diff --git a/tools/kvm/powerpc/include/kvm/kvm-cpu-arch.h b/tools/kvm/powerpc/include/kvm/kvm-cpu-arch.h index 7520c04..82cb5987 100644 --- a/tools/kvm/powerpc/include/kvm/kvm-cpu-arch.h +++ b/tools/kvm/powerpc/include/kvm/kvm-cpu-arch.h @@ -71,6 +71,6 @@ static inline bool kvm_cpu__emulate_io(struct kvm *kvm, u16 port, void *data, in return false; } -bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write); +bool kvm_cpu__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write); #endif /* KVM__KVM_CPU_ARCH_H */ diff --git a/tools/kvm/powerpc/kvm-cpu.c b/tools/kvm/powerpc/kvm-cpu.c index 8f825bd..2f5cfc6 100644 --- a/tools/kvm/powerpc/kvm-cpu.c +++ b/tools/kvm/powerpc/kvm-cpu.c @@ -193,7 +193,7 @@ bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu) return ret; } -bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write) +bool kvm_cpu__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write) { /* * FIXME: This function will need to be split in order to support @@ -204,7 +204,7 @@ bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 if ((phys_addr >= SPAPR_PCI_WIN_START) && (phys_addr < SPAPR_PCI_WIN_END)) { - ret = spapr_phb_mmio(kvm, phys_addr, data, len, is_write); + ret = spapr_phb_mmio(vcpu, phys_addr, data, len, is_write); } else { pr_warning("MMIO %s unknown address %llx (size %d)!\n", is_write ? "write to" : "read from", diff --git a/tools/kvm/powerpc/spapr_pci.h b/tools/kvm/powerpc/spapr_pci.h index 48b221c..f9cb42f 100644 --- a/tools/kvm/powerpc/spapr_pci.h +++ b/tools/kvm/powerpc/spapr_pci.h @@ -36,19 +36,19 @@ int spapr_populate_pci_devices(struct kvm *kvm, uint32_t xics_phandle, void *fdt); -static inline bool spapr_phb_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write) +static inline bool spapr_phb_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write) { if ((phys_addr >= SPAPR_PCI_IO_WIN_ADDR) && (phys_addr < SPAPR_PCI_IO_WIN_ADDR + SPAPR_PCI_IO_WIN_SIZE)) { - return kvm__emulate_io(kvm, phys_addr - SPAPR_PCI_IO_WIN_ADDR, + return kvm__emulate_io(vcpu->kvm, phys_addr - SPAPR_PCI_IO_WIN_ADDR, data, is_write ? KVM_EXIT_IO_OUT : KVM_EXIT_IO_IN, len, 1); } else if ((phys_addr >= SPAPR_PCI_MEM_WIN_ADDR) && (phys_addr < SPAPR_PCI_MEM_WIN_ADDR + SPAPR_PCI_MEM_WIN_SIZE)) { - return kvm__emulate_mmio(kvm, phys_addr - SPAPR_PCI_MEM_WIN_ADDR, + return kvm__emulate_mmio(vcpu, phys_addr - SPAPR_PCI_MEM_WIN_ADDR, data, len, is_write); } return false; diff --git a/tools/kvm/virtio/mmio.c b/tools/kvm/virtio/mmio.c index e1fca2b..9d385e2 100644 --- a/tools/kvm/virtio/mmio.c +++ b/tools/kvm/virtio/mmio.c @@ -88,7 +88,8 @@ int virtio_mmio_signal_config(struct kvm *kvm, struct virtio_device *vdev) return 0; } -static void virtio_mmio_device_specific(u64 addr, u8 *data, u32 len, +static void virtio_mmio_device_specific(struct kvm_cpu *vcpu, + u64 addr, u8 *data, u32 len, u8 is_write, struct virtio_device *vdev) { struct virtio_mmio *vmmio = vdev->virtio; @@ -104,7 +105,8 @@ static void virtio_mmio_device_specific(u64 addr, u8 *data, u32 len, } } -static void virtio_mmio_config_in(u64 addr, void *data, u32 len, +static void virtio_mmio_config_in(struct kvm_cpu *vcpu, + u64 addr, void *data, u32 len, struct virtio_device *vdev) { struct virtio_mmio *vmmio = vdev->virtio; @@ -140,7 +142,8 @@ static void virtio_mmio_config_in(u64 addr, void *data, u32 len, } } -static void virtio_mmio_config_out(u64 addr, void *data, u32 len, +static void virtio_mmio_config_out(struct kvm_cpu *vcpu, + u64 addr, void *data, u32 len, struct virtio_device *vdev) { struct virtio_mmio *vmmio = vdev->virtio; @@ -202,7 +205,8 @@ static void virtio_mmio_config_out(u64 addr, void *data, u32 len, }; } -static void virtio_mmio_mmio_callback(u64 addr, u8 *data, u32 len, +static void virtio_mmio_mmio_callback(struct kvm_cpu *vcpu, + u64 addr, u8 *data, u32 len, u8 is_write, void *ptr) { struct virtio_device *vdev = ptr; @@ -211,14 +215,14 @@ static void virtio_mmio_mmio_callback(u64 addr, u8 *data, u32 len, if (offset >= VIRTIO_MMIO_CONFIG) { offset -= VIRTIO_MMIO_CONFIG; - virtio_mmio_device_specific(offset, data, len, is_write, ptr); + virtio_mmio_device_specific(vcpu, offset, data, len, is_write, ptr); return; } if (is_write) - virtio_mmio_config_out(offset, data, len, ptr); + virtio_mmio_config_out(vcpu, offset, data, len, ptr); else - virtio_mmio_config_in(offset, data, len, ptr); + virtio_mmio_config_in(vcpu, offset, data, len, ptr); } #ifdef CONFIG_HAS_LIBFDT diff --git a/tools/kvm/virtio/pci.c b/tools/kvm/virtio/pci.c index 665d492..57ccde6 100644 --- a/tools/kvm/virtio/pci.c +++ b/tools/kvm/virtio/pci.c @@ -240,7 +240,8 @@ static struct ioport_operations virtio_pci__io_ops = { .io_out = virtio_pci__io_out, }; -static void virtio_pci__msix_mmio_callback(u64 addr, u8 *data, u32 len, +static void virtio_pci__msix_mmio_callback(struct kvm_cpu *vcpu, + u64 addr, u8 *data, u32 len, u8 is_write, void *ptr) { struct virtio_pci *vpci = ptr; @@ -321,7 +322,8 @@ int virtio_pci__signal_config(struct kvm *kvm, struct virtio_device *vdev) return 0; } -static void virtio_pci__io_mmio_callback(u64 addr, u8 *data, u32 len, +static void virtio_pci__io_mmio_callback(struct kvm_cpu *vcpu, + u64 addr, u8 *data, u32 len, u8 is_write, void *ptr) { struct virtio_pci *vpci = ptr; diff --git a/tools/kvm/x86/include/kvm/kvm-cpu-arch.h b/tools/kvm/x86/include/kvm/kvm-cpu-arch.h index 198efe6..fd86b4d 100644 --- a/tools/kvm/x86/include/kvm/kvm-cpu-arch.h +++ b/tools/kvm/x86/include/kvm/kvm-cpu-arch.h @@ -41,9 +41,9 @@ static inline bool kvm_cpu__emulate_io(struct kvm *kvm, u16 port, void *data, in return kvm__emulate_io(kvm, port, data, direction, size, count); } -static inline bool kvm_cpu__emulate_mmio(struct kvm *kvm, u64 phys_addr, u8 *data, u32 len, u8 is_write) +static inline bool kvm_cpu__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write) { - return kvm__emulate_mmio(kvm, phys_addr, data, len, is_write); + return kvm__emulate_mmio(vcpu, phys_addr, data, len, is_write); } #endif /* KVM__KVM_CPU_ARCH_H */