summaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw@amazon.co.uk>2021-02-02 13:19:35 +0000
committerDavid Woodhouse <dwmw@amazon.co.uk>2021-02-04 14:19:38 +0000
commit78e9878cb376969d184a4b7fff392528fe17a3ce (patch)
treeddb72b6e09dce019e2e883da15908103f06a626b /arch/x86/kvm
parent79033bebf6fa3045bfa9bbe543c0eb7b43a0f4a3 (diff)
downloadlinux-78e9878cb376969d184a4b7fff392528fe17a3ce.tar.bz2
KVM: x86/xen: Move KVM_XEN_HVM_CONFIG handling to xen.c
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>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/x86.c14
-rw-r--r--arch/x86/kvm/xen.c18
-rw-r--r--arch/x86/kvm/xen.h1
3 files changed, 20 insertions, 13 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 5a41d465134d..673dcc6fde7e 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -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: {
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)
{