PerfMon v5 adds a fixed-counter support bitmap in CPUID.0AH:ECX. This is the superset of EDX[4:0] which indicates the contiguous counters starting from 0. For backward compatibility, it's recommended to use the following to determine if a fixed counter is supported: FxCtr[i]_is_supported := ECX[i] || (EDX[4:0] > i); Originally-by: Yang Weijiang Signed-off-by: Zide Chen --- arch/x86/kvm/cpuid.c | 5 ++++- arch/x86/kvm/vmx/pmu_intel.c | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 151a4794f834..ae6176fb0a93 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -1533,7 +1533,10 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function) entry->eax = eax.full; entry->ebx = kvm_pmu_cap.events_mask; - entry->ecx = 0; + if (kvm_pmu_cap.version > 4) + entry->ecx &= (u32)kvm_pmu_cap.fixed_cntr_mask64; + else + entry->ecx = 0; entry->edx = edx.full; break; } diff --git a/arch/x86/kvm/vmx/pmu_intel.c b/arch/x86/kvm/vmx/pmu_intel.c index 556c119d5e91..3f41e4916986 100644 --- a/arch/x86/kvm/vmx/pmu_intel.c +++ b/arch/x86/kvm/vmx/pmu_intel.c @@ -613,7 +613,10 @@ static void intel_pmu_refresh(struct kvm_vcpu *vcpu) kvm_pmu_cap.events_mask_len); pmu->available_event_types = ~entry->ebx & (BIT_ULL(eax.split.mask_length) - 1); + /* FxCtr[i]_is_supported := ECX[i] || (EDX[4:0] > i) */ fixed_cntr_mask = BIT_ULL(edx.split.num_counters_fixed) - 1; + if (pmu->version > 4) + fixed_cntr_mask |= entry->ecx; fixed_cntr_mask &= kvm_pmu_cap.fixed_cntr_mask64; /* -- 2.54.0