KVM: SVM: fix calls to is_intercept
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 8 Jun 2020 11:11:47 +0000 (07:11 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 8 Jun 2020 12:00:57 +0000 (08:00 -0400)
commitfb7333dfd812062d3d51f377e70c1d3a3788472b
tree701379c48f81158a82ed9ece87a500f8ad4681c8
parent75ad6e800217220b8ee63904fb472fd5c3819259
KVM: SVM: fix calls to is_intercept

is_intercept takes an INTERCEPT_* constant, not SVM_EXIT_*; because
of this, the compiler was removing the body of the conditionals,
as if is_intercept returned 0.

This unveils a latent bug: when clearing the VINTR intercept,
int_ctl must also be changed in the L1 VMCB (svm->nested.hsave),
just like the intercept itself is also changed in the L1 VMCB.
Otherwise V_IRQ remains set and, due to the VINTR intercept being clear,
we get a spurious injection of a vector 0 interrupt on the next
L2->L1 vmexit.

Reported-by: Qian Cai <cai@lca.pw>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm.c