KVM: x86/xen: Add KVM_XEN_VCPU_SET_ATTR/KVM_XEN_VCPU_GET_ATTR
authorDavid Woodhouse <dwmw@amazon.co.uk>
Tue, 2 Feb 2021 16:53:25 +0000 (16:53 +0000)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 4 Feb 2021 14:19:39 +0000 (14:19 +0000)
This will be used for per-vCPU setup such as runstate and vcpu_info.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
arch/x86/kvm/x86.c
arch/x86/kvm/xen.c
arch/x86/kvm/xen.h
include/uapi/linux/kvm.h

index 040d3d4..66cd574 100644 (file)
@@ -5016,6 +5016,26 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
        case KVM_GET_SUPPORTED_HV_CPUID:
                r = kvm_ioctl_get_supported_hv_cpuid(vcpu, argp);
                break;
+       case KVM_XEN_VCPU_GET_ATTR: {
+               struct kvm_xen_vcpu_attr xva;
+
+               r = -EFAULT;
+               if (copy_from_user(&xva, argp, sizeof(xva)))
+                       goto out;
+               r = kvm_xen_vcpu_get_attr(vcpu, &xva);
+               if (!r && copy_to_user(argp, &xva, sizeof(xva)))
+                       r = -EFAULT;
+               break;
+       }
+       case KVM_XEN_VCPU_SET_ATTR: {
+               struct kvm_xen_vcpu_attr xva;
+
+               r = -EFAULT;
+               if (copy_from_user(&xva, argp, sizeof(xva)))
+                       goto out;
+               r = kvm_xen_vcpu_set_attr(vcpu, &xva);
+               break;
+       }
        default:
                r = -EINVAL;
        }
index eab4dce..5cbf695 100644 (file)
@@ -118,6 +118,36 @@ int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
        return r;
 }
 
+int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
+{
+       int r = -ENOENT;
+
+       mutex_lock(&vcpu->kvm->lock);
+
+       switch (data->type) {
+       default:
+               break;
+       }
+
+       mutex_unlock(&vcpu->kvm->lock);
+       return r;
+}
+
+int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
+{
+       int r = -ENOENT;
+
+       mutex_lock(&vcpu->kvm->lock);
+
+       switch (data->type) {
+       default:
+               break;
+       }
+
+       mutex_unlock(&vcpu->kvm->lock);
+       return r;
+}
+
 int kvm_xen_write_hypercall_page(struct kvm_vcpu *vcpu, u64 data)
 {
        struct kvm *kvm = vcpu->kvm;
index 12a3dc3..fb85377 100644 (file)
@@ -13,6 +13,8 @@
 
 extern struct static_key_false_deferred kvm_xen_enabled;
 
+int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data);
+int kvm_xen_vcpu_get_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data);
 int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
 int kvm_xen_hvm_get_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data);
 int kvm_xen_hypercall(struct kvm_vcpu *vcpu);
index f57f6e7..e2b0cbd 100644 (file)
@@ -1587,6 +1587,7 @@ struct kvm_pv_cmd {
 /* Available with KVM_CAP_DIRTY_LOG_RING */
 #define KVM_RESET_DIRTY_RINGS          _IO(KVMIO, 0xc7)
 
+/* Per-VM Xen attributes */
 #define KVM_XEN_HVM_GET_ATTR   _IOWR(KVMIO, 0xc8, struct kvm_xen_hvm_attr)
 #define KVM_XEN_HVM_SET_ATTR   _IOW(KVMIO,  0xc9, struct kvm_xen_hvm_attr)
 
@@ -1605,6 +1606,18 @@ struct kvm_xen_hvm_attr {
 #define KVM_XEN_ATTR_TYPE_LONG_MODE            0x0
 #define KVM_XEN_ATTR_TYPE_SHARED_INFO          0x1
 
+/* Per-vCPU Xen attributes */
+#define KVM_XEN_VCPU_GET_ATTR  _IOWR(KVMIO, 0xca, struct kvm_xen_vcpu_attr)
+#define KVM_XEN_VCPU_SET_ATTR  _IOW(KVMIO,  0xcb, struct kvm_xen_vcpu_attr)
+
+struct kvm_xen_vcpu_attr {
+       __u16 type;
+       __u16 pad[3];
+       union {
+               __u64 pad[8];
+       } u;
+};
+
 /* Secure Encrypted Virtualization command */
 enum sev_cmd_id {
        /* Guest initialization commands */