aboutsummaryrefslogtreecommitdiffstats
path: root/meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch')
-rw-r--r--meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch172
1 files changed, 172 insertions, 0 deletions
diff --git a/meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch b/meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch
new file mode 100644
index 00000000..1e497c6e
--- /dev/null
+++ b/meta-toradex-extras/recipes/linux/linux-toradex-fsl/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch
@@ -0,0 +1,172 @@
+From 8abd7519c1fd2b6ae35eddbb41f93f44d3886000 Mon Sep 17 00:00:00 2001
+From: Will Deacon <will.deacon@arm.com>
+Date: Thu, 26 Sep 2013 12:36:36 +0100
+Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM
+
+This patch hooks in the perf_regs and libunwind code for ARM.
+
+B2Qt: Backported for 3.10 kernel
+
+Cc: Jean Pihet <jean.pihet@linaro.org>
+Signed-off-by: Will Deacon <will.deacon@arm.com>
+---
+ tools/perf/Makefile | 6 +++-
+ tools/perf/arch/arm/Makefile | 3 ++
+ tools/perf/arch/arm/include/perf_regs.h | 54 +++++++++++++++++++++++++++++++++
+ tools/perf/arch/arm/util/unwind.c | 48 +++++++++++++++++++++++++++++
+ 4 files changed, 110 insertions(+), 1 deletion(-)
+ create mode 100644 tools/perf/arch/arm/include/perf_regs.h
+ create mode 100644 tools/perf/arch/arm/util/unwind.c
+
+diff --git a/tools/perf/Makefile b/tools/perf/Makefile
+index b0f164b..f8fdad5 100644
+--- a/tools/perf/Makefile
++++ b/tools/perf/Makefile
+@@ -87,6 +87,10 @@ ifeq ($(ARCH),x86_64)
+ NO_PERF_REGS := 0
+ LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
+ endif
++ifeq ($(ARCH),arm)
++ NO_PERF_REGS := 0
++ LIBUNWIND_LIBS = -lunwind -lunwind-arm
++endif
+
+ # Treat warnings as errors unless directed not to
+ ifneq ($(WERROR),0)
+@@ -607,7 +611,7 @@ endif # SOURCE_LIBELF
+ endif # NO_LIBELF
+
+ # There's only x86 (both 32 and 64) support for CFI unwind so far
+-ifneq ($(ARCH),x86)
++ifeq ($(LIBUNWIND_LIBS),)
+ NO_LIBUNWIND := 1
+ endif
+
+diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile
+index 15130b5..fe9b61e 100644
+--- a/tools/perf/arch/arm/Makefile
++++ b/tools/perf/arch/arm/Makefile
+@@ -2,3 +2,6 @@ ifndef NO_DWARF
+ PERF_HAVE_DWARF_REGS := 1
+ LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
+ endif
++ifndef NO_LIBUNWIND
++LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o
++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 0000000..2a1cfde
+--- /dev/null
++++ b/tools/perf/arch/arm/include/perf_regs.h
+@@ -0,0 +1,54 @@
++#ifndef ARCH_PERF_REGS_H
++#define ARCH_PERF_REGS_H
++
++#include <stdlib.h>
++#include "../../util/types.h"
++#include <asm/perf_regs.h>
++
++#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1)
++#define PERF_REG_IP PERF_REG_ARM_PC
++#define PERF_REG_SP PERF_REG_ARM_SP
++
++static inline const char *perf_reg_name(int id)
++{
++ switch (id) {
++ case PERF_REG_ARM_R0:
++ return "r0";
++ case PERF_REG_ARM_R1:
++ return "r1";
++ case PERF_REG_ARM_R2:
++ return "r2";
++ case PERF_REG_ARM_R3:
++ return "r3";
++ case PERF_REG_ARM_R4:
++ return "r4";
++ case PERF_REG_ARM_R5:
++ return "r5";
++ case PERF_REG_ARM_R6:
++ return "r6";
++ case PERF_REG_ARM_R7:
++ return "r7";
++ case PERF_REG_ARM_R8:
++ return "r8";
++ case PERF_REG_ARM_R9:
++ return "r9";
++ case PERF_REG_ARM_R10:
++ return "r10";
++ case PERF_REG_ARM_FP:
++ return "fp";
++ case PERF_REG_ARM_IP:
++ return "ip";
++ case PERF_REG_ARM_SP:
++ return "sp";
++ case PERF_REG_ARM_LR:
++ return "lr";
++ case PERF_REG_ARM_PC:
++ return "pc";
++ default:
++ return NULL;
++ }
++
++ return NULL;
++}
++
++#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 0000000..da3dc95
+--- /dev/null
++++ b/tools/perf/arch/arm/util/unwind.c
+@@ -0,0 +1,48 @@
++
++#include <errno.h>
++#include <libunwind.h>
++#include "perf_regs.h"
++#include "../../util/unwind.h"
++
++int unwind__arch_reg_id(int regnum)
++{
++ switch (regnum) {
++ case UNW_ARM_R0:
++ return PERF_REG_ARM_R0;
++ case UNW_ARM_R1:
++ return PERF_REG_ARM_R1;
++ case UNW_ARM_R2:
++ return PERF_REG_ARM_R2;
++ case UNW_ARM_R3:
++ return PERF_REG_ARM_R3;
++ case UNW_ARM_R4:
++ return PERF_REG_ARM_R4;
++ case UNW_ARM_R5:
++ return PERF_REG_ARM_R5;
++ case UNW_ARM_R6:
++ return PERF_REG_ARM_R6;
++ case UNW_ARM_R7:
++ return PERF_REG_ARM_R7;
++ case UNW_ARM_R8:
++ return PERF_REG_ARM_R8;
++ case UNW_ARM_R9:
++ return PERF_REG_ARM_R9;
++ case UNW_ARM_R10:
++ return PERF_REG_ARM_R10;
++ case UNW_ARM_R11:
++ return PERF_REG_ARM_FP;
++ case UNW_ARM_R12:
++ return PERF_REG_ARM_IP;
++ case UNW_ARM_R13:
++ return PERF_REG_ARM_SP;
++ case UNW_ARM_R14:
++ return PERF_REG_ARM_LR;
++ case UNW_ARM_R15:
++ return PERF_REG_ARM_PC;
++ default:
++ pr_err("unwind: invalid reg id %d\n", regnum);
++ return -EINVAL;
++ }
++
++ return -EINVAL;
++}
+--
+1.9.1
+