aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHou Pengyang <houpengyang@huawei.com>2015-05-10 11:07:40 +0000
committerAmit Pundir <amit.pundir@linaro.org>2017-05-25 18:18:13 +0530
commit54162c778c8aac6c7d11fe2c0fe0bd416a298f36 (patch)
tree83f49e9d60262d0307d499374d1fee1f2cefdb16
parent40f79d7a7e1a281c533a13fc96db995ba62fae5b (diff)
downloadlinux-linaro-stable-54162c778c8aac6c7d11fe2c0fe0bd416a298f36.tar.gz
UPSTREAM: arm64: perf: Fix callchain parse error with kernel tracepoint events
For ARM64, when tracing with tracepoint events, the IP and pstate 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.146 MB perf.data ] ./perf report -f Samples: 194 of event 'sched:sched_switch', Event count (approx.): 194 Children Self Command Shared Object Symbol 100.00% 100.00% ls [unknown] [.] 0000000000000000 The fix is to implement perf_arch_fetch_caller_regs for ARM64, which fills several necessary registers used for callchain unwinding, including pc,sp, fp and spsr . With this patch, callchain can be parsed correctly as follows: ...... + 2.63% 0.00% ls [kernel.kallsyms] [k] vfs_symlink + 2.63% 0.00% ls [kernel.kallsyms] [k] follow_down + 2.63% 0.00% ls [kernel.kallsyms] [k] pfkey_get + 2.63% 0.00% ls [kernel.kallsyms] [k] do_execveat_common.isra.33 - 2.63% 0.00% ls [kernel.kallsyms] [k] pfkey_send_policy_notify pfkey_send_policy_notify pfkey_get v9fs_vfs_rename page_follow_link_light link_path_walk el0_svc_naked ....... Signed-off-by: Hou Pengyang <houpengyang@huawei.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> (Cherry picked from commit 5b09a094f2fb768c76c8d4a82503df6fc7e1df63) Bug: 29520177 Signed-off-by: Mohan Srinivasan <srmohan@google.com> Change-Id: Iae65334c1ae27f8ae81ca2c11ffc8564dc61f51f
-rw-r--r--arch/arm64/include/asm/perf_event.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h
index d26d1d53c0d7..6471773db6fd 100644
--- a/arch/arm64/include/asm/perf_event.h
+++ b/arch/arm64/include/asm/perf_event.h
@@ -24,4 +24,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)->pc = (__ip); \
+ (regs)->regs[29] = (unsigned long) __builtin_frame_address(0); \
+ (regs)->sp = current_stack_pointer; \
+ (regs)->pstate = PSR_MODE_EL1h; \
+}
+
#endif