From: David Woodhouse <dwmw@xxxxxxxxxxxx> This is already more complex than the simple memcpy it originally had. Move it to xen.c with the rest of the Xen support. Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx> --- arch/x86/kvm/x86.c | 14 +------------- arch/x86/kvm/xen.c | 18 ++++++++++++++++++ arch/x86/kvm/xen.h | 1 + 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 4b948c4cd48e..a74ae5f70bdc 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -5607,19 +5607,7 @@ long kvm_arch_vm_ioctl(struct file *filp, r = -EFAULT; if (copy_from_user(&xhc, argp, sizeof(xhc))) goto out; - r = -EINVAL; - if (xhc.flags & ~KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL) - goto out; - /* - * With hypercall interception the kernel generates its own - * hypercall page so it must not be provided. - */ - if ((xhc.flags & KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL) && - (xhc.blob_addr_32 || xhc.blob_addr_64 || - xhc.blob_size_32 || xhc.blob_size_64)) - goto out; - memcpy(&kvm->arch.xen_hvm_config, &xhc, sizeof(xhc)); - r = 0; + r = kvm_xen_hvm_config(kvm, &xhc); break; } case KVM_SET_CLOCK: { diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c index 19bcb2bfba86..b52549fc6dbc 100644 --- a/arch/x86/kvm/xen.c +++ b/arch/x86/kvm/xen.c @@ -79,6 +79,24 @@ int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data) return 0; } +int kvm_xen_hvm_config(struct kvm *kvm, struct kvm_xen_hvm_config *xhc) +{ + if (xhc->flags & ~KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL) + return -EINVAL; + + /* + * With hypercall interception the kernel generates its own + * hypercall page so it must not be provided. + */ + if ((xhc->flags & KVM_XEN_HVM_CONFIG_INTERCEPT_HCALL) && + (xhc->blob_addr_32 || xhc->blob_addr_64 || + xhc->blob_size_32 || xhc->blob_size_64)) + return -EINVAL; + + memcpy(&kvm->arch.xen_hvm_config, xhc, sizeof(*xhc)); + return 0; +} + static int kvm_xen_hypercall_set_result(struct kvm_vcpu *vcpu, u64 result) { kvm_rax_write(vcpu, result); diff --git a/arch/x86/kvm/xen.h b/arch/x86/kvm/xen.h index 276ed59e476b..28e9c9892628 100644 --- a/arch/x86/kvm/xen.h +++ b/arch/x86/kvm/xen.h @@ -11,6 +11,7 @@ int kvm_xen_hypercall(struct kvm_vcpu *vcpu); int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data); +int kvm_xen_hvm_config(struct kvm *kvm, struct kvm_xen_hvm_config *xhc); static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm) { -- 2.29.2