mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-16 20:27:23 +07:00
KVM: VMX: Move hardware_setup() definition below vmx_x86_ops
Move VMX's hardware_setup() below its vmx_x86_ops definition so that a future patch can refactor hardware_setup() to modify vmx_x86_ops directly instead of indirectly modifying the ops via the global kvm_x86_ops. No functional change intended. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Message-Id: <20200321202603.19355-4-sean.j.christopherson@intel.com> Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d008dfdb0e
commit
484014faf8
@ -7646,6 +7646,159 @@ static bool vmx_apic_init_signal_blocked(struct kvm_vcpu *vcpu)
|
|||||||
return to_vmx(vcpu)->nested.vmxon;
|
return to_vmx(vcpu)->nested.vmxon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __exit void hardware_unsetup(void)
|
||||||
|
{
|
||||||
|
if (nested)
|
||||||
|
nested_vmx_hardware_unsetup();
|
||||||
|
|
||||||
|
free_kvm_area();
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool vmx_check_apicv_inhibit_reasons(ulong bit)
|
||||||
|
{
|
||||||
|
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) |
|
||||||
|
BIT(APICV_INHIBIT_REASON_HYPERV);
|
||||||
|
|
||||||
|
return supported & BIT(bit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct kvm_x86_ops vmx_x86_ops __ro_after_init = {
|
||||||
|
.hardware_unsetup = hardware_unsetup,
|
||||||
|
|
||||||
|
.hardware_enable = hardware_enable,
|
||||||
|
.hardware_disable = hardware_disable,
|
||||||
|
.cpu_has_accelerated_tpr = report_flexpriority,
|
||||||
|
.has_emulated_msr = vmx_has_emulated_msr,
|
||||||
|
|
||||||
|
.vm_size = sizeof(struct kvm_vmx),
|
||||||
|
.vm_init = vmx_vm_init,
|
||||||
|
|
||||||
|
.vcpu_create = vmx_create_vcpu,
|
||||||
|
.vcpu_free = vmx_free_vcpu,
|
||||||
|
.vcpu_reset = vmx_vcpu_reset,
|
||||||
|
|
||||||
|
.prepare_guest_switch = vmx_prepare_switch_to_guest,
|
||||||
|
.vcpu_load = vmx_vcpu_load,
|
||||||
|
.vcpu_put = vmx_vcpu_put,
|
||||||
|
|
||||||
|
.update_bp_intercept = update_exception_bitmap,
|
||||||
|
.get_msr_feature = vmx_get_msr_feature,
|
||||||
|
.get_msr = vmx_get_msr,
|
||||||
|
.set_msr = vmx_set_msr,
|
||||||
|
.get_segment_base = vmx_get_segment_base,
|
||||||
|
.get_segment = vmx_get_segment,
|
||||||
|
.set_segment = vmx_set_segment,
|
||||||
|
.get_cpl = vmx_get_cpl,
|
||||||
|
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
|
||||||
|
.decache_cr0_guest_bits = vmx_decache_cr0_guest_bits,
|
||||||
|
.decache_cr4_guest_bits = vmx_decache_cr4_guest_bits,
|
||||||
|
.set_cr0 = vmx_set_cr0,
|
||||||
|
.set_cr4 = vmx_set_cr4,
|
||||||
|
.set_efer = vmx_set_efer,
|
||||||
|
.get_idt = vmx_get_idt,
|
||||||
|
.set_idt = vmx_set_idt,
|
||||||
|
.get_gdt = vmx_get_gdt,
|
||||||
|
.set_gdt = vmx_set_gdt,
|
||||||
|
.get_dr6 = vmx_get_dr6,
|
||||||
|
.set_dr6 = vmx_set_dr6,
|
||||||
|
.set_dr7 = vmx_set_dr7,
|
||||||
|
.sync_dirty_debug_regs = vmx_sync_dirty_debug_regs,
|
||||||
|
.cache_reg = vmx_cache_reg,
|
||||||
|
.get_rflags = vmx_get_rflags,
|
||||||
|
.set_rflags = vmx_set_rflags,
|
||||||
|
|
||||||
|
.tlb_flush = vmx_flush_tlb,
|
||||||
|
.tlb_flush_gva = vmx_flush_tlb_gva,
|
||||||
|
|
||||||
|
.run = vmx_vcpu_run,
|
||||||
|
.handle_exit = vmx_handle_exit,
|
||||||
|
.skip_emulated_instruction = vmx_skip_emulated_instruction,
|
||||||
|
.update_emulated_instruction = vmx_update_emulated_instruction,
|
||||||
|
.set_interrupt_shadow = vmx_set_interrupt_shadow,
|
||||||
|
.get_interrupt_shadow = vmx_get_interrupt_shadow,
|
||||||
|
.patch_hypercall = vmx_patch_hypercall,
|
||||||
|
.set_irq = vmx_inject_irq,
|
||||||
|
.set_nmi = vmx_inject_nmi,
|
||||||
|
.queue_exception = vmx_queue_exception,
|
||||||
|
.cancel_injection = vmx_cancel_injection,
|
||||||
|
.interrupt_allowed = vmx_interrupt_allowed,
|
||||||
|
.nmi_allowed = vmx_nmi_allowed,
|
||||||
|
.get_nmi_mask = vmx_get_nmi_mask,
|
||||||
|
.set_nmi_mask = vmx_set_nmi_mask,
|
||||||
|
.enable_nmi_window = enable_nmi_window,
|
||||||
|
.enable_irq_window = enable_irq_window,
|
||||||
|
.update_cr8_intercept = update_cr8_intercept,
|
||||||
|
.set_virtual_apic_mode = vmx_set_virtual_apic_mode,
|
||||||
|
.set_apic_access_page_addr = vmx_set_apic_access_page_addr,
|
||||||
|
.refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,
|
||||||
|
.load_eoi_exitmap = vmx_load_eoi_exitmap,
|
||||||
|
.apicv_post_state_restore = vmx_apicv_post_state_restore,
|
||||||
|
.check_apicv_inhibit_reasons = vmx_check_apicv_inhibit_reasons,
|
||||||
|
.hwapic_irr_update = vmx_hwapic_irr_update,
|
||||||
|
.hwapic_isr_update = vmx_hwapic_isr_update,
|
||||||
|
.guest_apic_has_interrupt = vmx_guest_apic_has_interrupt,
|
||||||
|
.sync_pir_to_irr = vmx_sync_pir_to_irr,
|
||||||
|
.deliver_posted_interrupt = vmx_deliver_posted_interrupt,
|
||||||
|
.dy_apicv_has_pending_interrupt = vmx_dy_apicv_has_pending_interrupt,
|
||||||
|
|
||||||
|
.set_tss_addr = vmx_set_tss_addr,
|
||||||
|
.set_identity_map_addr = vmx_set_identity_map_addr,
|
||||||
|
.get_tdp_level = get_ept_level,
|
||||||
|
.get_mt_mask = vmx_get_mt_mask,
|
||||||
|
|
||||||
|
.get_exit_info = vmx_get_exit_info,
|
||||||
|
|
||||||
|
.cpuid_update = vmx_cpuid_update,
|
||||||
|
|
||||||
|
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
||||||
|
|
||||||
|
.read_l1_tsc_offset = vmx_read_l1_tsc_offset,
|
||||||
|
.write_l1_tsc_offset = vmx_write_l1_tsc_offset,
|
||||||
|
|
||||||
|
.load_mmu_pgd = vmx_load_mmu_pgd,
|
||||||
|
|
||||||
|
.check_intercept = vmx_check_intercept,
|
||||||
|
.handle_exit_irqoff = vmx_handle_exit_irqoff,
|
||||||
|
|
||||||
|
.request_immediate_exit = vmx_request_immediate_exit,
|
||||||
|
|
||||||
|
.sched_in = vmx_sched_in,
|
||||||
|
|
||||||
|
.slot_enable_log_dirty = vmx_slot_enable_log_dirty,
|
||||||
|
.slot_disable_log_dirty = vmx_slot_disable_log_dirty,
|
||||||
|
.flush_log_dirty = vmx_flush_log_dirty,
|
||||||
|
.enable_log_dirty_pt_masked = vmx_enable_log_dirty_pt_masked,
|
||||||
|
.write_log_dirty = vmx_write_pml_buffer,
|
||||||
|
|
||||||
|
.pre_block = vmx_pre_block,
|
||||||
|
.post_block = vmx_post_block,
|
||||||
|
|
||||||
|
.pmu_ops = &intel_pmu_ops,
|
||||||
|
|
||||||
|
.update_pi_irte = vmx_update_pi_irte,
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
.set_hv_timer = vmx_set_hv_timer,
|
||||||
|
.cancel_hv_timer = vmx_cancel_hv_timer,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.setup_mce = vmx_setup_mce,
|
||||||
|
|
||||||
|
.smi_allowed = vmx_smi_allowed,
|
||||||
|
.pre_enter_smm = vmx_pre_enter_smm,
|
||||||
|
.pre_leave_smm = vmx_pre_leave_smm,
|
||||||
|
.enable_smi_window = enable_smi_window,
|
||||||
|
|
||||||
|
.check_nested_events = NULL,
|
||||||
|
.get_nested_state = NULL,
|
||||||
|
.set_nested_state = NULL,
|
||||||
|
.get_vmcs12_pages = NULL,
|
||||||
|
.nested_enable_evmcs = NULL,
|
||||||
|
.nested_get_evmcs_version = NULL,
|
||||||
|
.need_emulation_on_page_fault = vmx_need_emulation_on_page_fault,
|
||||||
|
.apic_init_signal_blocked = vmx_apic_init_signal_blocked,
|
||||||
|
};
|
||||||
|
|
||||||
static __init int hardware_setup(void)
|
static __init int hardware_setup(void)
|
||||||
{
|
{
|
||||||
unsigned long host_bndcfgs;
|
unsigned long host_bndcfgs;
|
||||||
@ -7819,159 +7972,6 @@ static __init int hardware_setup(void)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __exit void hardware_unsetup(void)
|
|
||||||
{
|
|
||||||
if (nested)
|
|
||||||
nested_vmx_hardware_unsetup();
|
|
||||||
|
|
||||||
free_kvm_area();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool vmx_check_apicv_inhibit_reasons(ulong bit)
|
|
||||||
{
|
|
||||||
ulong supported = BIT(APICV_INHIBIT_REASON_DISABLE) |
|
|
||||||
BIT(APICV_INHIBIT_REASON_HYPERV);
|
|
||||||
|
|
||||||
return supported & BIT(bit);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct kvm_x86_ops vmx_x86_ops __ro_after_init = {
|
|
||||||
.hardware_unsetup = hardware_unsetup,
|
|
||||||
|
|
||||||
.hardware_enable = hardware_enable,
|
|
||||||
.hardware_disable = hardware_disable,
|
|
||||||
.cpu_has_accelerated_tpr = report_flexpriority,
|
|
||||||
.has_emulated_msr = vmx_has_emulated_msr,
|
|
||||||
|
|
||||||
.vm_size = sizeof(struct kvm_vmx),
|
|
||||||
.vm_init = vmx_vm_init,
|
|
||||||
|
|
||||||
.vcpu_create = vmx_create_vcpu,
|
|
||||||
.vcpu_free = vmx_free_vcpu,
|
|
||||||
.vcpu_reset = vmx_vcpu_reset,
|
|
||||||
|
|
||||||
.prepare_guest_switch = vmx_prepare_switch_to_guest,
|
|
||||||
.vcpu_load = vmx_vcpu_load,
|
|
||||||
.vcpu_put = vmx_vcpu_put,
|
|
||||||
|
|
||||||
.update_bp_intercept = update_exception_bitmap,
|
|
||||||
.get_msr_feature = vmx_get_msr_feature,
|
|
||||||
.get_msr = vmx_get_msr,
|
|
||||||
.set_msr = vmx_set_msr,
|
|
||||||
.get_segment_base = vmx_get_segment_base,
|
|
||||||
.get_segment = vmx_get_segment,
|
|
||||||
.set_segment = vmx_set_segment,
|
|
||||||
.get_cpl = vmx_get_cpl,
|
|
||||||
.get_cs_db_l_bits = vmx_get_cs_db_l_bits,
|
|
||||||
.decache_cr0_guest_bits = vmx_decache_cr0_guest_bits,
|
|
||||||
.decache_cr4_guest_bits = vmx_decache_cr4_guest_bits,
|
|
||||||
.set_cr0 = vmx_set_cr0,
|
|
||||||
.set_cr4 = vmx_set_cr4,
|
|
||||||
.set_efer = vmx_set_efer,
|
|
||||||
.get_idt = vmx_get_idt,
|
|
||||||
.set_idt = vmx_set_idt,
|
|
||||||
.get_gdt = vmx_get_gdt,
|
|
||||||
.set_gdt = vmx_set_gdt,
|
|
||||||
.get_dr6 = vmx_get_dr6,
|
|
||||||
.set_dr6 = vmx_set_dr6,
|
|
||||||
.set_dr7 = vmx_set_dr7,
|
|
||||||
.sync_dirty_debug_regs = vmx_sync_dirty_debug_regs,
|
|
||||||
.cache_reg = vmx_cache_reg,
|
|
||||||
.get_rflags = vmx_get_rflags,
|
|
||||||
.set_rflags = vmx_set_rflags,
|
|
||||||
|
|
||||||
.tlb_flush = vmx_flush_tlb,
|
|
||||||
.tlb_flush_gva = vmx_flush_tlb_gva,
|
|
||||||
|
|
||||||
.run = vmx_vcpu_run,
|
|
||||||
.handle_exit = vmx_handle_exit,
|
|
||||||
.skip_emulated_instruction = vmx_skip_emulated_instruction,
|
|
||||||
.update_emulated_instruction = vmx_update_emulated_instruction,
|
|
||||||
.set_interrupt_shadow = vmx_set_interrupt_shadow,
|
|
||||||
.get_interrupt_shadow = vmx_get_interrupt_shadow,
|
|
||||||
.patch_hypercall = vmx_patch_hypercall,
|
|
||||||
.set_irq = vmx_inject_irq,
|
|
||||||
.set_nmi = vmx_inject_nmi,
|
|
||||||
.queue_exception = vmx_queue_exception,
|
|
||||||
.cancel_injection = vmx_cancel_injection,
|
|
||||||
.interrupt_allowed = vmx_interrupt_allowed,
|
|
||||||
.nmi_allowed = vmx_nmi_allowed,
|
|
||||||
.get_nmi_mask = vmx_get_nmi_mask,
|
|
||||||
.set_nmi_mask = vmx_set_nmi_mask,
|
|
||||||
.enable_nmi_window = enable_nmi_window,
|
|
||||||
.enable_irq_window = enable_irq_window,
|
|
||||||
.update_cr8_intercept = update_cr8_intercept,
|
|
||||||
.set_virtual_apic_mode = vmx_set_virtual_apic_mode,
|
|
||||||
.set_apic_access_page_addr = vmx_set_apic_access_page_addr,
|
|
||||||
.refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,
|
|
||||||
.load_eoi_exitmap = vmx_load_eoi_exitmap,
|
|
||||||
.apicv_post_state_restore = vmx_apicv_post_state_restore,
|
|
||||||
.check_apicv_inhibit_reasons = vmx_check_apicv_inhibit_reasons,
|
|
||||||
.hwapic_irr_update = vmx_hwapic_irr_update,
|
|
||||||
.hwapic_isr_update = vmx_hwapic_isr_update,
|
|
||||||
.guest_apic_has_interrupt = vmx_guest_apic_has_interrupt,
|
|
||||||
.sync_pir_to_irr = vmx_sync_pir_to_irr,
|
|
||||||
.deliver_posted_interrupt = vmx_deliver_posted_interrupt,
|
|
||||||
.dy_apicv_has_pending_interrupt = vmx_dy_apicv_has_pending_interrupt,
|
|
||||||
|
|
||||||
.set_tss_addr = vmx_set_tss_addr,
|
|
||||||
.set_identity_map_addr = vmx_set_identity_map_addr,
|
|
||||||
.get_tdp_level = get_ept_level,
|
|
||||||
.get_mt_mask = vmx_get_mt_mask,
|
|
||||||
|
|
||||||
.get_exit_info = vmx_get_exit_info,
|
|
||||||
|
|
||||||
.cpuid_update = vmx_cpuid_update,
|
|
||||||
|
|
||||||
.has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
|
|
||||||
|
|
||||||
.read_l1_tsc_offset = vmx_read_l1_tsc_offset,
|
|
||||||
.write_l1_tsc_offset = vmx_write_l1_tsc_offset,
|
|
||||||
|
|
||||||
.load_mmu_pgd = vmx_load_mmu_pgd,
|
|
||||||
|
|
||||||
.check_intercept = vmx_check_intercept,
|
|
||||||
.handle_exit_irqoff = vmx_handle_exit_irqoff,
|
|
||||||
|
|
||||||
.request_immediate_exit = vmx_request_immediate_exit,
|
|
||||||
|
|
||||||
.sched_in = vmx_sched_in,
|
|
||||||
|
|
||||||
.slot_enable_log_dirty = vmx_slot_enable_log_dirty,
|
|
||||||
.slot_disable_log_dirty = vmx_slot_disable_log_dirty,
|
|
||||||
.flush_log_dirty = vmx_flush_log_dirty,
|
|
||||||
.enable_log_dirty_pt_masked = vmx_enable_log_dirty_pt_masked,
|
|
||||||
.write_log_dirty = vmx_write_pml_buffer,
|
|
||||||
|
|
||||||
.pre_block = vmx_pre_block,
|
|
||||||
.post_block = vmx_post_block,
|
|
||||||
|
|
||||||
.pmu_ops = &intel_pmu_ops,
|
|
||||||
|
|
||||||
.update_pi_irte = vmx_update_pi_irte,
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
.set_hv_timer = vmx_set_hv_timer,
|
|
||||||
.cancel_hv_timer = vmx_cancel_hv_timer,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.setup_mce = vmx_setup_mce,
|
|
||||||
|
|
||||||
.smi_allowed = vmx_smi_allowed,
|
|
||||||
.pre_enter_smm = vmx_pre_enter_smm,
|
|
||||||
.pre_leave_smm = vmx_pre_leave_smm,
|
|
||||||
.enable_smi_window = enable_smi_window,
|
|
||||||
|
|
||||||
.check_nested_events = NULL,
|
|
||||||
.get_nested_state = NULL,
|
|
||||||
.set_nested_state = NULL,
|
|
||||||
.get_vmcs12_pages = NULL,
|
|
||||||
.nested_enable_evmcs = NULL,
|
|
||||||
.nested_get_evmcs_version = NULL,
|
|
||||||
.need_emulation_on_page_fault = vmx_need_emulation_on_page_fault,
|
|
||||||
.apic_init_signal_blocked = vmx_apic_init_signal_blocked,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct kvm_x86_init_ops vmx_init_ops __initdata = {
|
static struct kvm_x86_init_ops vmx_init_ops __initdata = {
|
||||||
.cpu_has_kvm_support = cpu_has_kvm_support,
|
.cpu_has_kvm_support = cpu_has_kvm_support,
|
||||||
.disabled_by_bios = vmx_disabled_by_bios,
|
.disabled_by_bios = vmx_disabled_by_bios,
|
||||||
|
Loading…
Reference in New Issue
Block a user