summaryrefslogtreecommitdiff
path: root/tools/perf/arch/arm64/util
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/arch/arm64/util')
-rw-r--r--tools/perf/arch/arm64/util/Build3
-rw-r--r--tools/perf/arch/arm64/util/arm-spe.c17
-rw-r--r--tools/perf/arch/arm64/util/arm64_exception_types.h97
-rw-r--r--tools/perf/arch/arm64/util/header.c1
-rw-r--r--tools/perf/arch/arm64/util/kvm-stat.c84
-rw-r--r--tools/perf/arch/arm64/util/machine.c14
-rw-r--r--tools/perf/arch/arm64/util/mem-events.c4
-rw-r--r--tools/perf/arch/arm64/util/perf_regs.c182
-rw-r--r--tools/perf/arch/arm64/util/unwind-libdw.c61
9 files changed, 15 insertions, 448 deletions
diff --git a/tools/perf/arch/arm64/util/Build b/tools/perf/arch/arm64/util/Build
index d63881081d2e..4e06a08d281a 100644
--- a/tools/perf/arch/arm64/util/Build
+++ b/tools/perf/arch/arm64/util/Build
@@ -1,5 +1,3 @@
-perf-util-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
-perf-util-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
perf-util-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
perf-util-y += ../../arm/util/auxtrace.o
perf-util-y += ../../arm/util/cs-etm.o
@@ -9,6 +7,5 @@ perf-util-y += header.o
perf-util-y += hisi-ptt.o
perf-util-y += machine.o
perf-util-y += mem-events.o
-perf-util-y += perf_regs.o
perf-util-y += pmu.o
perf-util-y += tsc.o
diff --git a/tools/perf/arch/arm64/util/arm-spe.c b/tools/perf/arch/arm64/util/arm-spe.c
index d5ec1408d0ae..17ced7bbbdda 100644
--- a/tools/perf/arch/arm64/util/arm-spe.c
+++ b/tools/perf/arch/arm64/util/arm-spe.c
@@ -256,7 +256,7 @@ static __u64 arm_spe_pmu__sample_period(const struct perf_pmu *arm_spe_pmu)
static void arm_spe_setup_evsel(struct evsel *evsel, struct perf_cpu_map *cpus)
{
- u64 bit;
+ u64 pa_enable_bit;
evsel->core.attr.freq = 0;
evsel->core.attr.sample_period = arm_spe_pmu__sample_period(evsel->pmu);
@@ -274,7 +274,7 @@ static void arm_spe_setup_evsel(struct evsel *evsel, struct perf_cpu_map *cpus)
*/
if (!perf_cpu_map__is_any_cpu_or_is_empty(cpus)) {
evsel__set_sample_bit(evsel, CPU);
- evsel__set_config_if_unset(evsel->pmu, evsel, "ts_enable", 1);
+ evsel__set_config_if_unset(evsel, "ts_enable", 1);
}
/*
@@ -288,9 +288,10 @@ static void arm_spe_setup_evsel(struct evsel *evsel, struct perf_cpu_map *cpus)
* inform that the resulting output's SPE samples contain physical addresses
* where applicable.
*/
- bit = perf_pmu__format_bits(evsel->pmu, "pa_enable");
- if (evsel->core.attr.config & bit)
- evsel__set_sample_bit(evsel, PHYS_ADDR);
+
+ if (!evsel__get_config_val(evsel, "pa_enable", &pa_enable_bit))
+ if (pa_enable_bit)
+ evsel__set_sample_bit(evsel, PHYS_ADDR);
}
static int arm_spe_setup_aux_buffer(struct record_opts *opts)
@@ -397,6 +398,7 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
struct perf_cpu_map *cpus = evlist->core.user_requested_cpus;
bool discard = false;
int err;
+ u64 discard_bit;
sper->evlist = evlist;
@@ -425,9 +427,8 @@ static int arm_spe_recording_options(struct auxtrace_record *itr,
evlist__for_each_entry_safe(evlist, tmp, evsel) {
if (evsel__is_aux_event(evsel)) {
arm_spe_setup_evsel(evsel, cpus);
- if (evsel->core.attr.config &
- perf_pmu__format_bits(evsel->pmu, "discard"))
- discard = true;
+ if (!evsel__get_config_val(evsel, "discard", &discard_bit))
+ discard = !!discard_bit;
}
}
diff --git a/tools/perf/arch/arm64/util/arm64_exception_types.h b/tools/perf/arch/arm64/util/arm64_exception_types.h
deleted file mode 100644
index bf827f19ace0..000000000000
--- a/tools/perf/arch/arm64/util/arm64_exception_types.h
+++ /dev/null
@@ -1,97 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#ifndef ARCH_PERF_ARM64_EXCEPTION_TYPES_H
-#define ARCH_PERF_ARM64_EXCEPTION_TYPES_H
-
-/* Per asm/virt.h */
-#define HVC_STUB_ERR 0xbadca11
-
-/* Per asm/kvm_asm.h */
-#define ARM_EXCEPTION_IRQ 0
-#define ARM_EXCEPTION_EL1_SERROR 1
-#define ARM_EXCEPTION_TRAP 2
-#define ARM_EXCEPTION_IL 3
-/* The hyp-stub will return this for any kvm_call_hyp() call */
-#define ARM_EXCEPTION_HYP_GONE HVC_STUB_ERR
-
-#define kvm_arm_exception_type \
- {ARM_EXCEPTION_IRQ, "IRQ" }, \
- {ARM_EXCEPTION_EL1_SERROR, "SERROR" }, \
- {ARM_EXCEPTION_TRAP, "TRAP" }, \
- {ARM_EXCEPTION_IL, "ILLEGAL" }, \
- {ARM_EXCEPTION_HYP_GONE, "HYP_GONE" }
-
-/* Per asm/esr.h */
-#define ESR_ELx_EC_UNKNOWN (0x00)
-#define ESR_ELx_EC_WFx (0x01)
-/* Unallocated EC: 0x02 */
-#define ESR_ELx_EC_CP15_32 (0x03)
-#define ESR_ELx_EC_CP15_64 (0x04)
-#define ESR_ELx_EC_CP14_MR (0x05)
-#define ESR_ELx_EC_CP14_LS (0x06)
-#define ESR_ELx_EC_FP_ASIMD (0x07)
-#define ESR_ELx_EC_CP10_ID (0x08) /* EL2 only */
-#define ESR_ELx_EC_PAC (0x09) /* EL2 and above */
-#define ESR_ELx_EC_OTHER (0x0A)
-/* Unallocated EC: 0x0B */
-#define ESR_ELx_EC_CP14_64 (0x0C)
-#define ESR_ELx_EC_BTI (0x0D)
-#define ESR_ELx_EC_ILL (0x0E)
-/* Unallocated EC: 0x0F - 0x10 */
-#define ESR_ELx_EC_SVC32 (0x11)
-#define ESR_ELx_EC_HVC32 (0x12) /* EL2 only */
-#define ESR_ELx_EC_SMC32 (0x13) /* EL2 and above */
-/* Unallocated EC: 0x14 */
-#define ESR_ELx_EC_SVC64 (0x15)
-#define ESR_ELx_EC_HVC64 (0x16) /* EL2 and above */
-#define ESR_ELx_EC_SMC64 (0x17) /* EL2 and above */
-#define ESR_ELx_EC_SYS64 (0x18)
-#define ESR_ELx_EC_SVE (0x19)
-#define ESR_ELx_EC_ERET (0x1a) /* EL2 only */
-/* Unallocated EC: 0x1B */
-#define ESR_ELx_EC_FPAC (0x1C) /* EL1 and above */
-#define ESR_ELx_EC_SME (0x1D)
-/* Unallocated EC: 0x1E */
-#define ESR_ELx_EC_IMP_DEF (0x1f) /* EL3 only */
-#define ESR_ELx_EC_IABT_LOW (0x20)
-#define ESR_ELx_EC_IABT_CUR (0x21)
-#define ESR_ELx_EC_PC_ALIGN (0x22)
-/* Unallocated EC: 0x23 */
-#define ESR_ELx_EC_DABT_LOW (0x24)
-#define ESR_ELx_EC_DABT_CUR (0x25)
-#define ESR_ELx_EC_SP_ALIGN (0x26)
-#define ESR_ELx_EC_MOPS (0x27)
-#define ESR_ELx_EC_FP_EXC32 (0x28)
-/* Unallocated EC: 0x29 - 0x2B */
-#define ESR_ELx_EC_FP_EXC64 (0x2C)
-#define ESR_ELx_EC_GCS (0x2D)
-/* Unallocated EC: 0x2E */
-#define ESR_ELx_EC_SERROR (0x2F)
-#define ESR_ELx_EC_BREAKPT_LOW (0x30)
-#define ESR_ELx_EC_BREAKPT_CUR (0x31)
-#define ESR_ELx_EC_SOFTSTP_LOW (0x32)
-#define ESR_ELx_EC_SOFTSTP_CUR (0x33)
-#define ESR_ELx_EC_WATCHPT_LOW (0x34)
-#define ESR_ELx_EC_WATCHPT_CUR (0x35)
-/* Unallocated EC: 0x36 - 0x37 */
-#define ESR_ELx_EC_BKPT32 (0x38)
-/* Unallocated EC: 0x39 */
-#define ESR_ELx_EC_VECTOR32 (0x3A) /* EL2 only */
-/* Unallocated EC: 0x3B */
-#define ESR_ELx_EC_BRK64 (0x3C)
-/* Unallocated EC: 0x3D - 0x3F */
-#define ESR_ELx_EC_MAX (0x3F)
-
-#define ECN(x) { ESR_ELx_EC_##x, #x }
-
-#define kvm_arm_exception_class \
- ECN(UNKNOWN), ECN(WFx), ECN(CP15_32), ECN(CP15_64), ECN(CP14_MR), \
- ECN(CP14_LS), ECN(FP_ASIMD), ECN(CP10_ID), ECN(PAC), ECN(CP14_64), \
- ECN(SVC64), ECN(HVC64), ECN(SMC64), ECN(SYS64), ECN(SVE), \
- ECN(IMP_DEF), ECN(IABT_LOW), ECN(IABT_CUR), \
- ECN(PC_ALIGN), ECN(DABT_LOW), ECN(DABT_CUR), \
- ECN(SP_ALIGN), ECN(FP_EXC32), ECN(FP_EXC64), ECN(SERROR), \
- ECN(BREAKPT_LOW), ECN(BREAKPT_CUR), ECN(SOFTSTP_LOW), \
- ECN(SOFTSTP_CUR), ECN(WATCHPT_LOW), ECN(WATCHPT_CUR), \
- ECN(BKPT32), ECN(VECTOR32), ECN(BRK64)
-
-#endif /* ARCH_PERF_ARM64_EXCEPTION_TYPES_H */
diff --git a/tools/perf/arch/arm64/util/header.c b/tools/perf/arch/arm64/util/header.c
index f445a2dd6293..cbc0ba101636 100644
--- a/tools/perf/arch/arm64/util/header.c
+++ b/tools/perf/arch/arm64/util/header.c
@@ -1,4 +1,3 @@
-#include <linux/kernel.h>
#include <linux/bits.h>
#include <linux/bitfield.h>
#include <stdio.h>
diff --git a/tools/perf/arch/arm64/util/kvm-stat.c b/tools/perf/arch/arm64/util/kvm-stat.c
deleted file mode 100644
index 6611aa21cba9..000000000000
--- a/tools/perf/arch/arm64/util/kvm-stat.c
+++ /dev/null
@@ -1,84 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <errno.h>
-#include <memory.h>
-#include "../../../util/evsel.h"
-#include "../../../util/kvm-stat.h"
-#include "arm64_exception_types.h"
-#include "debug.h"
-
-define_exit_reasons_table(arm64_exit_reasons, kvm_arm_exception_type);
-define_exit_reasons_table(arm64_trap_exit_reasons, kvm_arm_exception_class);
-
-const char *kvm_trap_exit_reason = "esr_ec";
-const char *vcpu_id_str = "id";
-const char *kvm_exit_reason = "ret";
-const char *kvm_entry_trace = "kvm:kvm_entry";
-const char *kvm_exit_trace = "kvm:kvm_exit";
-
-const char *kvm_events_tp[] = {
- "kvm:kvm_entry",
- "kvm:kvm_exit",
- NULL,
-};
-
-static void event_get_key(struct evsel *evsel,
- struct perf_sample *sample,
- struct event_key *key)
-{
- key->info = 0;
- key->key = evsel__intval(evsel, sample, kvm_exit_reason);
- key->exit_reasons = arm64_exit_reasons;
-
- /*
- * TRAP exceptions carry exception class info in esr_ec field
- * and, hence, we need to use a different exit_reasons table to
- * properly decode event's est_ec.
- */
- if (key->key == ARM_EXCEPTION_TRAP) {
- key->key = evsel__intval(evsel, sample, kvm_trap_exit_reason);
- key->exit_reasons = arm64_trap_exit_reasons;
- }
-}
-
-static bool event_begin(struct evsel *evsel,
- struct perf_sample *sample __maybe_unused,
- struct event_key *key __maybe_unused)
-{
- return evsel__name_is(evsel, kvm_entry_trace);
-}
-
-static bool event_end(struct evsel *evsel,
- struct perf_sample *sample,
- struct event_key *key)
-{
- if (evsel__name_is(evsel, kvm_exit_trace)) {
- event_get_key(evsel, sample, key);
- return true;
- }
- return false;
-}
-
-static struct kvm_events_ops exit_events = {
- .is_begin_event = event_begin,
- .is_end_event = event_end,
- .decode_key = exit_event_decode_key,
- .name = "VM-EXIT"
-};
-
-struct kvm_reg_events_ops kvm_reg_events_ops[] = {
- {
- .name = "vmexit",
- .ops = &exit_events,
- },
- { NULL, NULL },
-};
-
-const char * const kvm_skip_events[] = {
- NULL,
-};
-
-int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unused)
-{
- kvm->exit_reasons_isa = "arm64";
- return 0;
-}
diff --git a/tools/perf/arch/arm64/util/machine.c b/tools/perf/arch/arm64/util/machine.c
index aab1cc2bc283..80fb13c958d9 100644
--- a/tools/perf/arch/arm64/util/machine.c
+++ b/tools/perf/arch/arm64/util/machine.c
@@ -1,18 +1,12 @@
// SPDX-License-Identifier: GPL-2.0
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-#include "debug.h"
-#include "symbol.h"
-#include "callchain.h"
+#include "callchain.h" // prototype of arch__add_leaf_frame_record_opts
#include "perf_regs.h"
#include "record.h"
-#include "util/perf_regs.h"
+
+#define SMPL_REG_MASK(b) (1ULL << (b))
void arch__add_leaf_frame_record_opts(struct record_opts *opts)
{
- const struct sample_reg *sample_reg_masks = arch__sample_reg_masks();
-
- opts->sample_user_regs |= sample_reg_masks[PERF_REG_ARM64_LR].mask;
+ opts->sample_user_regs |= SMPL_REG_MASK(PERF_REG_ARM64_LR);
}
diff --git a/tools/perf/arch/arm64/util/mem-events.c b/tools/perf/arch/arm64/util/mem-events.c
index 9f8da7937255..eaf00e0609c6 100644
--- a/tools/perf/arch/arm64/util/mem-events.c
+++ b/tools/perf/arch/arm64/util/mem-events.c
@@ -6,7 +6,7 @@
#define E(t, n, s, l, a) { .tag = t, .name = n, .event_name = s, .ldlat = l, .aux_event = a }
struct perf_mem_event perf_mem_events_arm[PERF_MEM_EVENTS__MAX] = {
- E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=0,min_latency=%u/", NULL, true, 0),
- E("spe-store", "%s/ts_enable=1,pa_enable=1,load_filter=0,store_filter=1/", NULL, false, 0),
+ E("spe-load", "%s/ts_enable=1,pa_enable=1,load_filter=1,min_latency=%u/", NULL, true, 0),
+ E("spe-store", "%s/ts_enable=1,pa_enable=1,store_filter=1/", NULL, false, 0),
E("spe-ldst", "%s/ts_enable=1,pa_enable=1,load_filter=1,store_filter=1,min_latency=%u/", NULL, true, 0),
};
diff --git a/tools/perf/arch/arm64/util/perf_regs.c b/tools/perf/arch/arm64/util/perf_regs.c
deleted file mode 100644
index 09308665e28a..000000000000
--- a/tools/perf/arch/arm64/util/perf_regs.c
+++ /dev/null
@@ -1,182 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <errno.h>
-#include <regex.h>
-#include <string.h>
-#include <sys/auxv.h>
-#include <linux/kernel.h>
-#include <linux/zalloc.h>
-
-#include "perf_regs.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
-
-static const struct sample_reg sample_reg_masks[] = {
- SMPL_REG(x0, PERF_REG_ARM64_X0),
- SMPL_REG(x1, PERF_REG_ARM64_X1),
- SMPL_REG(x2, PERF_REG_ARM64_X2),
- SMPL_REG(x3, PERF_REG_ARM64_X3),
- SMPL_REG(x4, PERF_REG_ARM64_X4),
- SMPL_REG(x5, PERF_REG_ARM64_X5),
- SMPL_REG(x6, PERF_REG_ARM64_X6),
- SMPL_REG(x7, PERF_REG_ARM64_X7),
- SMPL_REG(x8, PERF_REG_ARM64_X8),
- SMPL_REG(x9, PERF_REG_ARM64_X9),
- SMPL_REG(x10, PERF_REG_ARM64_X10),
- SMPL_REG(x11, PERF_REG_ARM64_X11),
- SMPL_REG(x12, PERF_REG_ARM64_X12),
- SMPL_REG(x13, PERF_REG_ARM64_X13),
- SMPL_REG(x14, PERF_REG_ARM64_X14),
- SMPL_REG(x15, PERF_REG_ARM64_X15),
- SMPL_REG(x16, PERF_REG_ARM64_X16),
- SMPL_REG(x17, PERF_REG_ARM64_X17),
- SMPL_REG(x18, PERF_REG_ARM64_X18),
- SMPL_REG(x19, PERF_REG_ARM64_X19),
- SMPL_REG(x20, PERF_REG_ARM64_X20),
- SMPL_REG(x21, PERF_REG_ARM64_X21),
- SMPL_REG(x22, PERF_REG_ARM64_X22),
- SMPL_REG(x23, PERF_REG_ARM64_X23),
- SMPL_REG(x24, PERF_REG_ARM64_X24),
- SMPL_REG(x25, PERF_REG_ARM64_X25),
- SMPL_REG(x26, PERF_REG_ARM64_X26),
- SMPL_REG(x27, PERF_REG_ARM64_X27),
- SMPL_REG(x28, PERF_REG_ARM64_X28),
- SMPL_REG(x29, PERF_REG_ARM64_X29),
- 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
-};
-
-/* %xNUM */
-#define SDT_OP_REGEX1 "^(x[1-2]?[0-9]|3[0-1])$"
-
-/* [sp], [sp, NUM] */
-#define SDT_OP_REGEX2 "^\\[sp(, )?([0-9]+)?\\]$"
-
-static regex_t sdt_op_regex1, sdt_op_regex2;
-
-static int sdt_init_op_regex(void)
-{
- static int initialized;
- int ret = 0;
-
- if (initialized)
- return 0;
-
- ret = regcomp(&sdt_op_regex1, SDT_OP_REGEX1, REG_EXTENDED);
- if (ret)
- goto error;
-
- ret = regcomp(&sdt_op_regex2, SDT_OP_REGEX2, REG_EXTENDED);
- if (ret)
- goto free_regex1;
-
- initialized = 1;
- return 0;
-
-free_regex1:
- regfree(&sdt_op_regex1);
-error:
- pr_debug4("Regex compilation error.\n");
- return ret;
-}
-
-/*
- * SDT marker arguments on Arm64 uses %xREG or [sp, NUM], currently
- * support these two formats.
- */
-int arch_sdt_arg_parse_op(char *old_op, char **new_op)
-{
- int ret, new_len;
- regmatch_t rm[5];
-
- ret = sdt_init_op_regex();
- if (ret < 0)
- return ret;
-
- if (!regexec(&sdt_op_regex1, old_op, 3, rm, 0)) {
- /* Extract xNUM */
- new_len = 2; /* % NULL */
- new_len += (int)(rm[1].rm_eo - rm[1].rm_so);
-
- *new_op = zalloc(new_len);
- if (!*new_op)
- return -ENOMEM;
-
- scnprintf(*new_op, new_len, "%%%.*s",
- (int)(rm[1].rm_eo - rm[1].rm_so), old_op + rm[1].rm_so);
- } else if (!regexec(&sdt_op_regex2, old_op, 5, rm, 0)) {
- /* [sp], [sp, NUM] or [sp,NUM] */
- new_len = 7; /* + ( % s p ) NULL */
-
- /* If the argument is [sp], need to fill offset '0' */
- if (rm[2].rm_so == -1)
- new_len += 1;
- else
- new_len += (int)(rm[2].rm_eo - rm[2].rm_so);
-
- *new_op = zalloc(new_len);
- if (!*new_op)
- return -ENOMEM;
-
- if (rm[2].rm_so == -1)
- scnprintf(*new_op, new_len, "+0(%%sp)");
- else
- scnprintf(*new_op, new_len, "+%.*s(%%sp)",
- (int)(rm[2].rm_eo - rm[2].rm_so),
- old_op + rm[2].rm_so);
- } else {
- pr_debug4("Skipping unsupported SDT argument: %s\n", old_op);
- return SDT_ARG_SKIP;
- }
-
- return SDT_ARG_VALID;
-}
-
-uint64_t arch__intr_reg_mask(void)
-{
- return PERF_REGS_MASK;
-}
-
-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;
-}
-
-const struct sample_reg *arch__sample_reg_masks(void)
-{
- return sample_reg_masks;
-}
diff --git a/tools/perf/arch/arm64/util/unwind-libdw.c b/tools/perf/arch/arm64/util/unwind-libdw.c
deleted file mode 100644
index b89b0a7e5ad9..000000000000
--- a/tools/perf/arch/arm64/util/unwind-libdw.c
+++ /dev/null
@@ -1,61 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <elfutils/libdwfl.h>
-#include "perf_regs.h"
-#include "../../../util/unwind-libdw.h"
-#include "../../../util/perf_regs.h"
-#include "../../../util/sample.h"
-
-bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
-{
- struct unwind_info *ui = arg;
- struct regs_dump *user_regs = perf_sample__user_regs(ui->sample);
- Dwarf_Word dwarf_regs[PERF_REG_ARM64_MAX], dwarf_pc;
-
-#define REG(r) ({ \
- Dwarf_Word val = 0; \
- perf_reg_value(&val, user_regs, PERF_REG_ARM64_##r); \
- val; \
-})
-
- dwarf_regs[0] = REG(X0);
- dwarf_regs[1] = REG(X1);
- dwarf_regs[2] = REG(X2);
- dwarf_regs[3] = REG(X3);
- dwarf_regs[4] = REG(X4);
- dwarf_regs[5] = REG(X5);
- dwarf_regs[6] = REG(X6);
- dwarf_regs[7] = REG(X7);
- dwarf_regs[8] = REG(X8);
- dwarf_regs[9] = REG(X9);
- dwarf_regs[10] = REG(X10);
- dwarf_regs[11] = REG(X11);
- dwarf_regs[12] = REG(X12);
- dwarf_regs[13] = REG(X13);
- dwarf_regs[14] = REG(X14);
- dwarf_regs[15] = REG(X15);
- dwarf_regs[16] = REG(X16);
- dwarf_regs[17] = REG(X17);
- dwarf_regs[18] = REG(X18);
- dwarf_regs[19] = REG(X19);
- dwarf_regs[20] = REG(X20);
- dwarf_regs[21] = REG(X21);
- dwarf_regs[22] = REG(X22);
- dwarf_regs[23] = REG(X23);
- dwarf_regs[24] = REG(X24);
- dwarf_regs[25] = REG(X25);
- dwarf_regs[26] = REG(X26);
- dwarf_regs[27] = REG(X27);
- dwarf_regs[28] = REG(X28);
- dwarf_regs[29] = REG(X29);
- dwarf_regs[30] = REG(LR);
- dwarf_regs[31] = REG(SP);
-
- if (!dwfl_thread_state_registers(thread, 0, PERF_REG_ARM64_MAX,
- dwarf_regs))
- return false;
-
- dwarf_pc = REG(PC);
- dwfl_thread_state_register_pc(thread, dwarf_pc);
-
- return true;
-}