Commit 6fb86566 authored by Matthias Schiffer's avatar Matthias Schiffer Committed by Paul Burton

mips: ftrace: fix static function graph tracing

ftrace_graph_caller was never run after calling ftrace_trace_function,
breaking the function graph tracer. Fix this, bringing it in line with the
x86 implementation.

While we're at it, also streamline the control flow of _mcount a bit to
reduce the number of branches.

This issue was reported before:
https://www.linux-mips.org/archives/linux-mips/2014-11/msg00295.htmlSigned-off-by: default avatarMatthias Schiffer <mschiffer@universe-factory.net>
Tested-by: default avatarMatt Redfearn <matt.redfearn@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/18929/Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Cc: stable@vger.kernel.org # v3.17+
parent 2a027b47
...@@ -119,10 +119,20 @@ NESTED(_mcount, PT_SIZE, ra) ...@@ -119,10 +119,20 @@ NESTED(_mcount, PT_SIZE, ra)
EXPORT_SYMBOL(_mcount) EXPORT_SYMBOL(_mcount)
PTR_LA t1, ftrace_stub PTR_LA t1, ftrace_stub
PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */ PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */
bne t1, t2, static_trace beq t1, t2, fgraph_trace
nop nop
MCOUNT_SAVE_REGS
move a0, ra /* arg1: self return address */
jalr t2 /* (1) call *ftrace_trace_function */
move a1, AT /* arg2: parent's return address */
MCOUNT_RESTORE_REGS
fgraph_trace:
#ifdef CONFIG_FUNCTION_GRAPH_TRACER #ifdef CONFIG_FUNCTION_GRAPH_TRACER
PTR_LA t1, ftrace_stub
PTR_L t3, ftrace_graph_return PTR_L t3, ftrace_graph_return
bne t1, t3, ftrace_graph_caller bne t1, t3, ftrace_graph_caller
nop nop
...@@ -131,24 +141,11 @@ EXPORT_SYMBOL(_mcount) ...@@ -131,24 +141,11 @@ EXPORT_SYMBOL(_mcount)
bne t1, t3, ftrace_graph_caller bne t1, t3, ftrace_graph_caller
nop nop
#endif #endif
b ftrace_stub
#ifdef CONFIG_32BIT
addiu sp, sp, 8
#else
nop
#endif
static_trace:
MCOUNT_SAVE_REGS
move a0, ra /* arg1: self return address */
jalr t2 /* (1) call *ftrace_trace_function */
move a1, AT /* arg2: parent's return address */
MCOUNT_RESTORE_REGS
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
addiu sp, sp, 8 addiu sp, sp, 8
#endif #endif
.globl ftrace_stub .globl ftrace_stub
ftrace_stub: ftrace_stub:
RETURN_BACK RETURN_BACK
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment