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 | ||
