From: AKASHI Takahiro <takahiro.akashi@linaro.org> To: catalin.marinas@arm.com, will.deacon@arm.com, rostedt@goodmis.org Cc: jungseoklee85@gmail.com, olof@lixom.net, broonie@kernel.org, david.griego@linaro.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, AKASHI Takahiro <takahiro.akashi@linaro.org> Subject: [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by stack tracer Date: Thu, 8 Oct 2015 19:01:38 +0900 [thread overview] Message-ID: <1444298504-10392-2-git-send-email-takahiro.akashi@linaro.org> (raw) In-Reply-To: <1444298504-10392-1-git-send-email-takahiro.akashi@linaro.org> On arm64, no PC values returned by save_stack_trace() will match to LR values saved in stack frames on a stack after the following commit: commit e306dfd06fcb ("ARM64: unwind: Fix PC calculation") As a result, the output from stack tracer will be messed up. This patch introduces an arch-defined macro, FTRACE_STACK_FRAME_OFFSET, so that check_stack() can handle this case correctly. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> --- arch/arm64/include/asm/ftrace.h | 5 +++-- arch/arm64/kernel/stacktrace.c | 7 ++++--- include/linux/ftrace.h | 7 +++++++ kernel/trace/trace_stack.c | 5 +++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index c5534fa..2b43e20 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -13,8 +13,9 @@ #include <asm/insn.h> -#define MCOUNT_ADDR ((unsigned long)_mcount) -#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE +#define MCOUNT_ADDR ((unsigned long)_mcount) +#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE +#define FTRACE_STACK_FRAME_OFFSET AARCH64_INSN_SIZE #ifndef __ASSEMBLY__ #include <linux/compat.h> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index 407991b..bc0689a 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c @@ -20,6 +20,7 @@ #include <linux/sched.h> #include <linux/stacktrace.h> +#include <asm/insn.h> #include <asm/stacktrace.h> /* @@ -49,10 +50,10 @@ int notrace unwind_frame(struct stackframe *frame) frame->sp = fp + 0x10; frame->fp = *(unsigned long *)(fp); /* - * -4 here because we care about the PC at time of bl, - * not where the return will go. + * decrement PC by AARCH64_INSN_SIZE here because we care about + * the PC at time of bl, not where the return will go. */ - frame->pc = *(unsigned long *)(fp + 8) - 4; + frame->pc = *(unsigned long *)(fp + 8) - AARCH64_INSN_SIZE; return 0; } diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 6cd8c0e..d77b195 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -263,6 +263,13 @@ static inline void ftrace_kill(void) { } #endif /* CONFIG_FUNCTION_TRACER */ #ifdef CONFIG_STACK_TRACER +/* + * the offset value to add to return address from save_stack_trace() + */ +#ifndef FTRACE_STACK_FRAME_OFFSET +#define FTRACE_STACK_FRAME_OFFSET 0 +#endif + extern int stack_tracer_enabled; int stack_trace_sysctl(struct ctl_table *table, int write, diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index b746399..30521ea 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -105,7 +105,7 @@ check_stack(unsigned long ip, unsigned long *stack) /* Skip over the overhead of the stack tracer itself */ for (i = 0; i < max_stack_trace.nr_entries; i++) { - if (stack_dump_trace[i] == ip) + if ((stack_dump_trace[i] + FTRACE_STACK_FRAME_OFFSET) == ip) break; } @@ -133,7 +133,8 @@ check_stack(unsigned long ip, unsigned long *stack) for (; p < top && i < max_stack_trace.nr_entries; p++) { if (stack_dump_trace[i] == ULONG_MAX) break; - if (*p == stack_dump_trace[i]) { + if (*p == (stack_dump_trace[i] + + FTRACE_STACK_FRAME_OFFSET)) { stack_dump_trace[x] = stack_dump_trace[i++]; this_size = stack_dump_index[x++] = (top - p) * sizeof(unsigned long); -- 1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: takahiro.akashi@linaro.org (AKASHI Takahiro) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by stack tracer Date: Thu, 8 Oct 2015 19:01:38 +0900 [thread overview] Message-ID: <1444298504-10392-2-git-send-email-takahiro.akashi@linaro.org> (raw) In-Reply-To: <1444298504-10392-1-git-send-email-takahiro.akashi@linaro.org> On arm64, no PC values returned by save_stack_trace() will match to LR values saved in stack frames on a stack after the following commit: commit e306dfd06fcb ("ARM64: unwind: Fix PC calculation") As a result, the output from stack tracer will be messed up. This patch introduces an arch-defined macro, FTRACE_STACK_FRAME_OFFSET, so that check_stack() can handle this case correctly. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> --- arch/arm64/include/asm/ftrace.h | 5 +++-- arch/arm64/kernel/stacktrace.c | 7 ++++--- include/linux/ftrace.h | 7 +++++++ kernel/trace/trace_stack.c | 5 +++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index c5534fa..2b43e20 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -13,8 +13,9 @@ #include <asm/insn.h> -#define MCOUNT_ADDR ((unsigned long)_mcount) -#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE +#define MCOUNT_ADDR ((unsigned long)_mcount) +#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE +#define FTRACE_STACK_FRAME_OFFSET AARCH64_INSN_SIZE #ifndef __ASSEMBLY__ #include <linux/compat.h> diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c index 407991b..bc0689a 100644 --- a/arch/arm64/kernel/stacktrace.c +++ b/arch/arm64/kernel/stacktrace.c @@ -20,6 +20,7 @@ #include <linux/sched.h> #include <linux/stacktrace.h> +#include <asm/insn.h> #include <asm/stacktrace.h> /* @@ -49,10 +50,10 @@ int notrace unwind_frame(struct stackframe *frame) frame->sp = fp + 0x10; frame->fp = *(unsigned long *)(fp); /* - * -4 here because we care about the PC at time of bl, - * not where the return will go. + * decrement PC by AARCH64_INSN_SIZE here because we care about + * the PC at time of bl, not where the return will go. */ - frame->pc = *(unsigned long *)(fp + 8) - 4; + frame->pc = *(unsigned long *)(fp + 8) - AARCH64_INSN_SIZE; return 0; } diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 6cd8c0e..d77b195 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h @@ -263,6 +263,13 @@ static inline void ftrace_kill(void) { } #endif /* CONFIG_FUNCTION_TRACER */ #ifdef CONFIG_STACK_TRACER +/* + * the offset value to add to return address from save_stack_trace() + */ +#ifndef FTRACE_STACK_FRAME_OFFSET +#define FTRACE_STACK_FRAME_OFFSET 0 +#endif + extern int stack_tracer_enabled; int stack_trace_sysctl(struct ctl_table *table, int write, diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index b746399..30521ea 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -105,7 +105,7 @@ check_stack(unsigned long ip, unsigned long *stack) /* Skip over the overhead of the stack tracer itself */ for (i = 0; i < max_stack_trace.nr_entries; i++) { - if (stack_dump_trace[i] == ip) + if ((stack_dump_trace[i] + FTRACE_STACK_FRAME_OFFSET) == ip) break; } @@ -133,7 +133,8 @@ check_stack(unsigned long ip, unsigned long *stack) for (; p < top && i < max_stack_trace.nr_entries; p++) { if (stack_dump_trace[i] == ULONG_MAX) break; - if (*p == stack_dump_trace[i]) { + if (*p == (stack_dump_trace[i] + + FTRACE_STACK_FRAME_OFFSET)) { stack_dump_trace[x] = stack_dump_trace[i++]; this_size = stack_dump_index[x++] = (top - p) * sizeof(unsigned long); -- 1.7.9.5
next prev parent reply other threads:[~2015-10-08 10:03 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-10-08 10:01 [PATCH v3 0/7] arm64: ftrace: fix incorrect output from stack tracer AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro [this message] 2015-10-08 10:01 ` [PATCH v3 1/7] arm64: ftrace: adjust callsite addresses examined by " AKASHI Takahiro 2015-10-13 15:15 ` Jungseok Lee 2015-10-13 15:15 ` Jungseok Lee 2015-10-13 15:37 ` Steven Rostedt 2015-10-13 15:37 ` Steven Rostedt 2015-10-14 5:09 ` AKASHI Takahiro 2015-10-14 5:09 ` AKASHI Takahiro 2015-10-08 10:01 ` [PATCH v3 2/7] arm64: ftrace: modify a stack frame in a safe way AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-08 10:01 ` [PATCH v3 3/7] arm64: ftrace: fix a stack tracer's output under function graph tracer AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-09 6:46 ` kbuild test robot 2015-10-09 6:46 ` kbuild test robot 2015-10-13 15:24 ` Jungseok Lee 2015-10-13 15:24 ` Jungseok Lee 2015-10-14 5:03 ` AKASHI Takahiro 2015-10-14 5:03 ` AKASHI Takahiro 2015-10-08 10:01 ` [PATCH v3 4/7] arm64: ftrace: allow for tracing leaf functions AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-08 10:01 ` [PATCH v3 5/7] ftrace: allow arch-specific stack tracer AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-13 15:45 ` Steven Rostedt 2015-10-13 15:45 ` Steven Rostedt 2015-10-08 10:01 ` [PATCH v3 6/7] arm64: insn: add instruction decoders for ldp/stp and add/sub AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-08 10:01 ` [PATCH v3 7/7] arm64: ftrace: add arch-specific stack tracer AKASHI Takahiro 2015-10-08 10:01 ` AKASHI Takahiro 2015-10-09 6:41 ` kbuild test robot 2015-10-09 6:41 ` kbuild test robot 2015-10-08 14:45 ` [PATCH v3 0/7] arm64: ftrace: fix incorrect output from " Jungseok Lee 2015-10-08 14:45 ` Jungseok Lee 2015-10-22 14:05 ` Jungseok Lee 2015-10-22 14:05 ` Jungseok Lee 2015-10-28 15:23 ` Will Deacon 2015-10-28 15:23 ` Will Deacon 2015-10-29 5:24 ` AKASHI Takahiro 2015-10-29 5:24 ` AKASHI Takahiro
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1444298504-10392-2-git-send-email-takahiro.akashi@linaro.org \ --to=takahiro.akashi@linaro.org \ --cc=broonie@kernel.org \ --cc=catalin.marinas@arm.com \ --cc=david.griego@linaro.org \ --cc=jungseoklee85@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=olof@lixom.net \ --cc=rostedt@goodmis.org \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.