Messages in this thread Patch in this message | | | Date | Thu, 28 Jul 2022 23:52:05 +0200 | Subject | Re: [PATCH v4 09/25] KVM: VMX: nVMX: Support TSC scaling and PERF_GLOBAL_CTRL with enlightened VMCS | From | Paolo Bonzini <> |
| |
On 7/25/22 20:18, Sean Christopherson wrote: >> I kind of like the idea of having a two-dimensional array based on the enums >> instead of switch statements, so for now I'll keep Vitaly's enums. > I don't have a strong opinion on using a 2d array, but unless I'm missing something, > that's nowhere to be found in this patch. IMO, having the enums without them > providing any unique value is silly and obfuscates the code.
Yeah, like this:
diff --git a/arch/x86/kvm/vmx/evmcs.c b/arch/x86/kvm/vmx/evmcs.c index d8da4026c93d..8055128d8638 100644 --- a/arch/x86/kvm/vmx/evmcs.c +++ b/arch/x86/kvm/vmx/evmcs.c @@ -342,9 +342,10 @@ uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu) return 0; } -enum evmcs_v1_revision { +enum evmcs_revision { EVMCSv1_2016, EVMCSv1_2022, + EVMCS_REVISION_MAX, }; enum evmcs_unsupported_ctrl_type { @@ -353,13 +354,37 @@ enum evmcs_unsupported_ctrl_type { EVMCS_2NDEXEC, EVMCS_PINCTRL, EVMCS_VMFUNC, + EVMCS_CTRL_MAX, +}; + +static u32 evmcs_unsupported_ctls[EVMCS_CTRL_MAX][EVMCS_REVISION_MAX] = { + [EVMCS_EXIT_CTLS] = { + [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMEXIT_CTRL | VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL, + [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMEXIT_CTRL, + }, + [EVMCS_ENTRY_CTLS] = { + [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMENTRY_CTRL | VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL, + [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMENTRY_CTRL, + }, + [EVMCS_2NDEXEC] = { + [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_2NDEXEC | SECONDARY_EXEC_TSC_SCALING, + [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_2NDEXEC, + }, + [EVMCS_PINCTRL] = { + [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_PINCTRL, + [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_PINCTRL, + }, + [EVMCS_VMFUNC] = { + [EVMCSv1_2016] = EVMCS1_UNSUPPORTED_VMFUNC, + [EVMCSv1_2022] = EVMCS1_UNSUPPORTED_VMFUNC, + }, }; static u32 evmcs_get_unsupported_ctls(struct kvm_vcpu *vcpu, enum evmcs_unsupported_ctrl_type ctrl_type) { struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); - enum evmcs_v1_revision evmcs_rev = EVMCSv1_2016; + enum evmcs_revision evmcs_rev = EVMCSv1_2016; if (!hv_vcpu) return 0; @@ -367,32 +392,7 @@ static u32 evmcs_get_unsupported_ctls(struct kvm_vcpu *vcpu, if (hv_vcpu->cpuid_cache.nested_ebx & HV_X64_NESTED_EVMCS1_2022_UPDATE) evmcs_rev = EVMCSv1_2022; - switch (ctrl_type) { - case EVMCS_EXIT_CTLS: - if (evmcs_rev == EVMCSv1_2016) - return EVMCS1_UNSUPPORTED_VMEXIT_CTRL | - VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL; - else - return EVMCS1_UNSUPPORTED_VMEXIT_CTRL; - case EVMCS_ENTRY_CTLS: - if (evmcs_rev == EVMCSv1_2016) - return EVMCS1_UNSUPPORTED_VMENTRY_CTRL | - VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL; - else - return EVMCS1_UNSUPPORTED_VMENTRY_CTRL; - case EVMCS_2NDEXEC: - if (evmcs_rev == EVMCSv1_2016) - return EVMCS1_UNSUPPORTED_2NDEXEC | - SECONDARY_EXEC_TSC_SCALING; - else - return EVMCS1_UNSUPPORTED_2NDEXEC; - case EVMCS_PINCTRL: - return EVMCS1_UNSUPPORTED_PINCTRL; - case EVMCS_VMFUNC: - return EVMCS1_UNSUPPORTED_VMFUNC; - } - - return 0; + return evmcs_unsupported_ctls[ctrl_type][evmcs_rev]; } void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) Paolo
| |