kvm: x86: vmx: move down hardware_setup() and hardware_unsetup()
Just move this pair of functions down to make sure later we can add something dependent on others. Signed-off-by: Tiejun Chen <tiejun.chen@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
173ede4ddd
commit
f2c7648d91
|
@ -3110,76 +3110,6 @@ static __init int alloc_kvm_area(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init int hardware_setup(void)
|
|
||||||
{
|
|
||||||
if (setup_vmcs_config(&vmcs_config) < 0)
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
if (boot_cpu_has(X86_FEATURE_NX))
|
|
||||||
kvm_enable_efer_bits(EFER_NX);
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_vpid())
|
|
||||||
enable_vpid = 0;
|
|
||||||
if (!cpu_has_vmx_shadow_vmcs())
|
|
||||||
enable_shadow_vmcs = 0;
|
|
||||||
if (enable_shadow_vmcs)
|
|
||||||
init_vmcs_shadow_fields();
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_ept() ||
|
|
||||||
!cpu_has_vmx_ept_4levels()) {
|
|
||||||
enable_ept = 0;
|
|
||||||
enable_unrestricted_guest = 0;
|
|
||||||
enable_ept_ad_bits = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_ept_ad_bits())
|
|
||||||
enable_ept_ad_bits = 0;
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_unrestricted_guest())
|
|
||||||
enable_unrestricted_guest = 0;
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_flexpriority()) {
|
|
||||||
flexpriority_enabled = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set_apic_access_page_addr() is used to reload apic access
|
|
||||||
* page upon invalidation. No need to do anything if the
|
|
||||||
* processor does not have the APIC_ACCESS_ADDR VMCS field.
|
|
||||||
*/
|
|
||||||
kvm_x86_ops->set_apic_access_page_addr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_tpr_shadow())
|
|
||||||
kvm_x86_ops->update_cr8_intercept = NULL;
|
|
||||||
|
|
||||||
if (enable_ept && !cpu_has_vmx_ept_2m_page())
|
|
||||||
kvm_disable_largepages();
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_ple())
|
|
||||||
ple_gap = 0;
|
|
||||||
|
|
||||||
if (!cpu_has_vmx_apicv())
|
|
||||||
enable_apicv = 0;
|
|
||||||
|
|
||||||
if (enable_apicv)
|
|
||||||
kvm_x86_ops->update_cr8_intercept = NULL;
|
|
||||||
else {
|
|
||||||
kvm_x86_ops->hwapic_irr_update = NULL;
|
|
||||||
kvm_x86_ops->deliver_posted_interrupt = NULL;
|
|
||||||
kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nested)
|
|
||||||
nested_vmx_setup_ctls_msrs();
|
|
||||||
|
|
||||||
return alloc_kvm_area();
|
|
||||||
}
|
|
||||||
|
|
||||||
static __exit void hardware_unsetup(void)
|
|
||||||
{
|
|
||||||
free_kvm_area();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool emulation_required(struct kvm_vcpu *vcpu)
|
static bool emulation_required(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return emulate_invalid_guest_state && !guest_state_valid(vcpu);
|
return emulate_invalid_guest_state && !guest_state_valid(vcpu);
|
||||||
|
@ -5788,6 +5718,76 @@ static void update_ple_window_actual_max(void)
|
||||||
ple_window_grow, INT_MIN);
|
ple_window_grow, INT_MIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __init int hardware_setup(void)
|
||||||
|
{
|
||||||
|
if (setup_vmcs_config(&vmcs_config) < 0)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
if (boot_cpu_has(X86_FEATURE_NX))
|
||||||
|
kvm_enable_efer_bits(EFER_NX);
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_vpid())
|
||||||
|
enable_vpid = 0;
|
||||||
|
if (!cpu_has_vmx_shadow_vmcs())
|
||||||
|
enable_shadow_vmcs = 0;
|
||||||
|
if (enable_shadow_vmcs)
|
||||||
|
init_vmcs_shadow_fields();
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_ept() ||
|
||||||
|
!cpu_has_vmx_ept_4levels()) {
|
||||||
|
enable_ept = 0;
|
||||||
|
enable_unrestricted_guest = 0;
|
||||||
|
enable_ept_ad_bits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_ept_ad_bits())
|
||||||
|
enable_ept_ad_bits = 0;
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_unrestricted_guest())
|
||||||
|
enable_unrestricted_guest = 0;
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_flexpriority()) {
|
||||||
|
flexpriority_enabled = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* set_apic_access_page_addr() is used to reload apic access
|
||||||
|
* page upon invalidation. No need to do anything if the
|
||||||
|
* processor does not have the APIC_ACCESS_ADDR VMCS field.
|
||||||
|
*/
|
||||||
|
kvm_x86_ops->set_apic_access_page_addr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_tpr_shadow())
|
||||||
|
kvm_x86_ops->update_cr8_intercept = NULL;
|
||||||
|
|
||||||
|
if (enable_ept && !cpu_has_vmx_ept_2m_page())
|
||||||
|
kvm_disable_largepages();
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_ple())
|
||||||
|
ple_gap = 0;
|
||||||
|
|
||||||
|
if (!cpu_has_vmx_apicv())
|
||||||
|
enable_apicv = 0;
|
||||||
|
|
||||||
|
if (enable_apicv)
|
||||||
|
kvm_x86_ops->update_cr8_intercept = NULL;
|
||||||
|
else {
|
||||||
|
kvm_x86_ops->hwapic_irr_update = NULL;
|
||||||
|
kvm_x86_ops->deliver_posted_interrupt = NULL;
|
||||||
|
kvm_x86_ops->sync_pir_to_irr = vmx_sync_pir_to_irr_dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nested)
|
||||||
|
nested_vmx_setup_ctls_msrs();
|
||||||
|
|
||||||
|
return alloc_kvm_area();
|
||||||
|
}
|
||||||
|
|
||||||
|
static __exit void hardware_unsetup(void)
|
||||||
|
{
|
||||||
|
free_kvm_area();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Indicate a busy-waiting vcpu in spinlock. We do not enable the PAUSE
|
* Indicate a busy-waiting vcpu in spinlock. We do not enable the PAUSE
|
||||||
* exiting, so only get here on cpu with PAUSE-Loop-Exiting.
|
* exiting, so only get here on cpu with PAUSE-Loop-Exiting.
|
||||||
|
|
Loading…
Reference in New Issue