aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/include/asm/perf_event.h
diff options
context:
space:
mode:
authorHou Pengyang <houpengyang@huawei.com>2015-05-08 06:43:03 +0100
committerAmit Pundir <amit.pundir@linaro.org>2017-05-25 18:19:34 +0530
commit61c92ff9f7a1d58744371be531ba398a43301bd0 (patch)
tree66c5baab51b075537635db3e6a8d4100a7e16886 /arch/arm/include/asm/perf_event.h
parent601e0069c24bdf0c1ae4e49021e3deee8ba2749f (diff)
downloadlinux-linaro-stable-61c92ff9f7a1d58744371be531ba398a43301bd0.tar.gz
UPSTREAM: arm: perf: Fix callchain parse error with kernel tracepoint eventslsk-v3.18-17.05-android
For ARM, when tracing with tracepoint events, the IP and cpsr are set to 0, preventing the perf code parsing the callchain and resolving the symbols correctly. ./perf record -e sched:sched_switch -g --call-graph dwarf ls [ perf record: Captured and wrote 0.006 MB perf.data ] ./perf report -f Samples: 5 of event 'sched:sched_switch', Event count (approx.): 5 Children Self Command Shared Object Symbol 100.00% 100.00% ls [unknown] [.] 00000000 The fix is to implement perf_arch_fetch_caller_regs for ARM, which fills several necessary registers used for callchain unwinding, including pc,sp, fp and cpsr. With this patch, callchain can be parsed correctly as : ..... - 100.00% 100.00% ls [kernel.kallsyms] [k] __sched_text_start + __sched_text_start + 20.00% 0.00% ls libc-2.18.so [.] _dl_addr + 20.00% 0.00% ls libc-2.18.so [.] write ..... Jean Pihet found this in ARM and come up with a patch: http://thread.gmane.org/gmane.linux.kernel/1734283/focus=1734280 This patch rewrite Jean's patch in C. Signed-off-by: Hou Pengyang <houpengyang@huawei.com> Signed-off-by: Will Deacon <will.deacon@arm.com> (cherry picked from commit b3eac0265bf6258f08dcd4ac7fa7f87cc050defc) Bug: 29520177 Signed-off-by: Mohan Srinivasan <srmohan@google.com> Change-Id: Ia87ea58982acdf3bcdfa43bdeed92539f46e8b0c
Diffstat (limited to 'arch/arm/include/asm/perf_event.h')
-rw-r--r--arch/arm/include/asm/perf_event.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm/include/asm/perf_event.h b/arch/arm/include/asm/perf_event.h
index c3a83691af8e..6f3bfce213d0 100644
--- a/arch/arm/include/asm/perf_event.h
+++ b/arch/arm/include/asm/perf_event.h
@@ -19,4 +19,11 @@ extern unsigned long perf_misc_flags(struct pt_regs *regs);
#define perf_misc_flags(regs) perf_misc_flags(regs)
#endif
+#define perf_arch_fetch_caller_regs(regs, __ip) { \
+ (regs)->ARM_pc = (__ip); \
+ (regs)->ARM_fp = (unsigned long) __builtin_frame_address(0); \
+ (regs)->ARM_sp = current_stack_pointer; \
+ (regs)->ARM_cpsr = SVC_MODE; \
+}
+
#endif /* __ARM_PERF_EVENT_H__ */