mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 16:38:12 +00:00
KVM: VMX: Mark VCPU_EXREG_CR3 dirty when !CR0_PG -> CR0_PG if EPT + !URG
When !CR0_PG -> CR0_PG, vcpu->arch.cr3 becomes active, but GUEST_CR3 is
still vmx->ept_identity_map_addr if EPT + !URG. So VCPU_EXREG_CR3 is
considered to be dirty and GUEST_CR3 needs to be updated in this case.
Reported-by: Maxim Levitsky <mlevitsk@redhat.com>
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
Message-Id: <20211216021938.11752-4-jiangshanlai@gmail.com>
Fixes: c62c7bd4f9
("KVM: VMX: Update vmcs.GUEST_CR3 only when the guest CR3 is dirty")
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6b123c3a89
commit
5b61178cd2
1 changed files with 7 additions and 0 deletions
|
@ -3071,6 +3071,13 @@ void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
|
|||
/* Note, vmx_set_cr4() consumes the new vcpu->arch.cr0. */
|
||||
if ((old_cr0_pg ^ cr0) & X86_CR0_PG)
|
||||
vmx_set_cr4(vcpu, kvm_read_cr4(vcpu));
|
||||
|
||||
/*
|
||||
* When !CR0_PG -> CR0_PG, vcpu->arch.cr3 becomes active, but
|
||||
* GUEST_CR3 is still vmx->ept_identity_map_addr if EPT + !URG.
|
||||
*/
|
||||
if (!(old_cr0_pg & X86_CR0_PG) && (cr0 & X86_CR0_PG))
|
||||
kvm_register_mark_dirty(vcpu, VCPU_EXREG_CR3);
|
||||
}
|
||||
|
||||
/* depends on vcpu->arch.cr0 to be set to a new value */
|
||||
|
|
Loading…
Reference in a new issue