diff options
author | Hou Pengyang <houpengyang@huawei.com> | 2015-05-08 06:43:03 +0100 |
---|---|---|
committer | Amit Pundir <amit.pundir@linaro.org> | 2017-05-25 18:19:34 +0530 |
commit | 61c92ff9f7a1d58744371be531ba398a43301bd0 (patch) | |
tree | 66c5baab51b075537635db3e6a8d4100a7e16886 | |
parent | 601e0069c24bdf0c1ae4e49021e3deee8ba2749f (diff) |
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
-rw-r--r-- | arch/arm/include/asm/perf_event.h | 7 |
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__ */ |