KVM: nSVM: fix few bugs in the vmcb02 caching logic
* Define and use an invalid GPA (all ones) for init value of last and current nested vmcb physical addresses. * Reset the current vmcb12 gpa to the invalid value when leaving the nested mode, similar to what is done on nested vmexit. * Reset the last seen vmcb12 address when disabling the nested SVM, as it relies on vmcb02 fields which are freed at that point. Fixes: 4995a3685f1b ("KVM: SVM: Use a separate vmcb for the nested L2 guest") Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20210503125446.1353307-3-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
deee59bacb
commit
c74ad08f33
@ -113,6 +113,7 @@
|
||||
#define VALID_PAGE(x) ((x) != INVALID_PAGE)
|
||||
|
||||
#define UNMAPPED_GVA (~(gpa_t)0)
|
||||
#define INVALID_GPA (~(gpa_t)0)
|
||||
|
||||
/* KVM Hugepage definitions for x86 */
|
||||
#define KVM_MAX_HUGEPAGE_LEVEL PG_LEVEL_1G
|
||||
|
@ -872,6 +872,15 @@ void svm_free_nested(struct vcpu_svm *svm)
|
||||
__free_page(virt_to_page(svm->nested.vmcb02.ptr));
|
||||
svm->nested.vmcb02.ptr = NULL;
|
||||
|
||||
/*
|
||||
* When last_vmcb12_gpa matches the current vmcb12 gpa,
|
||||
* some vmcb12 fields are not loaded if they are marked clean
|
||||
* in the vmcb12, since in this case they are up to date already.
|
||||
*
|
||||
* When the vmcb02 is freed, this optimization becomes invalid.
|
||||
*/
|
||||
svm->nested.last_vmcb12_gpa = INVALID_GPA;
|
||||
|
||||
svm->nested.initialized = false;
|
||||
}
|
||||
|
||||
@ -884,6 +893,8 @@ void svm_leave_nested(struct vcpu_svm *svm)
|
||||
|
||||
if (is_guest_mode(vcpu)) {
|
||||
svm->nested.nested_run_pending = 0;
|
||||
svm->nested.vmcb12_gpa = INVALID_GPA;
|
||||
|
||||
leave_guest_mode(vcpu);
|
||||
|
||||
svm_switch_vmcb(svm, &svm->vmcb01);
|
||||
|
@ -1235,8 +1235,8 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
|
||||
svm->current_vmcb->asid_generation = 0;
|
||||
svm->asid = 0;
|
||||
|
||||
svm->nested.vmcb12_gpa = 0;
|
||||
svm->nested.last_vmcb12_gpa = 0;
|
||||
svm->nested.vmcb12_gpa = INVALID_GPA;
|
||||
svm->nested.last_vmcb12_gpa = INVALID_GPA;
|
||||
vcpu->arch.hflags = 0;
|
||||
|
||||
if (!kvm_pause_in_guest(vcpu->kvm)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user