Loading...
Note: File does not exist in v5.14.15.
1// SPDX-License-Identifier: GPL-2.0
2#include <linux/moduleparam.h>
3
4#include "x86_ops.h"
5#include "vmx.h"
6#include "nested.h"
7#include "pmu.h"
8#include "posted_intr.h"
9
10#define VMX_REQUIRED_APICV_INHIBITS \
11 (BIT(APICV_INHIBIT_REASON_DISABLED) | \
12 BIT(APICV_INHIBIT_REASON_ABSENT) | \
13 BIT(APICV_INHIBIT_REASON_HYPERV) | \
14 BIT(APICV_INHIBIT_REASON_BLOCKIRQ) | \
15 BIT(APICV_INHIBIT_REASON_PHYSICAL_ID_ALIASED) | \
16 BIT(APICV_INHIBIT_REASON_APIC_ID_MODIFIED) | \
17 BIT(APICV_INHIBIT_REASON_APIC_BASE_MODIFIED))
18
19struct kvm_x86_ops vt_x86_ops __initdata = {
20 .name = KBUILD_MODNAME,
21
22 .check_processor_compatibility = vmx_check_processor_compat,
23
24 .hardware_unsetup = vmx_hardware_unsetup,
25
26 .enable_virtualization_cpu = vmx_enable_virtualization_cpu,
27 .disable_virtualization_cpu = vmx_disable_virtualization_cpu,
28 .emergency_disable_virtualization_cpu = vmx_emergency_disable_virtualization_cpu,
29
30 .has_emulated_msr = vmx_has_emulated_msr,
31
32 .vm_size = sizeof(struct kvm_vmx),
33 .vm_init = vmx_vm_init,
34 .vm_destroy = vmx_vm_destroy,
35
36 .vcpu_precreate = vmx_vcpu_precreate,
37 .vcpu_create = vmx_vcpu_create,
38 .vcpu_free = vmx_vcpu_free,
39 .vcpu_reset = vmx_vcpu_reset,
40
41 .prepare_switch_to_guest = vmx_prepare_switch_to_guest,
42 .vcpu_load = vmx_vcpu_load,
43 .vcpu_put = vmx_vcpu_put,
44
45 .update_exception_bitmap = vmx_update_exception_bitmap,
46 .get_feature_msr = vmx_get_feature_msr,
47 .get_msr = vmx_get_msr,
48 .set_msr = vmx_set_msr,
49 .get_segment_base = vmx_get_segment_base,
50 .get_segment = vmx_get_segment,
51 .set_segment = vmx_set_segment,
52 .get_cpl = vmx_get_cpl,
53 .get_cpl_no_cache = vmx_get_cpl_no_cache,
54 .get_cs_db_l_bits = vmx_get_cs_db_l_bits,
55 .is_valid_cr0 = vmx_is_valid_cr0,
56 .set_cr0 = vmx_set_cr0,
57 .is_valid_cr4 = vmx_is_valid_cr4,
58 .set_cr4 = vmx_set_cr4,
59 .set_efer = vmx_set_efer,
60 .get_idt = vmx_get_idt,
61 .set_idt = vmx_set_idt,
62 .get_gdt = vmx_get_gdt,
63 .set_gdt = vmx_set_gdt,
64 .set_dr6 = vmx_set_dr6,
65 .set_dr7 = vmx_set_dr7,
66 .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs,
67 .cache_reg = vmx_cache_reg,
68 .get_rflags = vmx_get_rflags,
69 .set_rflags = vmx_set_rflags,
70 .get_if_flag = vmx_get_if_flag,
71
72 .flush_tlb_all = vmx_flush_tlb_all,
73 .flush_tlb_current = vmx_flush_tlb_current,
74 .flush_tlb_gva = vmx_flush_tlb_gva,
75 .flush_tlb_guest = vmx_flush_tlb_guest,
76
77 .vcpu_pre_run = vmx_vcpu_pre_run,
78 .vcpu_run = vmx_vcpu_run,
79 .handle_exit = vmx_handle_exit,
80 .skip_emulated_instruction = vmx_skip_emulated_instruction,
81 .update_emulated_instruction = vmx_update_emulated_instruction,
82 .set_interrupt_shadow = vmx_set_interrupt_shadow,
83 .get_interrupt_shadow = vmx_get_interrupt_shadow,
84 .patch_hypercall = vmx_patch_hypercall,
85 .inject_irq = vmx_inject_irq,
86 .inject_nmi = vmx_inject_nmi,
87 .inject_exception = vmx_inject_exception,
88 .cancel_injection = vmx_cancel_injection,
89 .interrupt_allowed = vmx_interrupt_allowed,
90 .nmi_allowed = vmx_nmi_allowed,
91 .get_nmi_mask = vmx_get_nmi_mask,
92 .set_nmi_mask = vmx_set_nmi_mask,
93 .enable_nmi_window = vmx_enable_nmi_window,
94 .enable_irq_window = vmx_enable_irq_window,
95 .update_cr8_intercept = vmx_update_cr8_intercept,
96
97 .x2apic_icr_is_split = false,
98 .set_virtual_apic_mode = vmx_set_virtual_apic_mode,
99 .set_apic_access_page_addr = vmx_set_apic_access_page_addr,
100 .refresh_apicv_exec_ctrl = vmx_refresh_apicv_exec_ctrl,
101 .load_eoi_exitmap = vmx_load_eoi_exitmap,
102 .apicv_pre_state_restore = vmx_apicv_pre_state_restore,
103 .required_apicv_inhibits = VMX_REQUIRED_APICV_INHIBITS,
104 .hwapic_irr_update = vmx_hwapic_irr_update,
105 .hwapic_isr_update = vmx_hwapic_isr_update,
106 .sync_pir_to_irr = vmx_sync_pir_to_irr,
107 .deliver_interrupt = vmx_deliver_interrupt,
108 .dy_apicv_has_pending_interrupt = pi_has_pending_interrupt,
109
110 .set_tss_addr = vmx_set_tss_addr,
111 .set_identity_map_addr = vmx_set_identity_map_addr,
112 .get_mt_mask = vmx_get_mt_mask,
113
114 .get_exit_info = vmx_get_exit_info,
115
116 .vcpu_after_set_cpuid = vmx_vcpu_after_set_cpuid,
117
118 .has_wbinvd_exit = cpu_has_vmx_wbinvd_exit,
119
120 .get_l2_tsc_offset = vmx_get_l2_tsc_offset,
121 .get_l2_tsc_multiplier = vmx_get_l2_tsc_multiplier,
122 .write_tsc_offset = vmx_write_tsc_offset,
123 .write_tsc_multiplier = vmx_write_tsc_multiplier,
124
125 .load_mmu_pgd = vmx_load_mmu_pgd,
126
127 .check_intercept = vmx_check_intercept,
128 .handle_exit_irqoff = vmx_handle_exit_irqoff,
129
130 .cpu_dirty_log_size = PML_ENTITY_NUM,
131 .update_cpu_dirty_logging = vmx_update_cpu_dirty_logging,
132
133 .nested_ops = &vmx_nested_ops,
134
135 .pi_update_irte = vmx_pi_update_irte,
136 .pi_start_assignment = vmx_pi_start_assignment,
137
138#ifdef CONFIG_X86_64
139 .set_hv_timer = vmx_set_hv_timer,
140 .cancel_hv_timer = vmx_cancel_hv_timer,
141#endif
142
143 .setup_mce = vmx_setup_mce,
144
145#ifdef CONFIG_KVM_SMM
146 .smi_allowed = vmx_smi_allowed,
147 .enter_smm = vmx_enter_smm,
148 .leave_smm = vmx_leave_smm,
149 .enable_smi_window = vmx_enable_smi_window,
150#endif
151
152 .check_emulate_instruction = vmx_check_emulate_instruction,
153 .apic_init_signal_blocked = vmx_apic_init_signal_blocked,
154 .migrate_timers = vmx_migrate_timers,
155
156 .msr_filter_changed = vmx_msr_filter_changed,
157 .complete_emulated_msr = kvm_complete_insn_gp,
158
159 .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
160
161 .get_untagged_addr = vmx_get_untagged_addr,
162};
163
164struct kvm_x86_init_ops vt_init_ops __initdata = {
165 .hardware_setup = vmx_hardware_setup,
166 .handle_intel_pt_intr = NULL,
167
168 .runtime_ops = &vt_x86_ops,
169 .pmu_ops = &intel_pmu_ops,
170};