mirror of https://gitee.com/openkylin/linux.git
KVM: VMX: refactor evmcs_sanitize_exec_ctrls()
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>
This commit is contained in:
parent
72bbf9358c
commit
5d7a644336
|
@ -1392,6 +1392,49 @@ DEFINE_STATIC_KEY_FALSE(enable_evmcs);
|
||||||
|
|
||||||
#define KVM_EVMCS_VERSION 1
|
#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)
|
#if IS_ENABLED(CONFIG_HYPERV)
|
||||||
static bool __read_mostly enlightened_vmcs = true;
|
static bool __read_mostly enlightened_vmcs = true;
|
||||||
module_param(enlightened_vmcs, bool, 0444);
|
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)
|
static void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf)
|
||||||
{
|
{
|
||||||
/*
|
vmcs_conf->pin_based_exec_ctrl &= ~EVMCS1_UNSUPPORTED_PINCTRL;
|
||||||
* Enlightened VMCSv1 doesn't support these:
|
vmcs_conf->cpu_based_2nd_exec_ctrl &= ~EVMCS1_UNSUPPORTED_2NDEXEC;
|
||||||
*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
/*
|
vmcs_conf->vmexit_ctrl &= ~EVMCS1_UNSUPPORTED_VMEXIT_CTRL;
|
||||||
* GUEST_PML_INDEX = 0x00000812,
|
vmcs_conf->vmentry_ctrl &= ~EVMCS1_UNSUPPORTED_VMENTRY_CTRL;
|
||||||
* PML_ADDRESS = 0x0000200e,
|
|
||||||
*/
|
|
||||||
vmcs_conf->cpu_based_2nd_exec_ctrl &= ~SECONDARY_EXEC_ENABLE_PML;
|
|
||||||
|
|
||||||
/* 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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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. */
|
/* check_ept_pointer() should be under protection of ept_pointer_lock. */
|
||||||
|
|
Loading…
Reference in New Issue