diff options
| author | Matthias Schiffer <mschiffer@universe-factory.net> | 2018-03-24 12:57:49 -0400 |
|---|---|---|
| committer | Paul Burton <paul.burton@mips.com> | 2018-06-19 18:00:12 -0400 |
| commit | 6fb8656646f996d1eef42e6d56203c4915cb9e08 (patch) | |
| tree | 782be6f9af41e298651cbb679a5d83bfc2d5de4e | |
| parent | 2a027b47dba6b77ab8c8e47b589ae9bbc5ac6175 (diff) | |
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.html
Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
Tested-by: Matt Redfearn <matt.redfearn@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/18929/
Signed-off-by: Paul Burton <paul.burton@mips.com>
Cc: stable@vger.kernel.org # v3.17+
| -rw-r--r-- | arch/mips/kernel/mcount.S | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S index f2ee7e1e3342..cff52b283e03 100644 --- a/arch/mips/kernel/mcount.S +++ b/arch/mips/kernel/mcount.S | |||
| @@ -119,10 +119,20 @@ NESTED(_mcount, PT_SIZE, ra) | |||
| 119 | EXPORT_SYMBOL(_mcount) | 119 | EXPORT_SYMBOL(_mcount) |
| 120 | PTR_LA t1, ftrace_stub | 120 | PTR_LA t1, ftrace_stub |
| 121 | PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */ | 121 | PTR_L t2, ftrace_trace_function /* Prepare t2 for (1) */ |
| 122 | bne t1, t2, static_trace | 122 | beq t1, t2, fgraph_trace |
| 123 | nop | 123 | nop |
| 124 | 124 | ||
| 125 | MCOUNT_SAVE_REGS | ||
| 126 | |||
| 127 | move a0, ra /* arg1: self return address */ | ||
| 128 | jalr t2 /* (1) call *ftrace_trace_function */ | ||
| 129 | move a1, AT /* arg2: parent's return address */ | ||
| 130 | |||
| 131 | MCOUNT_RESTORE_REGS | ||
| 132 | |||
| 133 | fgraph_trace: | ||
| 125 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 134 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 135 | PTR_LA t1, ftrace_stub | ||
| 126 | PTR_L t3, ftrace_graph_return | 136 | PTR_L t3, ftrace_graph_return |
| 127 | bne t1, t3, ftrace_graph_caller | 137 | bne t1, t3, ftrace_graph_caller |
| 128 | nop | 138 | nop |
| @@ -131,24 +141,11 @@ EXPORT_SYMBOL(_mcount) | |||
| 131 | bne t1, t3, ftrace_graph_caller | 141 | bne t1, t3, ftrace_graph_caller |
| 132 | nop | 142 | nop |
| 133 | #endif | 143 | #endif |
| 134 | b ftrace_stub | ||
| 135 | #ifdef CONFIG_32BIT | ||
| 136 | addiu sp, sp, 8 | ||
| 137 | #else | ||
| 138 | nop | ||
| 139 | #endif | ||
| 140 | 144 | ||
| 141 | static_trace: | ||
| 142 | MCOUNT_SAVE_REGS | ||
| 143 | |||
| 144 | move a0, ra /* arg1: self return address */ | ||
| 145 | jalr t2 /* (1) call *ftrace_trace_function */ | ||
| 146 | move a1, AT /* arg2: parent's return address */ | ||
| 147 | |||
| 148 | MCOUNT_RESTORE_REGS | ||
| 149 | #ifdef CONFIG_32BIT | 145 | #ifdef CONFIG_32BIT |
| 150 | addiu sp, sp, 8 | 146 | addiu sp, sp, 8 |
| 151 | #endif | 147 | #endif |
| 148 | |||
| 152 | .globl ftrace_stub | 149 | .globl ftrace_stub |
| 153 | ftrace_stub: | 150 | ftrace_stub: |
| 154 | RETURN_BACK | 151 | RETURN_BACK |
