KVM: x86: determine if an exception has an error code only when injecting it.
commit b97f074583 upstream.
A page fault can be queued while vCPU is in real paged mode on AMD, and
AMD manual asks the user to always intercept it
(otherwise result is undefined).
The resulting VM exit, does have an error code.
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20210225154135.405125-2-mlevitsk@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Zubin Mithra <zsm@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6f5d7a45f5
commit
dee8119eaa
1 changed files with 9 additions and 4 deletions
|
|
@ -541,8 +541,6 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
|
|||
|
||||
if (!vcpu->arch.exception.pending && !vcpu->arch.exception.injected) {
|
||||
queue:
|
||||
if (has_error && !is_protmode(vcpu))
|
||||
has_error = false;
|
||||
if (reinject) {
|
||||
/*
|
||||
* On vmentry, vcpu->arch.exception.pending is only
|
||||
|
|
@ -8265,6 +8263,13 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu)
|
|||
kvm_x86_ops.update_cr8_intercept(vcpu, tpr, max_irr);
|
||||
}
|
||||
|
||||
static void kvm_inject_exception(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
if (vcpu->arch.exception.error_code && !is_protmode(vcpu))
|
||||
vcpu->arch.exception.error_code = false;
|
||||
kvm_x86_ops.queue_exception(vcpu);
|
||||
}
|
||||
|
||||
static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit)
|
||||
{
|
||||
int r;
|
||||
|
|
@ -8273,7 +8278,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit
|
|||
/* try to reinject previous events if any */
|
||||
|
||||
if (vcpu->arch.exception.injected) {
|
||||
kvm_x86_ops.queue_exception(vcpu);
|
||||
kvm_inject_exception(vcpu);
|
||||
can_inject = false;
|
||||
}
|
||||
/*
|
||||
|
|
@ -8336,7 +8341,7 @@ static void inject_pending_event(struct kvm_vcpu *vcpu, bool *req_immediate_exit
|
|||
}
|
||||
}
|
||||
|
||||
kvm_x86_ops.queue_exception(vcpu);
|
||||
kvm_inject_exception(vcpu);
|
||||
can_inject = false;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue