]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
KVM: VMX: refactor evmcs_sanitize_exec_ctrls()
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 16 Oct 2018 16:50:00 +0000 (18:50 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Oct 2018 22:30:14 +0000 (00:30 +0200)
Split off EVMCS1_UNSUPPORTED_* macros so we can re-use them when
enabling Enlightened VMCS for Hyper-V on KVM.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index a9ed7a723a0c4d215e919db3c33596c6b37053cb..509d4e34dd62a852bce31a605b2a9010aa5e1e7c 100644 (file)
@@ -1392,6 +1392,49 @@ DEFINE_STATIC_KEY_FALSE(enable_evmcs);
 
 #define KVM_EVMCS_VERSION 1
 
+/*
+ * Enlightened VMCSv1 doesn't support these:
+ *
+ *     POSTED_INTR_NV                  = 0x00000002,
+ *     GUEST_INTR_STATUS               = 0x00000810,
+ *     APIC_ACCESS_ADDR                = 0x00002014,
+ *     POSTED_INTR_DESC_ADDR           = 0x00002016,
+ *     EOI_EXIT_BITMAP0                = 0x0000201c,
+ *     EOI_EXIT_BITMAP1                = 0x0000201e,
+ *     EOI_EXIT_BITMAP2                = 0x00002020,
+ *     EOI_EXIT_BITMAP3                = 0x00002022,
+ *     GUEST_PML_INDEX                 = 0x00000812,
+ *     PML_ADDRESS                     = 0x0000200e,
+ *     VM_FUNCTION_CONTROL             = 0x00002018,
+ *     EPTP_LIST_ADDRESS               = 0x00002024,
+ *     VMREAD_BITMAP                   = 0x00002026,
+ *     VMWRITE_BITMAP                  = 0x00002028,
+ *
+ *     TSC_MULTIPLIER                  = 0x00002032,
+ *     PLE_GAP                         = 0x00004020,
+ *     PLE_WINDOW                      = 0x00004022,
+ *     VMX_PREEMPTION_TIMER_VALUE      = 0x0000482E,
+ *      GUEST_IA32_PERF_GLOBAL_CTRL     = 0x00002808,
+ *      HOST_IA32_PERF_GLOBAL_CTRL      = 0x00002c04,
+ *
+ * Currently unsupported in KVM:
+ *     GUEST_IA32_RTIT_CTL             = 0x00002814,
+ */
+#define EVMCS1_UNSUPPORTED_PINCTRL (PIN_BASED_POSTED_INTR | \
+                                   PIN_BASED_VMX_PREEMPTION_TIMER)
+#define EVMCS1_UNSUPPORTED_2NDEXEC                                     \
+       (SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |                         \
+        SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |                      \
+        SECONDARY_EXEC_APIC_REGISTER_VIRT |                            \
+        SECONDARY_EXEC_ENABLE_PML |                                    \
+        SECONDARY_EXEC_ENABLE_VMFUNC |                                 \
+        SECONDARY_EXEC_SHADOW_VMCS |                                   \
+        SECONDARY_EXEC_TSC_SCALING |                                   \
+        SECONDARY_EXEC_PAUSE_LOOP_EXITING)
+#define EVMCS1_UNSUPPORTED_VMEXIT_CTRL (VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL)
+#define EVMCS1_UNSUPPORTED_VMENTRY_CTRL (VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL)
+#define EVMCS1_UNSUPPORTED_VMFUNC (VMX_VMFUNC_EPTP_SWITCHING)
+
 #if IS_ENABLED(CONFIG_HYPERV)
 static bool __read_mostly enlightened_vmcs = true;
 module_param(enlightened_vmcs, bool, 0444);
@@ -1484,69 +1527,12 @@ static void evmcs_load(u64 phys_addr)
 
 static void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf)
 {
-       /*
-        * Enlightened VMCSv1 doesn't support these:
-        *
-        *      POSTED_INTR_NV                  = 0x00000002,
-        *      GUEST_INTR_STATUS               = 0x00000810,
-        *      APIC_ACCESS_ADDR                = 0x00002014,
-        *      POSTED_INTR_DESC_ADDR           = 0x00002016,
-        *      EOI_EXIT_BITMAP0                = 0x0000201c,
-        *      EOI_EXIT_BITMAP1                = 0x0000201e,
-        *      EOI_EXIT_BITMAP2                = 0x00002020,
-        *      EOI_EXIT_BITMAP3                = 0x00002022,
-        */
-       vmcs_conf->pin_based_exec_ctrl &= ~PIN_BASED_POSTED_INTR;
-       vmcs_conf->cpu_based_2nd_exec_ctrl &=
-               ~SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY;
-       vmcs_conf->cpu_based_2nd_exec_ctrl &=
-               ~SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
-       vmcs_conf->cpu_based_2nd_exec_ctrl &=
-               ~SECONDARY_EXEC_APIC_REGISTER_VIRT;
-
-       /*
-        *      GUEST_PML_INDEX                 = 0x00000812,
-        *      PML_ADDRESS                     = 0x0000200e,
-        */
-       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_ENABLE_PML;
+       vmcs_conf->pin_based_exec_ctrl &= ~EVMCS1_UNSUPPORTED_PINCTRL;
+       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~EVMCS1_UNSUPPORTED_2NDEXEC;
 
-       /*      VM_FUNCTION_CONTROL             = 0x00002018, */
-       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_ENABLE_VMFUNC;
-
-       /*
-        *      EPTP_LIST_ADDRESS               = 0x00002024,
-        *      VMREAD_BITMAP                   = 0x00002026,
-        *      VMWRITE_BITMAP                  = 0x00002028,
-        */
-       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_SHADOW_VMCS;
+       vmcs_conf->vmexit_ctrl &= ~EVMCS1_UNSUPPORTED_VMEXIT_CTRL;
+       vmcs_conf->vmentry_ctrl &= ~EVMCS1_UNSUPPORTED_VMENTRY_CTRL;
 
-       /*
-        *      TSC_MULTIPLIER                  = 0x00002032,
-        */
-       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_TSC_SCALING;
-
-       /*
-        *      PLE_GAP                         = 0x00004020,
-        *      PLE_WINDOW                      = 0x00004022,
-        */
-       vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_PAUSE_LOOP_EXITING;
-
-       /*
-        *      VMX_PREEMPTION_TIMER_VALUE      = 0x0000482E,
-        */
-       vmcs_conf->pin_based_exec_ctrl &= ~PIN_BASED_VMX_PREEMPTION_TIMER;
-
-       /*
-        *      GUEST_IA32_PERF_GLOBAL_CTRL     = 0x00002808,
-        *      HOST_IA32_PERF_GLOBAL_CTRL      = 0x00002c04,
-        */
-       vmcs_conf->vmexit_ctrl &= ~VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL;
-       vmcs_conf->vmentry_ctrl &= ~VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL;
-
-       /*
-        * Currently unsupported in KVM:
-        *      GUEST_IA32_RTIT_CTL             = 0x00002814,
-        */
 }
 
 /* check_ept_pointer() should be under protection of ept_pointer_lock. */