KVM: x86: pending exceptions must not be blocked by an injected event
Injected interrupts/nmi should not block a pending exception, but rather be either lost if nested hypervisor doesn't intercept the pending exception (as in stock x86), or be delivered in exitintinfo/IDT_VECTORING_INFO field, as a part of a VMexit that corresponds to the pending exception. The only reason for an exception to be blocked is when nested run is pending (and that can't really happen currently but still worth checking for). Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20210401143817.1030695-2-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
b9c36fdedd
commit
4020da3b9f
@@ -1062,7 +1062,13 @@ static int svm_check_nested_events(struct kvm_vcpu *vcpu)
|
||||
}
|
||||
|
||||
if (vcpu->arch.exception.pending) {
|
||||
if (block_nested_events)
|
||||
/*
|
||||
* Only a pending nested run can block a pending exception.
|
||||
* Otherwise an injected NMI/interrupt should either be
|
||||
* lost or delivered to the nested hypervisor in the EXITINTINFO
|
||||
* vmcb field, while delivering the pending exception.
|
||||
*/
|
||||
if (svm->nested.nested_run_pending)
|
||||
return -EBUSY;
|
||||
if (!nested_exit_on_exception(svm))
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user