aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c60
1 files changed, 32 insertions, 28 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 4b6c01b477f9..1b95cc926cfc 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2324,6 +2324,34 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
2324 return 0; 2324 return 0;
2325} 2325}
2326 2326
2327static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
2328{
2329 switch (arg) {
2330 case KVM_CAP_USER_MEMORY:
2331 case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
2332 case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
2333#ifdef CONFIG_KVM_APIC_ARCHITECTURE
2334 case KVM_CAP_SET_BOOT_CPU_ID:
2335#endif
2336 case KVM_CAP_INTERNAL_ERROR_DATA:
2337#ifdef CONFIG_HAVE_KVM_MSI
2338 case KVM_CAP_SIGNAL_MSI:
2339#endif
2340#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
2341 case KVM_CAP_IRQFD_RESAMPLE:
2342#endif
2343 case KVM_CAP_CHECK_EXTENSION_VM:
2344 return 1;
2345#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
2346 case KVM_CAP_IRQ_ROUTING:
2347 return KVM_MAX_IRQ_ROUTES;
2348#endif
2349 default:
2350 break;
2351 }
2352 return kvm_vm_ioctl_check_extension(kvm, arg);
2353}
2354
2327static long kvm_vm_ioctl(struct file *filp, 2355static long kvm_vm_ioctl(struct file *filp,
2328 unsigned int ioctl, unsigned long arg) 2356 unsigned int ioctl, unsigned long arg)
2329{ 2357{
@@ -2487,6 +2515,9 @@ static long kvm_vm_ioctl(struct file *filp,
2487 r = 0; 2515 r = 0;
2488 break; 2516 break;
2489 } 2517 }
2518 case KVM_CHECK_EXTENSION:
2519 r = kvm_vm_ioctl_check_extension_generic(kvm, arg);
2520 break;
2490 default: 2521 default:
2491 r = kvm_arch_vm_ioctl(filp, ioctl, arg); 2522 r = kvm_arch_vm_ioctl(filp, ioctl, arg);
2492 if (r == -ENOTTY) 2523 if (r == -ENOTTY)
@@ -2571,33 +2602,6 @@ static int kvm_dev_ioctl_create_vm(unsigned long type)
2571 return r; 2602 return r;
2572} 2603}
2573 2604
2574static long kvm_dev_ioctl_check_extension_generic(long arg)
2575{
2576 switch (arg) {
2577 case KVM_CAP_USER_MEMORY:
2578 case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
2579 case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
2580#ifdef CONFIG_KVM_APIC_ARCHITECTURE
2581 case KVM_CAP_SET_BOOT_CPU_ID:
2582#endif
2583 case KVM_CAP_INTERNAL_ERROR_DATA:
2584#ifdef CONFIG_HAVE_KVM_MSI
2585 case KVM_CAP_SIGNAL_MSI:
2586#endif
2587#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
2588 case KVM_CAP_IRQFD_RESAMPLE:
2589#endif
2590 return 1;
2591#ifdef CONFIG_HAVE_KVM_IRQ_ROUTING
2592 case KVM_CAP_IRQ_ROUTING:
2593 return KVM_MAX_IRQ_ROUTES;
2594#endif
2595 default:
2596 break;
2597 }
2598 return kvm_dev_ioctl_check_extension(arg);
2599}
2600
2601static long kvm_dev_ioctl(struct file *filp, 2605static long kvm_dev_ioctl(struct file *filp,
2602 unsigned int ioctl, unsigned long arg) 2606 unsigned int ioctl, unsigned long arg)
2603{ 2607{
@@ -2614,7 +2618,7 @@ static long kvm_dev_ioctl(struct file *filp,
2614 r = kvm_dev_ioctl_create_vm(arg); 2618 r = kvm_dev_ioctl_create_vm(arg);
2615 break; 2619 break;
2616 case KVM_CHECK_EXTENSION: 2620 case KVM_CHECK_EXTENSION:
2617 r = kvm_dev_ioctl_check_extension_generic(arg); 2621 r = kvm_vm_ioctl_check_extension_generic(NULL, arg);
2618 break; 2622 break;
2619 case KVM_GET_VCPU_MMAP_SIZE: 2623 case KVM_GET_VCPU_MMAP_SIZE:
2620 r = -EINVAL; 2624 r = -EINVAL;