[Patch v9 22/24] perf/x86/intel: Enable PERF_PMU_CAP_SIMD_REGS capability
From: Dapeng Mi
Date: Sun Jul 05 2026 - 22:06:00 EST
Enable the PERF_PMU_CAP_SIMD_REGS capability when XSAVES support is
available for extended registers (YMM, ZMM, OPMASK, eGPRs, or SSP).
To simplify the validation logic and maintain consistency, enable
PERF_PMU_CAP_SIMD_REGS capability only when both XSAVES and
architectural PEBS are supported. In environments where PEBS is
unavailable (such as a guest), enable the capability if XSAVES
supports extended register states beyond basic XMM.
Co-developed-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
Signed-off-by: Kan Liang <kan.liang@xxxxxxxxxxxxxxx>
Signed-off-by: Dapeng Mi <dapeng1.mi@xxxxxxxxxxxxxxx>
---
arch/x86/events/intel/core.c | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 15962a3457ee..56997731dc83 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -6303,14 +6303,37 @@ static inline void __intel_update_pmu_xregs_caps(struct pmu *pmu)
*/
x86_pmu.ext_regs_mask |= XFEATURE_MASK_SSE;
+ if (boot_cpu_has(X86_FEATURE_AVX) &&
+ cpu_has_xfeatures(XFEATURE_MASK_YMM, NULL))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_YMM;
+ if (boot_cpu_has(X86_FEATURE_APX) &&
+ cpu_has_xfeatures(XFEATURE_MASK_APX, NULL))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_APX;
+ if (boot_cpu_has(X86_FEATURE_AVX512F)) {
+ if (cpu_has_xfeatures(XFEATURE_MASK_OPMASK, NULL))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_OPMASK;
+ if (cpu_has_xfeatures(XFEATURE_MASK_ZMM_Hi256, NULL))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_ZMM_Hi256;
+ if (cpu_has_xfeatures(XFEATURE_MASK_Hi16_ZMM, NULL))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_Hi16_ZMM;
+ }
+ if (cpu_feature_enabled(X86_FEATURE_USER_SHSTK))
+ x86_pmu.ext_regs_mask |= XFEATURE_MASK_CET_USER;
+
/* PEBS supported case */
- if ((x86_pmu.arch_pebs && (caps & ARCH_PEBS_VECR_XMM)) ||
- (x86_pmu.intel_cap.pebs_format >= 4 && x86_pmu.intel_cap.pebs_baseline))
+ if (x86_pmu.intel_cap.pebs_format >= 4 && x86_pmu.intel_cap.pebs_baseline)
dest_pmu->capabilities |= PERF_PMU_CAP_EXTENDED_REGS;
+ if (x86_pmu.arch_pebs && (caps & ARCH_PEBS_VECR_EXT)) {
+ dest_pmu->capabilities |= PERF_PMU_CAP_EXTENDED_REGS |
+ PERF_PMU_CAP_SIMD_REGS;
+ }
/* PEBS unsupported case (e.g., guest) */
- if (!x86_pmu.intel_cap.pebs_format)
+ if (!x86_pmu.intel_cap.pebs_format) {
dest_pmu->capabilities |= PERF_PMU_CAP_EXTENDED_REGS;
+ if (x86_pmu.ext_regs_mask > XFEATURE_MASK_SSE)
+ dest_pmu->capabilities |= PERF_PMU_CAP_SIMD_REGS;
+ }
}
static inline void __intel_update_large_pebs_flags(struct pmu *pmu)
--
2.34.1