KVM: Hyper-V: do not do hypercall userspace exits if SynIC is disabled
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 29 Mar 2016 09:23:25 +0000 (11:23 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 1 Apr 2016 10:10:09 +0000 (12:10 +0200)
If SynIC is disabled, there is nothing that userspace can do to
handle these exits; on the other hand, userspace probably will
not know about KVM_EXIT_HYPERV_HCALL and complain about it or
even exit.  Just prevent anything bad from happening by handling
the hypercall in KVM and returning an "invalid hypercall" code.

Fixes: 83326e43f27e9a8a501427a0060f8af519a39bb2
Cc: Andrey Smetanin <irqlevel@gmail.com>
Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/hyperv.c

index 5ff3485acb60b2ad37a93084cd91a13c888c6fbc..01bd7b7a6866ec0f93f30f62091ec384d783660a 100644 (file)
@@ -1116,6 +1116,11 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
                break;
        case HVCALL_POST_MESSAGE:
        case HVCALL_SIGNAL_EVENT:
+               /* don't bother userspace if it has no way to handle it */
+               if (!vcpu_to_synic(vcpu)->active) {
+                       res = HV_STATUS_INVALID_HYPERCALL_CODE;
+                       break;
+               }
                vcpu->run->exit_reason = KVM_EXIT_HYPERV;
                vcpu->run->hyperv.type = KVM_EXIT_HYPERV_HCALL;
                vcpu->run->hyperv.u.hcall.input = param;