summaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch
diff options
context:
space:
mode:
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.patch172
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 @@
1From 8abd7519c1fd2b6ae35eddbb41f93f44d3886000 Mon Sep 17 00:00:00 2001
2From: Will Deacon <will.deacon@arm.com>
3Date: Thu, 26 Sep 2013 12:36:36 +0100
4Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM
5
6This patch hooks in the perf_regs and libunwind code for ARM.
7
8B2Qt: Backported for 3.10 kernel
9
10Cc: Jean Pihet <jean.pihet@linaro.org>
11Signed-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
21diff --git a/tools/perf/Makefile b/tools/perf/Makefile
22index 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
45diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile
46index 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
56diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h
57new file mode 100644
58index 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 */
116diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c
117new file mode 100644
118index 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--
1711.9.1
172