On Thu, Apr 16, 2020 at 01:38:29PM +0800, Jiping Ma wrote:Hi, Will
Only push sp and lr in the stack for thumb mode. it will goThis looks like a pile of fragile heuristics to me. Why don't you just use
through the stack find sp and lr.
Change this to the more detailed description of the patch
Signed-off-by: Jiping Ma <jiping.ma2@xxxxxxxxxxxxx>
---
arch/arm64/kernel/perf_callchain.c | 36 +++++++++++++++++++++++++++---
1 file changed, 33 insertions(+), 3 deletions(-)
diff --git a/arch/arm64/kernel/perf_callchain.c b/arch/arm64/kernel/perf_callchain.c
index bcafd7dcfe8b..97dde271c121 100644
--- a/arch/arm64/kernel/perf_callchain.c
+++ b/arch/arm64/kernel/perf_callchain.c
@@ -104,6 +104,30 @@ compat_user_backtrace(struct compat_frame_tail __user *tail,
return (struct compat_frame_tail __user *)compat_ptr(buftail.fp) - 1;
}
+
+void
+user_backtrace_thumb(struct perf_callchain_entry_ctx *entry,
+ struct pt_regs *regs)
+{
+ u32 sp;
+ u32 *sp_t;
+ /*
+ * Only push sp, lr to stack.
+ */
+ for (sp = regs->compat_sp; (sp < current->mm->start_stack) &&
+ (entry->nr < entry->max_stack); sp += 4) {
+ sp_t = (u32 *)(unsigned long)sp;
+ if ((*sp_t > regs->compat_sp) &&
+ (*sp_t < current->mm->start_stack)) {
+ if (*(sp_t + 1) < current->mm->end_code &&
+ *(sp_t + 1) > current->mm->start_code) {
+ perf_callchain_store(entry, *(sp_t + 1)-1);
+ sp += 4;
+ }
+ }
+ }
+}
libunwind in userspace, the same way you'd have to if you compiled without
framepointers?
Will