| From 8a574cfa2652545eb95595d38ac2a0bb501af0ae Mon Sep 17 00:00:00 2001 |
| From: Markos Chandras <markos.chandras@imgtec.com> |
| Date: Tue, 16 Sep 2014 15:55:12 +0100 |
| Subject: MIPS: mcount: Adjust stack pointer for static trace in MIPS32 |
| |
| From: Markos Chandras <markos.chandras@imgtec.com> |
| |
| commit 8a574cfa2652545eb95595d38ac2a0bb501af0ae upstream. |
| |
| Every mcount() call in the MIPS 32-bit kernel is done as follows: |
| |
| [...] |
| move at, ra |
| jal _mcount |
| addiu sp, sp, -8 |
| [...] |
| |
| but upon returning from the mcount() function, the stack pointer |
| is not adjusted properly. This is explained in details in 58b69401c797 |
| (MIPS: Function tracer: Fix broken function tracing). |
| |
| Commit ad8c396936e3 ("MIPS: Unbreak function tracer for 64-bit kernel.) |
| fixed the stack manipulation for 64-bit but it didn't fix it completely |
| for MIPS32. |
| |
| Signed-off-by: Markos Chandras <markos.chandras@imgtec.com> |
| Cc: linux-mips@linux-mips.org |
| Patchwork: https://patchwork.linux-mips.org/patch/7792/ |
| Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/mips/kernel/mcount.S | 12 ++++++++++++ |
| 1 file changed, 12 insertions(+) |
| |
| --- a/arch/mips/kernel/mcount.S |
| +++ b/arch/mips/kernel/mcount.S |
| @@ -123,7 +123,11 @@ NESTED(_mcount, PT_SIZE, ra) |
| nop |
| #endif |
| b ftrace_stub |
| +#ifdef CONFIG_32BIT |
| + addiu sp, sp, 8 |
| +#else |
| nop |
| +#endif |
| |
| static_trace: |
| MCOUNT_SAVE_REGS |
| @@ -133,6 +137,9 @@ static_trace: |
| move a1, AT /* arg2: parent's return address */ |
| |
| MCOUNT_RESTORE_REGS |
| +#ifdef CONFIG_32BIT |
| + addiu sp, sp, 8 |
| +#endif |
| .globl ftrace_stub |
| ftrace_stub: |
| RETURN_BACK |
| @@ -181,6 +188,11 @@ NESTED(ftrace_graph_caller, PT_SIZE, ra) |
| jal prepare_ftrace_return |
| nop |
| MCOUNT_RESTORE_REGS |
| +#ifndef CONFIG_DYNAMIC_FTRACE |
| +#ifdef CONFIG_32BIT |
| + addiu sp, sp, 8 |
| +#endif |
| +#endif |
| RETURN_BACK |
| END(ftrace_graph_caller) |
| |