diff options
Diffstat (limited to 'meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff')
-rw-r--r-- | meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff new file mode 100644 index 0000000..13b251a --- /dev/null +++ b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff | |||
@@ -0,0 +1,128 @@ | |||
1 | From 8221f36672b7a1336c2bf245c394f0b5453784a1 Mon Sep 17 00:00:00 2001 | ||
2 | From: Will Deacon <will.deacon@arm.com> | ||
3 | Date: Thu, 26 Sep 2013 12:36:35 +0100 | ||
4 | Subject: [PATCH] ARM: perf: add support for perf registers API | ||
5 | |||
6 | This patch implements the functions required for the perf registers API, | ||
7 | allowing the perf tool to interface kernel register dumps with libunwind | ||
8 | in order to provide userspace backtracing. | ||
9 | |||
10 | B2Qt: Backported for 3.8 kernel | ||
11 | |||
12 | Cc: Jean Pihet <jean.pihet@linaro.org> | ||
13 | Signed-off-by: Will Deacon <will.deacon@arm.com> | ||
14 | --- | ||
15 | arch/arm/Kconfig | 2 ++ | ||
16 | arch/arm/include/uapi/asm/Kbuild | 1 + | ||
17 | arch/arm/include/uapi/asm/perf_regs.h | 23 +++++++++++++++++++++++ | ||
18 | arch/arm/kernel/Makefile | 1 + | ||
19 | arch/arm/kernel/perf_regs.c | 30 ++++++++++++++++++++++++++++++ | ||
20 | 5 files changed, 57 insertions(+) | ||
21 | create mode 100644 arch/arm/include/uapi/asm/perf_regs.h | ||
22 | create mode 100644 arch/arm/kernel/perf_regs.c | ||
23 | |||
24 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | ||
25 | index 67874b8..6f630be 100644 | ||
26 | --- a/arch/arm/Kconfig | ||
27 | +++ b/arch/arm/Kconfig | ||
28 | @@ -46,6 +46,8 @@ config ARM | ||
29 | select HAVE_MEMBLOCK | ||
30 | select HAVE_OPROFILE if (HAVE_PERF_EVENTS) | ||
31 | select HAVE_PERF_EVENTS | ||
32 | + select HAVE_PERF_REGS | ||
33 | + select HAVE_PERF_USER_STACK_DUMP | ||
34 | select HAVE_REGS_AND_STACK_ACCESS_API | ||
35 | select HAVE_SYSCALL_TRACEPOINTS | ||
36 | select HAVE_UID16 | ||
37 | diff --git a/arch/arm/include/uapi/asm/Kbuild b/arch/arm/include/uapi/asm/Kbuild | ||
38 | index 47bcb2d..570b82f 100644 | ||
39 | --- a/arch/arm/include/uapi/asm/Kbuild | ||
40 | +++ b/arch/arm/include/uapi/asm/Kbuild | ||
41 | @@ -8,6 +8,7 @@ header-y += hwcap.h | ||
42 | header-y += ioctls.h | ||
43 | header-y += kvm_para.h | ||
44 | header-y += mman.h | ||
45 | +header-y += perf_regs.h | ||
46 | header-y += posix_types.h | ||
47 | header-y += ptrace.h | ||
48 | header-y += setup.h | ||
49 | diff --git a/arch/arm/include/uapi/asm/perf_regs.h b/arch/arm/include/uapi/asm/perf_regs.h | ||
50 | new file mode 100644 | ||
51 | index 0000000..ce59448 | ||
52 | --- /dev/null | ||
53 | +++ b/arch/arm/include/uapi/asm/perf_regs.h | ||
54 | @@ -0,0 +1,23 @@ | ||
55 | +#ifndef _ASM_ARM_PERF_REGS_H | ||
56 | +#define _ASM_ARM_PERF_REGS_H | ||
57 | + | ||
58 | +enum perf_event_arm_regs { | ||
59 | + PERF_REG_ARM_R0, | ||
60 | + PERF_REG_ARM_R1, | ||
61 | + PERF_REG_ARM_R2, | ||
62 | + PERF_REG_ARM_R3, | ||
63 | + PERF_REG_ARM_R4, | ||
64 | + PERF_REG_ARM_R5, | ||
65 | + PERF_REG_ARM_R6, | ||
66 | + PERF_REG_ARM_R7, | ||
67 | + PERF_REG_ARM_R8, | ||
68 | + PERF_REG_ARM_R9, | ||
69 | + PERF_REG_ARM_R10, | ||
70 | + PERF_REG_ARM_FP, | ||
71 | + PERF_REG_ARM_IP, | ||
72 | + PERF_REG_ARM_SP, | ||
73 | + PERF_REG_ARM_LR, | ||
74 | + PERF_REG_ARM_PC, | ||
75 | + PERF_REG_ARM_MAX, | ||
76 | +}; | ||
77 | +#endif /* _ASM_ARM_PERF_REGS_H */ | ||
78 | diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile | ||
79 | index 5bbec7b..c6ab18f 100644 | ||
80 | --- a/arch/arm/kernel/Makefile | ||
81 | +++ b/arch/arm/kernel/Makefile | ||
82 | @@ -69,6 +69,7 @@ obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o | ||
83 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o | ||
84 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o | ||
85 | obj-$(CONFIG_IWMMXT) += iwmmxt.o | ||
86 | +obj-$(CONFIG_PERF_EVENTS) += perf_regs.o | ||
87 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o | ||
88 | AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt | ||
89 | obj-$(CONFIG_ARM_CPU_TOPOLOGY) += topology.o | ||
90 | diff --git a/arch/arm/kernel/perf_regs.c b/arch/arm/kernel/perf_regs.c | ||
91 | new file mode 100644 | ||
92 | index 0000000..6e4379c | ||
93 | --- /dev/null | ||
94 | +++ b/arch/arm/kernel/perf_regs.c | ||
95 | @@ -0,0 +1,30 @@ | ||
96 | + | ||
97 | +#include <linux/errno.h> | ||
98 | +#include <linux/kernel.h> | ||
99 | +#include <linux/perf_event.h> | ||
100 | +#include <linux/bug.h> | ||
101 | +#include <asm/perf_regs.h> | ||
102 | +#include <asm/ptrace.h> | ||
103 | + | ||
104 | +u64 perf_reg_value(struct pt_regs *regs, int idx) | ||
105 | +{ | ||
106 | + if (WARN_ON_ONCE((u32)idx >= PERF_REG_ARM_MAX)) | ||
107 | + return 0; | ||
108 | + | ||
109 | + return regs->uregs[idx]; | ||
110 | +} | ||
111 | + | ||
112 | +#define REG_RESERVED (~((1ULL << PERF_REG_ARM_MAX) - 1)) | ||
113 | + | ||
114 | +int perf_reg_validate(u64 mask) | ||
115 | +{ | ||
116 | + if (!mask || mask & REG_RESERVED) | ||
117 | + return -EINVAL; | ||
118 | + | ||
119 | + return 0; | ||
120 | +} | ||
121 | + | ||
122 | +u64 perf_reg_abi(struct task_struct *task) | ||
123 | +{ | ||
124 | + return PERF_SAMPLE_REGS_ABI_32; | ||
125 | +} | ||
126 | -- | ||
127 | 1.9.1 | ||
128 | |||