diff options
author | Jean Pihet <jean.pihet@linaro.org> | 2014-05-16 04:41:12 -0400 |
---|---|---|
committer | Jiri Olsa <jolsa@kernel.org> | 2014-05-16 05:39:29 -0400 |
commit | 97eac381b113932bd7bd4a5c3c68b18e9ff7a2a0 (patch) | |
tree | 24162ddee6efa8f6af1ba4a06bd900906e66e6d0 /tools/perf | |
parent | 90fa9deb32b908fb258225ab562c4ef7ae8dd35a (diff) |
perf tools: Add libdw DWARF post unwind support for ARM
Adding libdw DWARF post unwind support, which is part
of elfutils-devel/libdw-dev package from version 0.158.
The new code is contained in unwin-libdw.c object, and
implements unwind__get_entries unwind interface function.
Signed-off-by: Jean Pihet <jean.pihet@linaro.org>
Reviewed-by: Will Deacon <will.deacon@arm.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1400229672-16104-4-git-send-email-jean.pihet@linaro.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
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 | } | ||