Message ID | 20211117140737.44420-8-mark.rutland@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | arm64: stacktrace: unify unwind code | expand |
On Wed, Nov 17, 2021 at 02:07:35PM +0000, Mark Rutland wrote: > From: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com> > > To enable RELIABLE_STACKTRACE and LIVEPATCH on arm64, we need to > substantially rework arm64's unwinding code. As part of this, we want to > minimize the set of unwind interfaces we expose, and avoid open-coding > of unwind logic outside of stacktrace.c. Reviewed-by: Mark Brown <broonie@kernel.org>
diff --git a/arch/arm64/kernel/time.c b/arch/arm64/kernel/time.c index eebbc8d7123e..070d4427327f 100644 --- a/arch/arm64/kernel/time.c +++ b/arch/arm64/kernel/time.c @@ -32,22 +32,23 @@ #include <asm/stacktrace.h> #include <asm/paravirt.h> -unsigned long profile_pc(struct pt_regs *regs) +static bool profile_pc_cb(void *arg, unsigned long pc) { - struct stackframe frame; + unsigned long *prof_pc = arg; - if (!in_lock_functions(regs->pc)) - return regs->pc; + if (in_lock_functions(pc)) + return true; + *prof_pc = pc; + return false; +} - start_backtrace(&frame, regs->regs[29], regs->pc); +unsigned long profile_pc(struct pt_regs *regs) +{ + unsigned long prof_pc = 0; - do { - int ret = unwind_frame(NULL, &frame); - if (ret < 0) - return 0; - } while (in_lock_functions(frame.pc)); + arch_stack_walk(profile_pc_cb, &prof_pc, current, regs); - return frame.pc; + return prof_pc; } EXPORT_SYMBOL(profile_pc);