Commit 78e9878c authored by David Woodhouse's avatar David Woodhouse

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: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
parent 79033beb
...@@ -5627,19 +5627,7 @@ long kvm_arch_vm_ioctl(struct file *filp, ...@@ -5627,19 +5627,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
r = -EFAULT; r = -EFAULT;
if (copy_from_user(&xhc, argp, sizeof(xhc))) if (copy_from_user(&xhc, argp, sizeof(xhc)))
goto out; goto out;
r = -EINVAL; r = kvm_xen_hvm_config(kvm, &xhc);
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;
break; break;
} }
case KVM_SET_CLOCK: { case KVM_SET_CLOCK: {
......
...@@ -79,6 +79,24 @@ int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data) ...@@ -79,6 +79,24 @@ int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data)
return 0; 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) static int kvm_xen_hypercall_set_result(struct kvm_vcpu *vcpu, u64 result)
{ {
kvm_rax_write(vcpu, result); kvm_rax_write(vcpu, result);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
int kvm_xen_hypercall(struct kvm_vcpu *vcpu); int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data); 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) static inline bool kvm_xen_hypercall_enabled(struct kvm *kvm)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment