diff options
Diffstat (limited to 'recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch')
-rw-r--r-- | recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch b/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch new file mode 100644 index 0000000..1e497c6 --- /dev/null +++ b/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch | |||
@@ -0,0 +1,172 @@ | |||
1 | From 8abd7519c1fd2b6ae35eddbb41f93f44d3886000 Mon Sep 17 00:00:00 2001 | ||
2 | From: Will Deacon <will.deacon@arm.com> | ||
3 | Date: Thu, 26 Sep 2013 12:36:36 +0100 | ||
4 | Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM | ||
5 | |||
6 | This patch hooks in the perf_regs and libunwind code for ARM. | ||
7 | |||
8 | B2Qt: Backported for 3.10 kernel | ||
9 | |||
10 | Cc: Jean Pihet <jean.pihet@linaro.org> | ||
11 | Signed-off-by: Will Deacon <will.deacon@arm.com> | ||
12 | --- | ||
13 | tools/perf/Makefile | 6 +++- | ||
14 | tools/perf/arch/arm/Makefile | 3 ++ | ||
15 | tools/perf/arch/arm/include/perf_regs.h | 54 +++++++++++++++++++++++++++++++++ | ||
16 | tools/perf/arch/arm/util/unwind.c | 48 +++++++++++++++++++++++++++++ | ||
17 | 4 files changed, 110 insertions(+), 1 deletion(-) | ||
18 | create mode 100644 tools/perf/arch/arm/include/perf_regs.h | ||
19 | create mode 100644 tools/perf/arch/arm/util/unwind.c | ||
20 | |||
21 | diff --git a/tools/perf/Makefile b/tools/perf/Makefile | ||
22 | index b0f164b..f8fdad5 100644 | ||
23 | --- a/tools/perf/Makefile | ||
24 | +++ b/tools/perf/Makefile | ||
25 | @@ -87,6 +87,10 @@ ifeq ($(ARCH),x86_64) | ||
26 | NO_PERF_REGS := 0 | ||
27 | LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 | ||
28 | endif | ||
29 | +ifeq ($(ARCH),arm) | ||
30 | + NO_PERF_REGS := 0 | ||
31 | + LIBUNWIND_LIBS = -lunwind -lunwind-arm | ||
32 | +endif | ||
33 | |||
34 | # Treat warnings as errors unless directed not to | ||
35 | ifneq ($(WERROR),0) | ||
36 | @@ -607,7 +611,7 @@ endif # SOURCE_LIBELF | ||
37 | endif # NO_LIBELF | ||
38 | |||
39 | # There's only x86 (both 32 and 64) support for CFI unwind so far | ||
40 | -ifneq ($(ARCH),x86) | ||
41 | +ifeq ($(LIBUNWIND_LIBS),) | ||
42 | NO_LIBUNWIND := 1 | ||
43 | endif | ||
44 | |||
45 | diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile | ||
46 | index 15130b5..fe9b61e 100644 | ||
47 | --- a/tools/perf/arch/arm/Makefile | ||
48 | +++ b/tools/perf/arch/arm/Makefile | ||
49 | @@ -2,3 +2,6 @@ ifndef NO_DWARF | ||
50 | PERF_HAVE_DWARF_REGS := 1 | ||
51 | LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o | ||
52 | endif | ||
53 | +ifndef NO_LIBUNWIND | ||
54 | +LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o | ||
55 | +endif | ||
56 | diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h | ||
57 | new file mode 100644 | ||
58 | index 0000000..2a1cfde | ||
59 | --- /dev/null | ||
60 | +++ b/tools/perf/arch/arm/include/perf_regs.h | ||
61 | @@ -0,0 +1,54 @@ | ||
62 | +#ifndef ARCH_PERF_REGS_H | ||
63 | +#define ARCH_PERF_REGS_H | ||
64 | + | ||
65 | +#include <stdlib.h> | ||
66 | +#include "../../util/types.h" | ||
67 | +#include <asm/perf_regs.h> | ||
68 | + | ||
69 | +#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1) | ||
70 | +#define PERF_REG_IP PERF_REG_ARM_PC | ||
71 | +#define PERF_REG_SP PERF_REG_ARM_SP | ||
72 | + | ||
73 | +static inline const char *perf_reg_name(int id) | ||
74 | +{ | ||
75 | + switch (id) { | ||
76 | + case PERF_REG_ARM_R0: | ||
77 | + return "r0"; | ||
78 | + case PERF_REG_ARM_R1: | ||
79 | + return "r1"; | ||
80 | + case PERF_REG_ARM_R2: | ||
81 | + return "r2"; | ||
82 | + case PERF_REG_ARM_R3: | ||
83 | + return "r3"; | ||
84 | + case PERF_REG_ARM_R4: | ||
85 | + return "r4"; | ||
86 | + case PERF_REG_ARM_R5: | ||
87 | + return "r5"; | ||
88 | + case PERF_REG_ARM_R6: | ||
89 | + return "r6"; | ||
90 | + case PERF_REG_ARM_R7: | ||
91 | + return "r7"; | ||
92 | + case PERF_REG_ARM_R8: | ||
93 | + return "r8"; | ||
94 | + case PERF_REG_ARM_R9: | ||
95 | + return "r9"; | ||
96 | + case PERF_REG_ARM_R10: | ||
97 | + return "r10"; | ||
98 | + case PERF_REG_ARM_FP: | ||
99 | + return "fp"; | ||
100 | + case PERF_REG_ARM_IP: | ||
101 | + return "ip"; | ||
102 | + case PERF_REG_ARM_SP: | ||
103 | + return "sp"; | ||
104 | + case PERF_REG_ARM_LR: | ||
105 | + return "lr"; | ||
106 | + case PERF_REG_ARM_PC: | ||
107 | + return "pc"; | ||
108 | + default: | ||
109 | + return NULL; | ||
110 | + } | ||
111 | + | ||
112 | + return NULL; | ||
113 | +} | ||
114 | + | ||
115 | +#endif /* ARCH_PERF_REGS_H */ | ||
116 | diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c | ||
117 | new file mode 100644 | ||
118 | index 0000000..da3dc95 | ||
119 | --- /dev/null | ||
120 | +++ b/tools/perf/arch/arm/util/unwind.c | ||
121 | @@ -0,0 +1,48 @@ | ||
122 | + | ||
123 | +#include <errno.h> | ||
124 | +#include <libunwind.h> | ||
125 | +#include "perf_regs.h" | ||
126 | +#include "../../util/unwind.h" | ||
127 | + | ||
128 | +int unwind__arch_reg_id(int regnum) | ||
129 | +{ | ||
130 | + switch (regnum) { | ||
131 | + case UNW_ARM_R0: | ||
132 | + return PERF_REG_ARM_R0; | ||
133 | + case UNW_ARM_R1: | ||
134 | + return PERF_REG_ARM_R1; | ||
135 | + case UNW_ARM_R2: | ||
136 | + return PERF_REG_ARM_R2; | ||
137 | + case UNW_ARM_R3: | ||
138 | + return PERF_REG_ARM_R3; | ||
139 | + case UNW_ARM_R4: | ||
140 | + return PERF_REG_ARM_R4; | ||
141 | + case UNW_ARM_R5: | ||
142 | + return PERF_REG_ARM_R5; | ||
143 | + case UNW_ARM_R6: | ||
144 | + return PERF_REG_ARM_R6; | ||
145 | + case UNW_ARM_R7: | ||
146 | + return PERF_REG_ARM_R7; | ||
147 | + case UNW_ARM_R8: | ||
148 | + return PERF_REG_ARM_R8; | ||
149 | + case UNW_ARM_R9: | ||
150 | + return PERF_REG_ARM_R9; | ||
151 | + case UNW_ARM_R10: | ||
152 | + return PERF_REG_ARM_R10; | ||
153 | + case UNW_ARM_R11: | ||
154 | + return PERF_REG_ARM_FP; | ||
155 | + case UNW_ARM_R12: | ||
156 | + return PERF_REG_ARM_IP; | ||
157 | + case UNW_ARM_R13: | ||
158 | + return PERF_REG_ARM_SP; | ||
159 | + case UNW_ARM_R14: | ||
160 | + return PERF_REG_ARM_LR; | ||
161 | + case UNW_ARM_R15: | ||
162 | + return PERF_REG_ARM_PC; | ||
163 | + default: | ||
164 | + pr_err("unwind: invalid reg id %d\n", regnum); | ||
165 | + return -EINVAL; | ||
166 | + } | ||
167 | + | ||
168 | + return -EINVAL; | ||
169 | +} | ||
170 | -- | ||
171 | 1.9.1 | ||
172 | |||