|
@@ -1003,66 +1003,88 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|
|
struct kvm_vcpu *vcpu = filp->private_data;
|
|
|
void __user *argp = (void __user *)arg;
|
|
|
struct kvm_device_attr attr;
|
|
|
+ long r;
|
|
|
+
|
|
|
+ vcpu_load(vcpu);
|
|
|
|
|
|
switch (ioctl) {
|
|
|
case KVM_ARM_VCPU_INIT: {
|
|
|
struct kvm_vcpu_init init;
|
|
|
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(&init, argp, sizeof(init)))
|
|
|
- return -EFAULT;
|
|
|
+ break;
|
|
|
|
|
|
- return kvm_arch_vcpu_ioctl_vcpu_init(vcpu, &init);
|
|
|
+ r = kvm_arch_vcpu_ioctl_vcpu_init(vcpu, &init);
|
|
|
+ break;
|
|
|
}
|
|
|
case KVM_SET_ONE_REG:
|
|
|
case KVM_GET_ONE_REG: {
|
|
|
struct kvm_one_reg reg;
|
|
|
|
|
|
+ r = -ENOEXEC;
|
|
|
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
|
|
- return -ENOEXEC;
|
|
|
+ break;
|
|
|
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(®, argp, sizeof(reg)))
|
|
|
- return -EFAULT;
|
|
|
+ break;
|
|
|
+
|
|
|
if (ioctl == KVM_SET_ONE_REG)
|
|
|
- return kvm_arm_set_reg(vcpu, ®);
|
|
|
+ r = kvm_arm_set_reg(vcpu, ®);
|
|
|
else
|
|
|
- return kvm_arm_get_reg(vcpu, ®);
|
|
|
+ r = kvm_arm_get_reg(vcpu, ®);
|
|
|
+ break;
|
|
|
}
|
|
|
case KVM_GET_REG_LIST: {
|
|
|
struct kvm_reg_list __user *user_list = argp;
|
|
|
struct kvm_reg_list reg_list;
|
|
|
unsigned n;
|
|
|
|
|
|
+ r = -ENOEXEC;
|
|
|
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
|
|
- return -ENOEXEC;
|
|
|
+ break;
|
|
|
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(®_list, user_list, sizeof(reg_list)))
|
|
|
- return -EFAULT;
|
|
|
+ break;
|
|
|
n = reg_list.n;
|
|
|
reg_list.n = kvm_arm_num_regs(vcpu);
|
|
|
if (copy_to_user(user_list, ®_list, sizeof(reg_list)))
|
|
|
- return -EFAULT;
|
|
|
+ break;
|
|
|
+ r = -E2BIG;
|
|
|
if (n < reg_list.n)
|
|
|
- return -E2BIG;
|
|
|
- return kvm_arm_copy_reg_indices(vcpu, user_list->reg);
|
|
|
+ break;
|
|
|
+ r = kvm_arm_copy_reg_indices(vcpu, user_list->reg);
|
|
|
+ break;
|
|
|
}
|
|
|
case KVM_SET_DEVICE_ATTR: {
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
- return -EFAULT;
|
|
|
- return kvm_arm_vcpu_set_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
+ r = kvm_arm_vcpu_set_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
}
|
|
|
case KVM_GET_DEVICE_ATTR: {
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
- return -EFAULT;
|
|
|
- return kvm_arm_vcpu_get_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
+ r = kvm_arm_vcpu_get_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
}
|
|
|
case KVM_HAS_DEVICE_ATTR: {
|
|
|
+ r = -EFAULT;
|
|
|
if (copy_from_user(&attr, argp, sizeof(attr)))
|
|
|
- return -EFAULT;
|
|
|
- return kvm_arm_vcpu_has_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
+ r = kvm_arm_vcpu_has_attr(vcpu, &attr);
|
|
|
+ break;
|
|
|
}
|
|
|
default:
|
|
|
- return -EINVAL;
|
|
|
+ r = -EINVAL;
|
|
|
}
|
|
|
+
|
|
|
+ vcpu_put(vcpu);
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
/**
|