aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/compat.c1
-rw-r--r--virt/kvm/kvm_main.c52
2 files changed, 52 insertions, 1 deletions
diff --git a/kernel/compat.c b/kernel/compat.c
index fc9eb093acd5..18197ae2d465 100644
--- a/kernel/compat.c
+++ b/kernel/compat.c
@@ -890,6 +890,7 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat)
890 case 1: set->sig[0] = compat->sig[0] | (((long)compat->sig[1]) << 32 ); 890 case 1: set->sig[0] = compat->sig[0] | (((long)compat->sig[1]) << 32 );
891 } 891 }
892} 892}
893EXPORT_SYMBOL_GPL(sigset_from_compat);
893 894
894asmlinkage long 895asmlinkage long
895compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese, 896compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index fa2321ac77cc..11d2783eb9df 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -84,6 +84,10 @@ struct dentry *kvm_debugfs_dir;
84 84
85static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl, 85static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl,
86 unsigned long arg); 86 unsigned long arg);
87#ifdef CONFIG_COMPAT
88static long kvm_vcpu_compat_ioctl(struct file *file, unsigned int ioctl,
89 unsigned long arg);
90#endif
87static int hardware_enable_all(void); 91static int hardware_enable_all(void);
88static void hardware_disable_all(void); 92static void hardware_disable_all(void);
89 93
@@ -1586,7 +1590,9 @@ static int kvm_vcpu_release(struct inode *inode, struct file *filp)
1586static struct file_operations kvm_vcpu_fops = { 1590static struct file_operations kvm_vcpu_fops = {
1587 .release = kvm_vcpu_release, 1591 .release = kvm_vcpu_release,
1588 .unlocked_ioctl = kvm_vcpu_ioctl, 1592 .unlocked_ioctl = kvm_vcpu_ioctl,
1589 .compat_ioctl = kvm_vcpu_ioctl, 1593#ifdef CONFIG_COMPAT
1594 .compat_ioctl = kvm_vcpu_compat_ioctl,
1595#endif
1590 .mmap = kvm_vcpu_mmap, 1596 .mmap = kvm_vcpu_mmap,
1591 .llseek = noop_llseek, 1597 .llseek = noop_llseek,
1592}; 1598};
@@ -1875,6 +1881,50 @@ out:
1875 return r; 1881 return r;
1876} 1882}
1877 1883
1884#ifdef CONFIG_COMPAT
1885static long kvm_vcpu_compat_ioctl(struct file *filp,
1886 unsigned int ioctl, unsigned long arg)
1887{
1888 struct kvm_vcpu *vcpu = filp->private_data;
1889 void __user *argp = compat_ptr(arg);
1890 int r;
1891
1892 if (vcpu->kvm->mm != current->mm)
1893 return -EIO;
1894
1895 switch (ioctl) {
1896 case KVM_SET_SIGNAL_MASK: {
1897 struct kvm_signal_mask __user *sigmask_arg = argp;
1898 struct kvm_signal_mask kvm_sigmask;
1899 compat_sigset_t csigset;
1900 sigset_t sigset;
1901
1902 if (argp) {
1903 r = -EFAULT;
1904 if (copy_from_user(&kvm_sigmask, argp,
1905 sizeof kvm_sigmask))
1906 goto out;
1907 r = -EINVAL;
1908 if (kvm_sigmask.len != sizeof csigset)
1909 goto out;
1910 r = -EFAULT;
1911 if (copy_from_user(&csigset, sigmask_arg->sigset,
1912 sizeof csigset))
1913 goto out;
1914 }
1915 sigset_from_compat(&sigset, &csigset);
1916 r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset);
1917 break;
1918 }
1919 default:
1920 r = kvm_vcpu_ioctl(filp, ioctl, arg);
1921 }
1922
1923out:
1924 return r;
1925}
1926#endif
1927
1878static long kvm_vm_ioctl(struct file *filp, 1928static long kvm_vm_ioctl(struct file *filp,
1879 unsigned int ioctl, unsigned long arg) 1929 unsigned int ioctl, unsigned long arg)
1880{ 1930{