KVM: VMX: Fold ept_update_paging_mode_cr0() back into vmx_set_cr0()
authorSean Christopherson <seanjc@google.com>
Tue, 13 Jul 2021 16:33:01 +0000 (09:33 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 2 Aug 2021 15:01:54 +0000 (11:01 -0400)
Move the CR0/CR3/CR4 shenanigans for EPT without unrestricted guest back
into vmx_set_cr0().  This will allow a future patch to eliminate the
rather gross stuffing of vcpu->arch.cr0 in the paging transition cases
by snapshotting the old CR0.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20210713163324.627647-24-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/vmx.c

index 1e555fb..e4b1c24 100644 (file)
@@ -2994,27 +2994,6 @@ void ept_save_pdptrs(struct kvm_vcpu *vcpu)
        kvm_register_mark_dirty(vcpu, VCPU_EXREG_PDPTR);
 }
 
-static void ept_update_paging_mode_cr0(unsigned long cr0, struct kvm_vcpu *vcpu)
-{
-       struct vcpu_vmx *vmx = to_vmx(vcpu);
-
-       if (!kvm_register_is_available(vcpu, VCPU_EXREG_CR3))
-               vmx_cache_reg(vcpu, VCPU_EXREG_CR3);
-       if (!(cr0 & X86_CR0_PG)) {
-               /* From paging/starting to nonpaging */
-               exec_controls_setbit(vmx, CPU_BASED_CR3_LOAD_EXITING |
-                                         CPU_BASED_CR3_STORE_EXITING);
-               vcpu->arch.cr0 = cr0;
-               vmx_set_cr4(vcpu, kvm_read_cr4(vcpu));
-       } else if (!is_paging(vcpu)) {
-               /* From nonpaging to paging */
-               exec_controls_clearbit(vmx, CPU_BASED_CR3_LOAD_EXITING |
-                                           CPU_BASED_CR3_STORE_EXITING);
-               vcpu->arch.cr0 = cr0;
-               vmx_set_cr4(vcpu, kvm_read_cr4(vcpu));
-       }
-}
-
 void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
 {
        struct vcpu_vmx *vmx = to_vmx(vcpu);
@@ -3044,8 +3023,23 @@ void vmx_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
        }
 #endif
 
-       if (enable_ept && !is_unrestricted_guest(vcpu))
-               ept_update_paging_mode_cr0(cr0, vcpu);
+       if (enable_ept && !is_unrestricted_guest(vcpu)) {
+               if (!kvm_register_is_available(vcpu, VCPU_EXREG_CR3))
+                       vmx_cache_reg(vcpu, VCPU_EXREG_CR3);
+               if (!(cr0 & X86_CR0_PG)) {
+                       /* From paging/starting to nonpaging */
+                       exec_controls_setbit(vmx, CPU_BASED_CR3_LOAD_EXITING |
+                                                 CPU_BASED_CR3_STORE_EXITING);
+                       vcpu->arch.cr0 = cr0;
+                       vmx_set_cr4(vcpu, kvm_read_cr4(vcpu));
+               } else if (!is_paging(vcpu)) {
+                       /* From nonpaging to paging */
+                       exec_controls_clearbit(vmx, CPU_BASED_CR3_LOAD_EXITING |
+                                                   CPU_BASED_CR3_STORE_EXITING);
+                       vcpu->arch.cr0 = cr0;
+                       vmx_set_cr4(vcpu, kvm_read_cr4(vcpu));
+               }
+       }
 
        vmcs_writel(CR0_READ_SHADOW, cr0);
        vmcs_writel(GUEST_CR0, hw_cr0);