Messages in this thread Patch in this message | | | Date | Fri, 2 Aug 2019 12:11:24 -0400 | From | Steven Rostedt <> | Subject | Re: [PATCH v3] tracing: Function stack size and its name mismatch in arm64 |
| |
On Fri, 2 Aug 2019 12:09:20 -0400 Steven Rostedt <rostedt@goodmis.org> wrote:
> On Fri, 2 Aug 2019 11:22:59 -0400 > Steven Rostedt <rostedt@goodmis.org> wrote: > > > I think you are not explaining the issue correctly. From looking at the > > document, I think what you want to say is that the LR is saved *after* > > the data for the function. Is that correct? If so, then yes, it would > > cause the stack tracing algorithm to be incorrect. > > > > [..] > > > Can someone confirm that this is the real issue? > > Does this patch fix your issue? >
Bah, I hit "attach" instead of "insert" (I wondered why it didn't insert). Here's the patch without the attachment.
-- Steve
diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index 5ab5200b2bdc..13a4832cfb00 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -13,6 +13,7 @@ #define HAVE_FUNCTION_GRAPH_FP_TEST #define MCOUNT_ADDR ((unsigned long)_mcount) #define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE +#define ARCH_RET_ADDR_AFTER_LOCAL_VARS 1 #ifndef __ASSEMBLY__ #include <linux/compat.h> diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 5d16f73898db..050c6bd9beac 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -158,6 +158,18 @@ static void check_stack(unsigned long ip, unsigned long *stack) i++; } +#ifdef ARCH_RET_ADDR_AFTER_LOCAL_VARS + /* + * Most archs store the return address before storing the + * function's local variables. But some archs do this backwards. + */ + if (x > 1) { + memmove(&stack_trace_index[0], &stack_trace_index[1], + sizeof(stack_trace_index[0]) * (x - 1)); + x--; + } +#endif + stack_trace_nr_entries = x; if (task_stack_end_corrupted(current)) {
| |