perf tools arm64: Add support for VG register
[platform/kernel/linux-starfive.git] / tools / perf / arch / arm64 / util / perf_regs.c
index 476b037..006692c 100644 (file)
@@ -2,13 +2,19 @@
 #include <errno.h>
 #include <regex.h>
 #include <string.h>
+#include <sys/auxv.h>
 #include <linux/kernel.h>
 #include <linux/zalloc.h>
 
+#include "../../../perf-sys.h"
 #include "../../../util/debug.h"
 #include "../../../util/event.h"
 #include "../../../util/perf_regs.h"
 
+#ifndef HWCAP_SVE
+#define HWCAP_SVE      (1 << 22)
+#endif
+
 const struct sample_reg sample_reg_masks[] = {
        SMPL_REG(x0, PERF_REG_ARM64_X0),
        SMPL_REG(x1, PERF_REG_ARM64_X1),
@@ -43,6 +49,7 @@ const struct sample_reg sample_reg_masks[] = {
        SMPL_REG(lr, PERF_REG_ARM64_LR),
        SMPL_REG(sp, PERF_REG_ARM64_SP),
        SMPL_REG(pc, PERF_REG_ARM64_PC),
+       SMPL_REG(vg, PERF_REG_ARM64_VG),
        SMPL_REG_END
 };
 
@@ -131,3 +138,34 @@ int arch_sdt_arg_parse_op(char *old_op, char **new_op)
 
        return SDT_ARG_VALID;
 }
+
+uint64_t arch__user_reg_mask(void)
+{
+       struct perf_event_attr attr = {
+               .type                   = PERF_TYPE_HARDWARE,
+               .config                 = PERF_COUNT_HW_CPU_CYCLES,
+               .sample_type            = PERF_SAMPLE_REGS_USER,
+               .disabled               = 1,
+               .exclude_kernel         = 1,
+               .sample_period          = 1,
+               .sample_regs_user       = PERF_REGS_MASK
+       };
+       int fd;
+
+       if (getauxval(AT_HWCAP) & HWCAP_SVE)
+               attr.sample_regs_user |= SMPL_REG_MASK(PERF_REG_ARM64_VG);
+
+       /*
+        * Check if the pmu supports perf extended regs, before
+        * returning the register mask to sample.
+        */
+       if (attr.sample_regs_user != PERF_REGS_MASK) {
+               event_attr_init(&attr);
+               fd = sys_perf_event_open(&attr, 0, -1, -1, 0);
+               if (fd != -1) {
+                       close(fd);
+                       return attr.sample_regs_user;
+               }
+       }
+       return PERF_REGS_MASK;
+}