diff options
author | Will Deacon <will.deacon@arm.com> | 2013-09-26 07:36:36 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2013-09-30 11:41:55 -0400 |
commit | 7495f3742dda97612a77d92fa62f85cb7591ab14 (patch) | |
tree | b9208a9e15ed268b6e96394493a09793b7fc1f0f /tools | |
parent | 49863894db3ed7bd41541b1c17733273966cea71 (diff) |
ARM: perf: wire up perf_regs and unwind support for ARM
This patch hooks in the perf_regs and libunwind code for ARM.
Cc: Jean Pihet <jean.pihet@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/arch/arm/Makefile | 3 | ||||
-rw-r--r-- | tools/perf/arch/arm/include/perf_regs.h | 54 | ||||
-rw-r--r-- | tools/perf/arch/arm/util/unwind.c | 48 | ||||
-rw-r--r-- | tools/perf/config/Makefile | 7 |
4 files changed, 110 insertions, 2 deletions
diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile index 15130b50dfe3..fe9b61e322a5 100644 --- a/tools/perf/arch/arm/Makefile +++ b/tools/perf/arch/arm/Makefile | |||
@@ -2,3 +2,6 @@ ifndef NO_DWARF | |||
2 | PERF_HAVE_DWARF_REGS := 1 | 2 | PERF_HAVE_DWARF_REGS := 1 |
3 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o | 3 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o |
4 | endif | 4 | endif |
5 | ifndef NO_LIBUNWIND | ||
6 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o | ||
7 | endif | ||
diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h new file mode 100644 index 000000000000..2a1cfde66b69 --- /dev/null +++ b/tools/perf/arch/arm/include/perf_regs.h | |||
@@ -0,0 +1,54 @@ | |||
1 | #ifndef ARCH_PERF_REGS_H | ||
2 | #define ARCH_PERF_REGS_H | ||
3 | |||
4 | #include <stdlib.h> | ||
5 | #include "../../util/types.h" | ||
6 | #include <asm/perf_regs.h> | ||
7 | |||
8 | #define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1) | ||
9 | #define PERF_REG_IP PERF_REG_ARM_PC | ||
10 | #define PERF_REG_SP PERF_REG_ARM_SP | ||
11 | |||
12 | static inline const char *perf_reg_name(int id) | ||
13 | { | ||
14 | switch (id) { | ||
15 | case PERF_REG_ARM_R0: | ||
16 | return "r0"; | ||
17 | case PERF_REG_ARM_R1: | ||
18 | return "r1"; | ||
19 | case PERF_REG_ARM_R2: | ||
20 | return "r2"; | ||
21 | case PERF_REG_ARM_R3: | ||
22 | return "r3"; | ||
23 | case PERF_REG_ARM_R4: | ||
24 | return "r4"; | ||
25 | case PERF_REG_ARM_R5: | ||
26 | return "r5"; | ||
27 | case PERF_REG_ARM_R6: | ||
28 | return "r6"; | ||
29 | case PERF_REG_ARM_R7: | ||
30 | return "r7"; | ||
31 | case PERF_REG_ARM_R8: | ||
32 | return "r8"; | ||
33 | case PERF_REG_ARM_R9: | ||
34 | return "r9"; | ||
35 | case PERF_REG_ARM_R10: | ||
36 | return "r10"; | ||
37 | case PERF_REG_ARM_FP: | ||
38 | return "fp"; | ||
39 | case PERF_REG_ARM_IP: | ||
40 | return "ip"; | ||
41 | case PERF_REG_ARM_SP: | ||
42 | return "sp"; | ||
43 | case PERF_REG_ARM_LR: | ||
44 | return "lr"; | ||
45 | case PERF_REG_ARM_PC: | ||
46 | return "pc"; | ||
47 | default: | ||
48 | return NULL; | ||
49 | } | ||
50 | |||
51 | return NULL; | ||
52 | } | ||
53 | |||
54 | #endif /* ARCH_PERF_REGS_H */ | ||
diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c new file mode 100644 index 000000000000..da3dc950550c --- /dev/null +++ b/tools/perf/arch/arm/util/unwind.c | |||
@@ -0,0 +1,48 @@ | |||
1 | |||
2 | #include <errno.h> | ||
3 | #include <libunwind.h> | ||
4 | #include "perf_regs.h" | ||
5 | #include "../../util/unwind.h" | ||
6 | |||
7 | int unwind__arch_reg_id(int regnum) | ||
8 | { | ||
9 | switch (regnum) { | ||
10 | case UNW_ARM_R0: | ||
11 | return PERF_REG_ARM_R0; | ||
12 | case UNW_ARM_R1: | ||
13 | return PERF_REG_ARM_R1; | ||
14 | case UNW_ARM_R2: | ||
15 | return PERF_REG_ARM_R2; | ||
16 | case UNW_ARM_R3: | ||
17 | return PERF_REG_ARM_R3; | ||
18 | case UNW_ARM_R4: | ||
19 | return PERF_REG_ARM_R4; | ||
20 | case UNW_ARM_R5: | ||
21 | return PERF_REG_ARM_R5; | ||
22 | case UNW_ARM_R6: | ||
23 | return PERF_REG_ARM_R6; | ||
24 | case UNW_ARM_R7: | ||
25 | return PERF_REG_ARM_R7; | ||
26 | case UNW_ARM_R8: | ||
27 | return PERF_REG_ARM_R8; | ||
28 | case UNW_ARM_R9: | ||
29 | return PERF_REG_ARM_R9; | ||
30 | case UNW_ARM_R10: | ||
31 | return PERF_REG_ARM_R10; | ||
32 | case UNW_ARM_R11: | ||
33 | return PERF_REG_ARM_FP; | ||
34 | case UNW_ARM_R12: | ||
35 | return PERF_REG_ARM_IP; | ||
36 | case UNW_ARM_R13: | ||
37 | return PERF_REG_ARM_SP; | ||
38 | case UNW_ARM_R14: | ||
39 | return PERF_REG_ARM_LR; | ||
40 | case UNW_ARM_R15: | ||
41 | return PERF_REG_ARM_PC; | ||
42 | default: | ||
43 | pr_err("unwind: invalid reg id %d\n", regnum); | ||
44 | return -EINVAL; | ||
45 | } | ||
46 | |||
47 | return -EINVAL; | ||
48 | } | ||
diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile index 5f6f9b3271bb..4796ce54e653 100644 --- a/tools/perf/config/Makefile +++ b/tools/perf/config/Makefile | |||
@@ -29,6 +29,10 @@ ifeq ($(ARCH),x86_64) | |||
29 | NO_PERF_REGS := 0 | 29 | NO_PERF_REGS := 0 |
30 | LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 | 30 | LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 |
31 | endif | 31 | endif |
32 | ifeq ($(ARCH),arm) | ||
33 | NO_PERF_REGS := 0 | ||
34 | LIBUNWIND_LIBS = -lunwind -lunwind-arm | ||
35 | endif | ||
32 | 36 | ||
33 | ifeq ($(NO_PERF_REGS),0) | 37 | ifeq ($(NO_PERF_REGS),0) |
34 | CFLAGS += -DHAVE_PERF_REGS | 38 | CFLAGS += -DHAVE_PERF_REGS |
@@ -208,8 +212,7 @@ ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y) | |||
208 | endif # try-cc | 212 | endif # try-cc |
209 | endif # NO_LIBELF | 213 | endif # NO_LIBELF |
210 | 214 | ||
211 | # There's only x86 (both 32 and 64) support for CFI unwind so far | 215 | ifeq ($(LIBUNWIND_LIBS),) |
212 | ifneq ($(ARCH),x86) | ||
213 | NO_LIBUNWIND := 1 | 216 | NO_LIBUNWIND := 1 |
214 | endif | 217 | endif |
215 | 218 | ||