Skip to content

Commit b4d1851

Browse files
Sean Christophersonbonzini
authored andcommitted
KVM: VMX: give unrestricted guest full control of CR3
Now CR3 is not forced to a host-controlled value when paging is disabled in an unrestricted guest, CR3 load/store exiting can be left disabled (for an unrestricted guest). And because CR0.WP and CR4.PAE/PSE are also not force to host-controlled values, all of ept_update_paging_mode_cr0() is no longer needed, i.e. skip ept_update_paging_mode_cr0() for an unrestricted guest. Because MOV CR3 no longer exits when paging is disabled for an unrestricted guest, vmx_decache_cr3() must always read GUEST_CR3 from the VMCS for an unrestricted guest. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
1 parent 5dc1f04 commit b4d1851

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/x86/kvm/vmx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4314,7 +4314,7 @@ static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu)
43144314

43154315
static void vmx_decache_cr3(struct kvm_vcpu *vcpu)
43164316
{
4317-
if (enable_ept && is_paging(vcpu))
4317+
if (enable_unrestricted_guest || (enable_ept && is_paging(vcpu)))
43184318
vcpu->arch.cr3 = vmcs_readl(GUEST_CR3);
43194319
__set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail);
43204320
}
@@ -4451,7 +4451,7 @@ static void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
44514451
}
44524452
#endif
44534453

4454-
if (enable_ept)
4454+
if (enable_ept && !enable_unrestricted_guest)
44554455
ept_update_paging_mode_cr0(&hw_cr0, cr0, vcpu);
44564456

44574457
vmcs_writel(CR0_READ_SHADOW, cr0);

0 commit comments

Comments
 (0)