|
@@ -828,11 +828,51 @@ static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int kvm_arm_vcpu_set_attr(struct kvm_vcpu *vcpu,
|
|
|
+ struct kvm_device_attr *attr)
|
|
|
+{
|
|
|
+ int ret = -ENXIO;
|
|
|
+
|
|
|
+ switch (attr->group) {
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int kvm_arm_vcpu_get_attr(struct kvm_vcpu *vcpu,
|
|
|
+ struct kvm_device_attr *attr)
|
|
|
+{
|
|
|
+ int ret = -ENXIO;
|
|
|
+
|
|
|
+ switch (attr->group) {
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static int kvm_arm_vcpu_has_attr(struct kvm_vcpu *vcpu,
|
|
|
+ struct kvm_device_attr *attr)
|
|
|
+{
|
|
|
+ int ret = -ENXIO;
|
|
|
+
|
|
|
+ switch (attr->group) {
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
long kvm_arch_vcpu_ioctl(struct file *filp,
|
|
|
unsigned int ioctl, unsigned long arg)
|
|
|
{
|
|
|
struct kvm_vcpu *vcpu = filp->private_data;
|
|
|
void __user *argp = (void __user *)arg;
|
|
|
+ struct kvm_device_attr attr;
|
|
|
|
|
|
switch (ioctl) {
|
|
|
case KVM_ARM_VCPU_INIT: {
|
|
@@ -875,6 +915,21 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|
|
return -E2BIG;
|
|
|
return kvm_arm_copy_reg_indices(vcpu, user_list->reg);
|
|
|
}
|
|
|
+ case KVM_SET_DEVICE_ATTR: {
|
|
|
+ if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
+ return -EFAULT;
|
|
|
+ return kvm_arm_vcpu_set_attr(vcpu, &attr);
|
|
|
+ }
|
|
|
+ case KVM_GET_DEVICE_ATTR: {
|
|
|
+ if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
+ return -EFAULT;
|
|
|
+ return kvm_arm_vcpu_get_attr(vcpu, &attr);
|
|
|
+ }
|
|
|
+ case KVM_HAS_DEVICE_ATTR: {
|
|
|
+ if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
+ return -EFAULT;
|
|
|
+ return kvm_arm_vcpu_has_attr(vcpu, &attr);
|
|
|
+ }
|
|
|
default:
|
|
|
return -EINVAL;
|
|
|
}
|