Reorder code in vmx.c so that the VMX support check helpers reside above
the hardware enabling helpers, which will allow KVM to perform support
checks during hardware enabling (in a future patch).

No functional change intended.

Signed-off-by: Sean Christopherson <sea...@google.com>
---
 arch/x86/kvm/vmx/vmx.c | 212 ++++++++++++++++++++---------------------
 1 file changed, 106 insertions(+), 106 deletions(-)

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 2a7e62d0707d..07d86535c032 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -2485,77 +2485,6 @@ static void vmx_cache_reg(struct kvm_vcpu *vcpu, enum 
kvm_reg reg)
        }
 }
 
-static int kvm_cpu_vmxon(u64 vmxon_pointer)
-{
-       u64 msr;
-
-       cr4_set_bits(X86_CR4_VMXE);
-
-       asm_volatile_goto("1: vmxon %[vmxon_pointer]\n\t"
-                         _ASM_EXTABLE(1b, %l[fault])
-                         : : [vmxon_pointer] "m"(vmxon_pointer)
-                         : : fault);
-       return 0;
-
-fault:
-       WARN_ONCE(1, "VMXON faulted, MSR_IA32_FEAT_CTL (0x3a) = 0x%llx\n",
-                 rdmsrl_safe(MSR_IA32_FEAT_CTL, &msr) ? 0xdeadbeef : msr);
-       cr4_clear_bits(X86_CR4_VMXE);
-
-       return -EFAULT;
-}
-
-static int vmx_hardware_enable(void)
-{
-       int cpu = raw_smp_processor_id();
-       u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
-       int r;
-
-       if (cr4_read_shadow() & X86_CR4_VMXE)
-               return -EBUSY;
-
-       /*
-        * This can happen if we hot-added a CPU but failed to allocate
-        * VP assist page for it.
-        */
-       if (static_branch_unlikely(&enable_evmcs) &&
-           !hv_get_vp_assist_page(cpu))
-               return -EFAULT;
-
-       intel_pt_handle_vmx(1);
-
-       r = kvm_cpu_vmxon(phys_addr);
-       if (r) {
-               intel_pt_handle_vmx(0);
-               return r;
-       }
-
-       if (enable_ept)
-               ept_sync_global();
-
-       return 0;
-}
-
-static void vmclear_local_loaded_vmcss(void)
-{
-       int cpu = raw_smp_processor_id();
-       struct loaded_vmcs *v, *n;
-
-       list_for_each_entry_safe(v, n, &per_cpu(loaded_vmcss_on_cpu, cpu),
-                                loaded_vmcss_on_cpu_link)
-               __loaded_vmcs_clear(v);
-}
-
-static void vmx_hardware_disable(void)
-{
-       vmclear_local_loaded_vmcss();
-
-       if (cpu_vmxoff())
-               kvm_spurious_fault();
-
-       intel_pt_handle_vmx(0);
-}
-
 /*
  * There is no X86_FEATURE for SGX yet, but anyway we need to query CPUID
  * directly instead of going through cpu_has(), to ensure KVM is trapping
@@ -2781,6 +2710,112 @@ static __init int setup_vmcs_config(struct vmcs_config 
*vmcs_conf,
        return 0;
 }
 
+static bool __init kvm_is_vmx_supported(void)
+{
+       if (!cpu_has_vmx()) {
+               pr_err("CPU doesn't support VMX\n");
+               return false;
+       }
+
+       if (!boot_cpu_has(X86_FEATURE_MSR_IA32_FEAT_CTL) ||
+           !boot_cpu_has(X86_FEATURE_VMX)) {
+               pr_err("VMX not enabled in MSR_IA32_FEAT_CTL\n");
+               return false;
+       }
+
+       return true;
+}
+
+static int __init vmx_check_processor_compat(void)
+{
+       struct vmcs_config vmcs_conf;
+       struct vmx_capability vmx_cap;
+
+       if (!kvm_is_vmx_supported())
+               return -EIO;
+
+       if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0)
+               return -EIO;
+       if (nested)
+               nested_vmx_setup_ctls_msrs(&vmcs_conf, vmx_cap.ept);
+       if (memcmp(&vmcs_config, &vmcs_conf, sizeof(struct vmcs_config)) != 0) {
+               pr_err("CPU %d feature inconsistency!\n", smp_processor_id());
+               return -EIO;
+       }
+       return 0;
+}
+
+static int kvm_cpu_vmxon(u64 vmxon_pointer)
+{
+       u64 msr;
+
+       cr4_set_bits(X86_CR4_VMXE);
+
+       asm_volatile_goto("1: vmxon %[vmxon_pointer]\n\t"
+                         _ASM_EXTABLE(1b, %l[fault])
+                         : : [vmxon_pointer] "m"(vmxon_pointer)
+                         : : fault);
+       return 0;
+
+fault:
+       WARN_ONCE(1, "VMXON faulted, MSR_IA32_FEAT_CTL (0x3a) = 0x%llx\n",
+                 rdmsrl_safe(MSR_IA32_FEAT_CTL, &msr) ? 0xdeadbeef : msr);
+       cr4_clear_bits(X86_CR4_VMXE);
+
+       return -EFAULT;
+}
+
+static int vmx_hardware_enable(void)
+{
+       int cpu = raw_smp_processor_id();
+       u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
+       int r;
+
+       if (cr4_read_shadow() & X86_CR4_VMXE)
+               return -EBUSY;
+
+       /*
+        * This can happen if we hot-added a CPU but failed to allocate
+        * VP assist page for it.
+        */
+       if (static_branch_unlikely(&enable_evmcs) &&
+           !hv_get_vp_assist_page(cpu))
+               return -EFAULT;
+
+       intel_pt_handle_vmx(1);
+
+       r = kvm_cpu_vmxon(phys_addr);
+       if (r) {
+               intel_pt_handle_vmx(0);
+               return r;
+       }
+
+       if (enable_ept)
+               ept_sync_global();
+
+       return 0;
+}
+
+static void vmclear_local_loaded_vmcss(void)
+{
+       int cpu = raw_smp_processor_id();
+       struct loaded_vmcs *v, *n;
+
+       list_for_each_entry_safe(v, n, &per_cpu(loaded_vmcss_on_cpu, cpu),
+                                loaded_vmcss_on_cpu_link)
+               __loaded_vmcs_clear(v);
+}
+
+static void vmx_hardware_disable(void)
+{
+       vmclear_local_loaded_vmcss();
+
+       if (cpu_vmxoff())
+               kvm_spurious_fault();
+
+       intel_pt_handle_vmx(0);
+}
+
 struct vmcs *alloc_vmcs_cpu(bool shadow, int cpu, gfp_t flags)
 {
        int node = cpu_to_node(cpu);
@@ -7466,41 +7501,6 @@ static int vmx_vm_init(struct kvm *kvm)
        return 0;
 }
 
-static bool __init kvm_is_vmx_supported(void)
-{
-       if (!cpu_has_vmx()) {
-               pr_err("CPU doesn't support VMX\n");
-               return false;
-       }
-
-       if (!boot_cpu_has(X86_FEATURE_MSR_IA32_FEAT_CTL) ||
-           !boot_cpu_has(X86_FEATURE_VMX)) {
-               pr_err("VMX not enabled in MSR_IA32_FEAT_CTL\n");
-               return false;
-       }
-
-       return true;
-}
-
-static int __init vmx_check_processor_compat(void)
-{
-       struct vmcs_config vmcs_conf;
-       struct vmx_capability vmx_cap;
-
-       if (!kvm_is_vmx_supported())
-               return -EIO;
-
-       if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0)
-               return -EIO;
-       if (nested)
-               nested_vmx_setup_ctls_msrs(&vmcs_conf, vmx_cap.ept);
-       if (memcmp(&vmcs_config, &vmcs_conf, sizeof(struct vmcs_config)) != 0) {
-               pr_err("CPU %d feature inconsistency!\n", smp_processor_id());
-               return -EIO;
-       }
-       return 0;
-}
-
 static u8 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
 {
        u8 cache;
-- 
2.38.1.431.g37b22c650d-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to