KVM: x86/xen: Move KVM_XEN_HVM_CONFIG handling to xen.c
authorDavid Woodhouse <dwmw@amazon.co.uk>
Tue, 2 Feb 2021 13:19:35 +0000 (13:19 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 4 Feb 2021 14:19:38 +0000 (14:19 +0000)
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@amazon.co.uk>
arch/x86/kvm/x86.c
arch/x86/kvm/xen.c
arch/x86/kvm/xen.h

index 5a41d46..673dcc6 100644 (file)
@@ -5627,19 +5627,7 @@ set_pit2_out:
                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: {
index 19bcb2b..b52549f 100644 (file)
@@ -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);
index 276ed59..28e9c98 100644 (file)
@@ -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)
 {