diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/arch/arm/Makefile | 5 | ||||
-rw-r--r-- | tools/perf/arch/arm/util/unwind-libdw.c | 36 |
2 files changed, 41 insertions, 0 deletions
diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile index 221f21d5ca28..09d62153d384 100644 --- a/tools/perf/arch/arm/Makefile +++ b/tools/perf/arch/arm/Makefile | |||
@@ -4,6 +4,11 @@ LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o | |||
4 | endif | 4 | endif |
5 | ifndef NO_LIBUNWIND | 5 | ifndef NO_LIBUNWIND |
6 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libunwind.o | 6 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libunwind.o |
7 | endif | ||
8 | ifndef NO_LIBDW_DWARF_UNWIND | ||
9 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libdw.o | ||
10 | endif | ||
11 | ifndef NO_DWARF_UNWIND | ||
7 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/regs_load.o | 12 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/regs_load.o |
8 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/dwarf-unwind.o | 13 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/dwarf-unwind.o |
9 | endif | 14 | endif |
diff --git a/tools/perf/arch/arm/util/unwind-libdw.c b/tools/perf/arch/arm/util/unwind-libdw.c new file mode 100644 index 000000000000..b4176c60117a --- /dev/null +++ b/tools/perf/arch/arm/util/unwind-libdw.c | |||
@@ -0,0 +1,36 @@ | |||
1 | #include <elfutils/libdwfl.h> | ||
2 | #include "../../util/unwind-libdw.h" | ||
3 | #include "../../util/perf_regs.h" | ||
4 | |||
5 | bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) | ||
6 | { | ||
7 | struct unwind_info *ui = arg; | ||
8 | struct regs_dump *user_regs = &ui->sample->user_regs; | ||
9 | Dwarf_Word dwarf_regs[PERF_REG_ARM_MAX]; | ||
10 | |||
11 | #define REG(r) ({ \ | ||
12 | Dwarf_Word val = 0; \ | ||
13 | perf_reg_value(&val, user_regs, PERF_REG_ARM_##r); \ | ||
14 | val; \ | ||
15 | }) | ||
16 | |||
17 | dwarf_regs[0] = REG(R0); | ||
18 | dwarf_regs[1] = REG(R1); | ||
19 | dwarf_regs[2] = REG(R2); | ||
20 | dwarf_regs[3] = REG(R3); | ||
21 | dwarf_regs[4] = REG(R4); | ||
22 | dwarf_regs[5] = REG(R5); | ||
23 | dwarf_regs[6] = REG(R6); | ||
24 | dwarf_regs[7] = REG(R7); | ||
25 | dwarf_regs[8] = REG(R8); | ||
26 | dwarf_regs[9] = REG(R9); | ||
27 | dwarf_regs[10] = REG(R10); | ||
28 | dwarf_regs[11] = REG(FP); | ||
29 | dwarf_regs[12] = REG(IP); | ||
30 | dwarf_regs[13] = REG(SP); | ||
31 | dwarf_regs[14] = REG(LR); | ||
32 | dwarf_regs[15] = REG(PC); | ||
33 | |||
34 | return dwfl_thread_state_registers(thread, 0, PERF_REG_ARM_MAX, | ||
35 | dwarf_regs); | ||
36 | } | ||