mirror of https://gitee.com/openkylin/linux.git
KVM: SVM: Fix nested VM-Exit on #GP interception handling
Fix the interpreation of nested_svm_vmexit()'s return value when
synthesizing a nested VM-Exit after intercepting an SVM instruction while
L2 was running. The helper returns '0' on success, whereas a return
value of '0' in the exit handler path means "exit to userspace". The
incorrect return value causes KVM to exit to userspace without filling
the run state, e.g. QEMU logs "KVM: unknown exit, hardware reason 0".
Fixes: 14c2bf81fc
("KVM: SVM: Fix #GP handling for doubly-nested virtualization")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210224005627.657028-1-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
67b45af946
commit
2df8d3807c
|
@ -2211,15 +2211,20 @@ static int emulate_svm_instr(struct kvm_vcpu *vcpu, int opcode)
|
||||||
[SVM_INSTR_VMSAVE] = vmsave_interception,
|
[SVM_INSTR_VMSAVE] = vmsave_interception,
|
||||||
};
|
};
|
||||||
struct vcpu_svm *svm = to_svm(vcpu);
|
struct vcpu_svm *svm = to_svm(vcpu);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (is_guest_mode(vcpu)) {
|
if (is_guest_mode(vcpu)) {
|
||||||
svm->vmcb->control.exit_code = guest_mode_exit_codes[opcode];
|
svm->vmcb->control.exit_code = guest_mode_exit_codes[opcode];
|
||||||
svm->vmcb->control.exit_info_1 = 0;
|
svm->vmcb->control.exit_info_1 = 0;
|
||||||
svm->vmcb->control.exit_info_2 = 0;
|
svm->vmcb->control.exit_info_2 = 0;
|
||||||
|
|
||||||
return nested_svm_vmexit(svm);
|
/* Returns '1' or -errno on failure, '0' on success. */
|
||||||
} else
|
ret = nested_svm_vmexit(svm);
|
||||||
return svm_instr_handlers[opcode](svm);
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return svm_instr_handlers[opcode](svm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue