From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rusty Russell Subject: [RFC 1/5] KVM: Move KVM_SET_ONE_REG/KVM_GET_ONE_REG to generic code. Date: Wed, 29 Aug 2012 09:15:42 +0930 Message-ID: <871uiqa8d5.fsf@rustcorp.com.au> References: <877gsia8rm.fsf@rustcorp.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: kvmarm@lists.cs.columbia.edu, kvm-devel To: Avi Kivity , Christoffer Dall , Alexander Graf , Peter Maydell Return-path: Received: from ozlabs.org ([203.10.76.45]:33107 "EHLO ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752829Ab2H1XtR (ORCPT ); Tue, 28 Aug 2012 19:49:17 -0400 In-Reply-To: <877gsia8rm.fsf@rustcorp.com.au> Sender: kvm-owner@vger.kernel.org List-ID: Avi has indicated that this is the future. For now, make it dependent on KVM_HAVE_ONE_REG (and define that for PPC and S/390). Signed-off-by: Rusty Russell diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index a29e091..7506652 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -49,6 +49,7 @@ #include #define KVM_ARCH_WANT_MMU_NOTIFIER +#define KVM_HAVE_ONE_REG struct kvm; extern int kvm_unmap_hva(struct kvm *kvm, unsigned long hva); diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 83e929e..8c711f1 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -535,7 +535,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, return 0; } -int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; @@ -550,7 +550,7 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) return r; } -int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 05c28f5..add88a9 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c @@ -899,7 +899,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, return 0; } -int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; @@ -915,7 +915,7 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) return r; } -int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index d25a097..d239e8e 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c @@ -1219,12 +1219,12 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, return kvmppc_core_set_sregs(vcpu, sregs); } -int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { return -EINVAL; } -int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) +int kvm_arch_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { return -EINVAL; } diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 879b14a..21cd47b 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -228,7 +228,6 @@ int kvm_dev_ioctl_check_extension(long ext) case KVM_CAP_PPC_UNSET_IRQ: case KVM_CAP_PPC_IRQ_LEVEL: case KVM_CAP_ENABLE_CAP: - case KVM_CAP_ONE_REG: r = 1; break; #ifndef CONFIG_KVM_BOOK3S_64_HV @@ -708,20 +707,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp, break; } - case KVM_SET_ONE_REG: - case KVM_GET_ONE_REG: - { - struct kvm_one_reg reg; - r = -EFAULT; - if (copy_from_user(®, argp, sizeof(reg))) - goto out; - if (ioctl == KVM_SET_ONE_REG) - r = kvm_vcpu_ioctl_set_one_reg(vcpu, ®); - else - r = kvm_vcpu_ioctl_get_one_reg(vcpu, ®); - break; - } - #if defined(CONFIG_KVM_E500V2) || defined(CONFIG_KVM_E500MC) case KVM_DIRTY_TLB: { struct kvm_dirty_tlb dirty; diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h index b784154..9adb19d 100644 --- a/arch/s390/include/asm/kvm_host.h +++ b/arch/s390/include/asm/kvm_host.h @@ -23,6 +23,7 @@ #define KVM_MEMORY_SLOTS 32 /* memory slots that does not exposed to userspace */ #define KVM_PRIVATE_MEM_SLOTS 4 +#define KVM_HAVE_ONE_REG struct sca_entry { atomic_t scn; diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index e83df7f..916cf1d 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -139,7 +139,6 @@ int kvm_dev_ioctl_check_extension(long ext) case KVM_CAP_S390_UCONTROL: #endif case KVM_CAP_SYNC_REGS: - case KVM_CAP_ONE_REG: r = 1; break; case KVM_CAP_NR_VCPUS: @@ -447,8 +446,7 @@ int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) return 0; } -static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, - struct kvm_one_reg *reg) +int kvm_arch_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; @@ -476,8 +474,7 @@ static int kvm_arch_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, return r; } -static int kvm_arch_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, - struct kvm_one_reg *reg) +int kvm_arch_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) { int r = -EINVAL; @@ -839,18 +836,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp, case KVM_S390_INITIAL_RESET: r = kvm_arch_vcpu_ioctl_initial_reset(vcpu); break; - case KVM_SET_ONE_REG: - case KVM_GET_ONE_REG: { - struct kvm_one_reg reg; - r = -EFAULT; - if (copy_from_user(®, argp, sizeof(reg))) - break; - if (ioctl == KVM_SET_ONE_REG) - r = kvm_arch_vcpu_ioctl_set_one_reg(vcpu, ®); - else - r = kvm_arch_vcpu_ioctl_get_one_reg(vcpu, ®); - break; - } #ifdef CONFIG_KVM_S390_UCONTROL case KVM_S390_UCAS_MAP: { struct kvm_s390_ucas_mapping ucasmap; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index d2b897e..f3d43c3 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -566,6 +566,12 @@ void kvm_arch_hardware_unsetup(void); void kvm_arch_check_processor_compat(void *rtn); int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu); +#ifdef KVM_HAVE_ONE_REG +int kvm_arch_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); +int kvm_arch_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg); +#define KVM_REG_LEN(index) \ + (1U << (((index) & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT)) +#endif void kvm_free_physmem(struct kvm *kvm); @@ -962,5 +968,6 @@ static inline bool kvm_vcpu_eligible_for_directed_yield(struct kvm_vcpu *vcpu) } #endif /* CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT */ + #endif diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index a2e85af..ad67cf4 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1935,6 +1935,21 @@ out_free2: r = 0; break; } +#ifdef KVM_HAVE_ONE_REG + case KVM_SET_ONE_REG: + case KVM_GET_ONE_REG: { + struct kvm_one_reg reg; + r = -EFAULT; + if (copy_from_user(®, argp, sizeof(reg))) + goto out; + if (ioctl == KVM_SET_ONE_REG) + r = kvm_arch_set_reg(vcpu, ®); + else + r = kvm_arch_get_reg(vcpu, ®); + break; + } +#endif + default: r = kvm_arch_vcpu_ioctl(filp, ioctl, arg); } @@ -2246,6 +2261,9 @@ static long kvm_dev_ioctl_check_extension_generic(long arg) #ifdef CONFIG_HAVE_KVM_MSI case KVM_CAP_SIGNAL_MSI: #endif +#ifdef KVM_HAVE_ONE_REG + case KVM_CAP_ONE_REG: +#endif return 1; #ifdef KVM_CAP_IRQ_ROUTING case KVM_CAP_IRQ_ROUTING: