mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 11:44:01 +08:00
KVM: SVM: always update CR3 in VMCB
svm_load_mmu_pgd is delaying the write of GUEST_CR3 to prepare_vmcs02 as an optimization, but this is only correct before the nested vmentry. If userspace is modifying CR3 with KVM_SET_SREGS after the VM has already been put in guest mode, the value of CR3 will not be updated. Remove the optimization, which almost never triggers anyway. This was was added in commit689f3bf216
("KVM: x86: unify callbacks to load paging root", 2020-03-16) just to keep the two vendor-specific modules closer, but we'll fix VMX too. Fixes:689f3bf216
("KVM: x86: unify callbacks to load paging root") Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
5b67240866
commit
978ce5837c
@ -256,11 +256,7 @@ void enter_svm_guest_mode(struct vcpu_svm *svm, u64 vmcb_gpa,
|
||||
svm_set_efer(&svm->vcpu, nested_vmcb->save.efer);
|
||||
svm_set_cr0(&svm->vcpu, nested_vmcb->save.cr0);
|
||||
svm_set_cr4(&svm->vcpu, nested_vmcb->save.cr4);
|
||||
if (npt_enabled) {
|
||||
svm->vmcb->save.cr3 = nested_vmcb->save.cr3;
|
||||
svm->vcpu.arch.cr3 = nested_vmcb->save.cr3;
|
||||
} else
|
||||
(void)kvm_set_cr3(&svm->vcpu, nested_vmcb->save.cr3);
|
||||
(void)kvm_set_cr3(&svm->vcpu, nested_vmcb->save.cr3);
|
||||
|
||||
/* Guest paging mode is active - reset mmu */
|
||||
kvm_mmu_reset_context(&svm->vcpu);
|
||||
|
@ -3447,7 +3447,6 @@ static fastpath_t svm_vcpu_run(struct kvm_vcpu *vcpu)
|
||||
static void svm_load_mmu_pgd(struct kvm_vcpu *vcpu, unsigned long root)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
bool update_guest_cr3 = true;
|
||||
unsigned long cr3;
|
||||
|
||||
cr3 = __sme_set(root);
|
||||
@ -3456,18 +3455,13 @@ static void svm_load_mmu_pgd(struct kvm_vcpu *vcpu, unsigned long root)
|
||||
mark_dirty(svm->vmcb, VMCB_NPT);
|
||||
|
||||
/* Loading L2's CR3 is handled by enter_svm_guest_mode. */
|
||||
if (is_guest_mode(vcpu))
|
||||
update_guest_cr3 = false;
|
||||
else if (test_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail))
|
||||
cr3 = vcpu->arch.cr3;
|
||||
else /* CR3 is already up-to-date. */
|
||||
update_guest_cr3 = false;
|
||||
if (!test_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail))
|
||||
return;
|
||||
cr3 = vcpu->arch.cr3;
|
||||
}
|
||||
|
||||
if (update_guest_cr3) {
|
||||
svm->vmcb->save.cr3 = cr3;
|
||||
mark_dirty(svm->vmcb, VMCB_CR);
|
||||
}
|
||||
svm->vmcb->save.cr3 = cr3;
|
||||
mark_dirty(svm->vmcb, VMCB_CR);
|
||||
}
|
||||
|
||||
static int is_disabled(void)
|
||||
|
Loading…
Reference in New Issue
Block a user