diff options
-rw-r--r-- | kernel/compat.c | 1 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 52 |
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 | } |
893 | EXPORT_SYMBOL_GPL(sigset_from_compat); | ||
893 | 894 | ||
894 | asmlinkage long | 895 | asmlinkage long |
895 | compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese, | 896 | compat_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 | ||
85 | static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl, | 85 | static long kvm_vcpu_ioctl(struct file *file, unsigned int ioctl, |
86 | unsigned long arg); | 86 | unsigned long arg); |
87 | #ifdef CONFIG_COMPAT | ||
88 | static long kvm_vcpu_compat_ioctl(struct file *file, unsigned int ioctl, | ||
89 | unsigned long arg); | ||
90 | #endif | ||
87 | static int hardware_enable_all(void); | 91 | static int hardware_enable_all(void); |
88 | static void hardware_disable_all(void); | 92 | static void hardware_disable_all(void); |
89 | 93 | ||
@@ -1586,7 +1590,9 @@ static int kvm_vcpu_release(struct inode *inode, struct file *filp) | |||
1586 | static struct file_operations kvm_vcpu_fops = { | 1590 | static 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 | ||
1885 | static 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 | |||
1923 | out: | ||
1924 | return r; | ||
1925 | } | ||
1926 | #endif | ||
1927 | |||
1878 | static long kvm_vm_ioctl(struct file *filp, | 1928 | static long kvm_vm_ioctl(struct file *filp, |
1879 | unsigned int ioctl, unsigned long arg) | 1929 | unsigned int ioctl, unsigned long arg) |
1880 | { | 1930 | { |