csky: Add perf_arch_fetch_caller_regs support
authorMao Han <han_mao@c-sky.com>
Wed, 10 Apr 2019 02:27:10 +0000 (10:27 +0800)
committerGuo Ren <ren_guo@c-sky.com>
Mon, 22 Apr 2019 05:44:57 +0000 (13:44 +0800)
In trace events as tracepoints context are not able to
be retrieve with task_pt_regs. Without arch caller regs
support the pt_regs context will be all zero, perf can
not parsing the callchain and resolving the symbols
correctly, some time will even get into deadlock
while handling the page fault, eg:

perf kmem â€”page record ls

Changelog
 - Add test case cmd in comment
 - Use regs_fp(regs) which is defined in abi/regdef.h

Signed-off-by: Mao Han <han_mao@c-sky.com>
Signed-off-by: Guo Ren <guoren@kernel.org>
arch/csky/abiv1/inc/abi/regdef.h
arch/csky/abiv2/inc/abi/regdef.h
arch/csky/include/asm/perf_event.h

index 729b1c3edcfde2dd1d8cea7d9a33d5fb3b53104f..104707fbdcc1ceaa389659714d3e376038a5351c 100644 (file)
@@ -6,6 +6,7 @@
 
 #define syscallid      r1
 #define regs_syscallid(regs) regs->regs[9]
+#define regs_fp(regs) regs->regs[2]
 
 /*
  * PSR format:
index 77cb1788b04c234634058a36dafb33b1f72c2bec..d7328bbc1ce7ad7c44a6d4934a24f619d744a422 100644 (file)
@@ -6,6 +6,7 @@
 
 #define syscallid      r7
 #define regs_syscallid(regs) regs->regs[3]
+#define regs_fp(regs) regs->regs[4]
 
 /*
  * PSR format:
index ea819312229404bb9d6af29a1bd03201904596d2..572093e110017156b7052cd2a5e6c80615f2b79b 100644 (file)
@@ -4,4 +4,12 @@
 #ifndef __ASM_CSKY_PERF_EVENT_H
 #define __ASM_CSKY_PERF_EVENT_H
 
+#include <abi/regdef.h>
+
+#define perf_arch_fetch_caller_regs(regs, __ip) { \
+       (regs)->pc = (__ip); \
+       regs_fp(regs) = (unsigned long) __builtin_frame_address(0); \
+       asm volatile("mov %0, sp\n":"=r"((regs)->usp)); \
+}
+
 #endif /* __ASM_PERF_EVENT_ELF_H */