1296341Sdelphij// SPDX-License-Identifier: GPL-2.0 296593Smarkm#include <linux/moduleparam.h> 396593Smarkm 4142429Snectar#include "x86_ops.h" 596593Smarkm#include "vmx.h" 696593Smarkm#include "nested.h" 796593Smarkm#include "pmu.h" 896593Smarkm#include "posted_intr.h" 996593Smarkm 1096593Smarkm#define VMX_REQUIRED_APICV_INHIBITS \ 1196593Smarkm (BIT(APICV_INHIBIT_REASON_DISABLE)| \ 1296593Smarkm BIT(APICV_INHIBIT_REASON_ABSENT) | \ 1396593Smarkm BIT(APICV_INHIBIT_REASON_HYPERV) | \ 1496593Smarkm BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | \ 1596593Smarkm BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \ 1696593Smarkm BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | \ 1796593Smarkm BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED)) 1896593Smarkm 1996593Smarkmstruct kvm_x86_ops vt_x86_ops __initdata = { 20215698Ssimon .name = KBUILD_MODNAME, 21215698Ssimon 22215698Ssimon .check_processor_compatibility = vmx_check_processor_compat, 23215698Ssimon 24215698Ssimon .hardware_unsetup = vmx_hardware_unsetup, 2596593Smarkm 2696593Smarkm .hardware_enable = vmx_hardware_enable, 2796593Smarkm .hardware_disable = vmx_hardware_disable, 2896593Smarkm .has_emulated_msr = vmx_has_emulated_msr, 2996593Smarkm 3096593Smarkm .vm_size = sizeof(struct kvm_vmx), 3196593Smarkm .vm_init = vmx_vm_init, 3296593Smarkm .vm_destroy = vmx_vm_destroy, 3396593Smarkm 3496593Smarkm .vcpu_precreate = vmx_vcpu_precreate, 3596593Smarkm .vcpu_create = vmx_vcpu_create, 3696593Smarkm .vcpu_free = vmx_vcpu_free, 3796593Smarkm .vcpu_reset = vmx_vcpu_reset, 3896593Smarkm 3996593Smarkm .prepare_switch_to_guest = vmx_prepare_switch_to_guest, 4096593Smarkm .vcpu_load = vmx_vcpu_load, 41279264Sdelphij .vcpu_put = vmx_vcpu_put, 42279264Sdelphij 4396593Smarkm .update_exception_bitmap = vmx_update_exception_bitmap, 4496593Smarkm .get_msr_feature = vmx_get_msr_feature, 45215698Ssimon .get_msr = vmx_get_msr, 46215698Ssimon .set_msr = vmx_set_msr, 47215698Ssimon .get_segment_base = vmx_get_segment_base, 48215698Ssimon .get_segment = vmx_get_segment, 49142429Snectar .set_segment = vmx_set_segment, 50215698Ssimon .get_cpl = vmx_get_cpl, 51142429Snectar .get_cs_db_l_bits = vmx_get_cs_db_l_bits, 52142429Snectar .is_valid_cr0 = vmx_is_valid_cr0, 53279264Sdelphij .set_cr0 = vmx_set_cr0, 54279264Sdelphij .is_valid_cr4 = vmx_is_valid_cr4, 55279264Sdelphij .set_cr4 = vmx_set_cr4, 5696593Smarkm .set_efer = vmx_set_efer, 57279264Sdelphij .get_idt = vmx_get_idt, 58279264Sdelphij .set_idt = vmx_set_idt, 59279264Sdelphij .get_gdt = vmx_get_gdt, 60279264Sdelphij .set_gdt = vmx_set_gdt, 61279264Sdelphij .set_dr7 = vmx_set_dr7, 62279264Sdelphij .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs, 63215698Ssimon .cache_reg = vmx_cache_reg, 64279264Sdelphij .get_rflags = vmx_get_rflags, 65279264Sdelphij .set_rflags = vmx_set_rflags, 66279264Sdelphij .get_if_flag = vmx_get_if_flag, 67279264Sdelphij 68279264Sdelphij .flush_tlb_all = vmx_flush_tlb_all, 69215698Ssimon .flush_tlb_current = vmx_flush_tlb_current, 70279264Sdelphij .flush_tlb_gva = vmx_flush_tlb_gva, 7196593Smarkm .flush_tlb_guest = vmx_flush_tlb_guest, 7296593Smarkm 7396593Smarkm .vcpu_pre_run = vmx_vcpu_pre_run, 7496593Smarkm .vcpu_run = vmx_vcpu_run, 7596593Smarkm .handle_exit = vmx_handle_exit, 7696593Smarkm .skip_emulated_instruction = vmx_skip_emulated_instruction, 7796593Smarkm .update_emulated_instruction = vmx_update_emulated_instruction, 7896593Smarkm .set_interrupt_shadow = vmx_set_interrupt_shadow, 7996593Smarkm .get_interrupt_shadow = vmx_get_interrupt_shadow, 8096593Smarkm .patch_hypercall = vmx_patch_hypercall, 8196593Smarkm .inject_irq = vmx_inject_irq, 8296593Smarkm .inject_nmi = vmx_inject_nmi, 8396593Smarkm .inject_exception = vmx_inject_exception, 8496593Smarkm .cancel_injection = vmx_cancel_injection, 8596593Smarkm .interrupt_allowed = vmx_interrupt_allowed, 8696593Smarkm .nmi_allowed = vmx_nmi_allowed, 8796593Smarkm .get_nmi_mask = vmx_get_nmi_mask, 8896593Smarkm .set_nmi_mask = vmx_set_nmi_mask, 8996593Smarkm .enable_nmi_window = vmx_enable_nmi_window, 9096593Smarkm .enable_irq_window = vmx_enable_irq_window, 9196593Smarkm .update_cr8_intercept = vmx_update_cr8_intercept, 9296593Smarkm .set_virtual_apic_mode = vmx_set_virtual_apic_mode, 9396593Smarkm .set_apic_access_page_addr = vmx_set_apic_access_page_addr, 9496593Smarkm .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl, 9596593Smarkm .load_eoi_exitmap = vmx_load_eoi_exitmap, 9696593Smarkm .apicv_pre_state_restore = vmx_apicv_pre_state_restore, 9796593Smarkm .required_apicv_inhibits = VMX_REQUIRED_APICV_INHIBITS, 9896593Smarkm .hwapic_irr_update = vmx_hwapic_irr_update, 9996593Smarkm .hwapic_isr_update = vmx_hwapic_isr_update, 10096593Smarkm .guest_apic_has_interrupt = vmx_guest_apic_has_interrupt, 10196593Smarkm .sync_pir_to_irr = vmx_sync_pir_to_irr, 10296593Smarkm .deliver_interrupt = vmx_deliver_interrupt, 10396593Smarkm .dy_apicv_has_pending_interrupt = pi_has_pending_interrupt, 10496593Smarkm 10596593Smarkm .set_tss_addr = vmx_set_tss_addr, 10696593Smarkm .set_identity_map_addr = vmx_set_identity_map_addr, 10796593Smarkm .get_mt_mask = vmx_get_mt_mask, 10896593Smarkm 10996593Smarkm .get_exit_info = vmx_get_exit_info, 11096593Smarkm 11196593Smarkm .vcpu_after_set_cpuid = vmx_vcpu_after_set_cpuid, 11296593Smarkm 11396593Smarkm .has_wbinvd_exit = cpu_has_vmx_wbinvd_exit, 11496593Smarkm 11596593Smarkm .get_l2_tsc_offset = vmx_get_l2_tsc_offset, 11696593Smarkm .get_l2_tsc_multiplier = vmx_get_l2_tsc_multiplier, 11796593Smarkm .write_tsc_offset = vmx_write_tsc_offset, 11896593Smarkm .write_tsc_multiplier = vmx_write_tsc_multiplier, 11996593Smarkm 12096593Smarkm .load_mmu_pgd = vmx_load_mmu_pgd, 12196593Smarkm 12296593Smarkm .check_intercept = vmx_check_intercept, 12396593Smarkm .handle_exit_irqoff = vmx_handle_exit_irqoff, 12496593Smarkm 12596593Smarkm .sched_in = vmx_sched_in, 12696593Smarkm 12796593Smarkm .cpu_dirty_log_size = PML_ENTITY_NUM, 12896593Smarkm .update_cpu_dirty_logging = vmx_update_cpu_dirty_logging, 12996593Smarkm 13096593Smarkm .nested_ops = &vmx_nested_ops, 13196593Smarkm 13296593Smarkm .pi_update_irte = vmx_pi_update_irte, 133142429Snectar .pi_start_assignment = vmx_pi_start_assignment, 13496593Smarkm 135100946Snectar#ifdef CONFIG_X86_64 136296341Sdelphij .set_hv_timer = vmx_set_hv_timer, 137215698Ssimon .cancel_hv_timer = vmx_cancel_hv_timer, 138215698Ssimon#endif 139215698Ssimon 140215698Ssimon .setup_mce = vmx_setup_mce, 14196593Smarkm 142142429Snectar#ifdef CONFIG_KVM_SMM 14396593Smarkm .smi_allowed = vmx_smi_allowed, 14496593Smarkm .enter_smm = vmx_enter_smm, 14596593Smarkm .leave_smm = vmx_leave_smm, 14696593Smarkm .enable_smi_window = vmx_enable_smi_window, 147215698Ssimon#endif 14896593Smarkm 14996593Smarkm .check_emulate_instruction = vmx_check_emulate_instruction, 150215698Ssimon .apic_init_signal_blocked = vmx_apic_init_signal_blocked, 15196593Smarkm .migrate_timers = vmx_migrate_timers, 15296593Smarkm 15396593Smarkm .msr_filter_changed = vmx_msr_filter_changed, 15496593Smarkm .complete_emulated_msr = kvm_complete_insn_gp, 15596593Smarkm 15696593Smarkm .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector, 15796593Smarkm 15896593Smarkm .get_untagged_addr = vmx_get_untagged_addr, 15996593Smarkm}; 16096593Smarkm 161142429Snectarstruct kvm_x86_init_ops vt_init_ops __initdata = { 16296593Smarkm .hardware_setup = vmx_hardware_setup, 16396593Smarkm .handle_intel_pt_intr = NULL, 164142429Snectar 16596593Smarkm .runtime_ops = &vt_x86_ops, 166279264Sdelphij .pmu_ops = &intel_pmu_ops, 16796593Smarkm}; 168142429Snectar