return 0;
 }
 
+#ifdef CONFIG_KVM_COMPAT
+/* for KVM_X86_SET_MSR_FILTER */
+struct kvm_msr_filter_range_compat {
+       __u32 flags;
+       __u32 nmsrs;
+       __u32 base;
+       __u32 bitmap;
+};
+
+struct kvm_msr_filter_compat {
+       __u32 flags;
+       struct kvm_msr_filter_range_compat ranges[KVM_MSR_FILTER_MAX_RANGES];
+};
+
+#define KVM_X86_SET_MSR_FILTER_COMPAT _IOW(KVMIO, 0xc6, struct kvm_msr_filter_compat)
+
+long kvm_arch_vm_compat_ioctl(struct file *filp, unsigned int ioctl,
+                             unsigned long arg)
+{
+       void __user *argp = (void __user *)arg;
+       struct kvm *kvm = filp->private_data;
+       long r = -ENOTTY;
+
+       switch (ioctl) {
+       case KVM_X86_SET_MSR_FILTER_COMPAT: {
+               struct kvm_msr_filter __user *user_msr_filter = argp;
+               struct kvm_msr_filter_compat filter_compat;
+               struct kvm_msr_filter filter;
+               int i;
+
+               if (copy_from_user(&filter_compat, user_msr_filter,
+                                  sizeof(filter_compat)))
+                       return -EFAULT;
+
+               filter.flags = filter_compat.flags;
+               for (i = 0; i < ARRAY_SIZE(filter.ranges); i++) {
+                       struct kvm_msr_filter_range_compat *cr;
+
+                       cr = &filter_compat.ranges[i];
+                       filter.ranges[i] = (struct kvm_msr_filter_range) {
+                               .flags = cr->flags,
+                               .nmsrs = cr->nmsrs,
+                               .base = cr->base,
+                               .bitmap = (__u8 *)(ulong)cr->bitmap,
+                       };
+               }
+
+               r = kvm_vm_ioctl_set_msr_filter(kvm, &filter);
+               break;
+       }
+       }
+
+       return r;
+}
+#endif
+
 #ifdef CONFIG_HAVE_KVM_PM_NOTIFIER
 static int kvm_arch_suspend_notifier(struct kvm *kvm)
 {