| From 1a18a66446f3f289b05b634f18012424d82aa63a Mon Sep 17 00:00:00 2001 |
| From: Kevin Hao <haokexin@gmail.com> |
| Date: Fri, 17 Jan 2014 12:25:28 +0800 |
| Subject: powerpc: Set the correct ksp_limit on ppc32 when switching to irq stack |
| |
| From: Kevin Hao <haokexin@gmail.com> |
| |
| commit 1a18a66446f3f289b05b634f18012424d82aa63a upstream. |
| |
| Guenter Roeck has got the following call trace on a p2020 board: |
| Kernel stack overflow in process eb3e5a00, r1=eb79df90 |
| CPU: 0 PID: 2838 Comm: ssh Not tainted 3.13.0-rc8-juniper-00146-g19eca00 #4 |
| task: eb3e5a00 ti: c0616000 task.ti: ef440000 |
| NIP: c003a420 LR: c003a410 CTR: c0017518 |
| REGS: eb79dee0 TRAP: 0901 Not tainted (3.13.0-rc8-juniper-00146-g19eca00) |
| MSR: 00029000 <CE,EE,ME> CR: 24008444 XER: 00000000 |
| GPR00: c003a410 eb79df90 eb3e5a00 00000000 eb05d900 00000001 65d87646 00000000 |
| GPR08: 00000000 020b8000 00000000 00000000 44008442 |
| NIP [c003a420] __do_softirq+0x94/0x1ec |
| LR [c003a410] __do_softirq+0x84/0x1ec |
| Call Trace: |
| [eb79df90] [c003a410] __do_softirq+0x84/0x1ec (unreliable) |
| [eb79dfe0] [c003a970] irq_exit+0xbc/0xc8 |
| [eb79dff0] [c000cc1c] call_do_irq+0x24/0x3c |
| [ef441f20] [c00046a8] do_IRQ+0x8c/0xf8 |
| [ef441f40] [c000e7f4] ret_from_except+0x0/0x18 |
| --- Exception: 501 at 0xfcda524 |
| LR = 0x10024900 |
| Instruction dump: |
| 7c781b78 3b40000a 3a73b040 543c0024 3a800000 3b3913a0 7ef5bb78 48201bf9 |
| 5463103a 7d3b182e 7e89b92e 7c008146 <3ba00000> 7e7e9b78 48000014 57fff87f |
| Kernel panic - not syncing: kernel stack overflow |
| CPU: 0 PID: 2838 Comm: ssh Not tainted 3.13.0-rc8-juniper-00146-g19eca00 #4 |
| Call Trace: |
| |
| The reason is that we have used the wrong register to calculate the |
| ksp_limit in commit cbc9565ee826 (powerpc: Remove ksp_limit on ppc64). |
| Just fix it. |
| |
| As suggested by Benjamin Herrenschmidt, also add the C prototype of the |
| function in the comment in order to avoid such kind of errors in the |
| future. |
| |
| Reported-by: Guenter Roeck <linux@roeck-us.net> |
| Tested-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Kevin Hao <haokexin@gmail.com> |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/kernel/misc_32.S | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/kernel/misc_32.S |
| +++ b/arch/powerpc/kernel/misc_32.S |
| @@ -57,11 +57,14 @@ _GLOBAL(call_do_softirq) |
| mtlr r0 |
| blr |
| |
| +/* |
| + * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); |
| + */ |
| _GLOBAL(call_do_irq) |
| mflr r0 |
| stw r0,4(r1) |
| lwz r10,THREAD+KSP_LIMIT(r2) |
| - addi r11,r3,THREAD_INFO_GAP |
| + addi r11,r4,THREAD_INFO_GAP |
| stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) |
| mr r1,r4 |
| stw r10,8(r1) |