[PATCH] MIPS: Enable interrupts before WAIT instruction.

From: David Daney
Date: Thu May 02 2013 - 16:48:31 EST


From: David Daney <david.daney@xxxxxxxxxx>

As noted by Thomas Gleixner:

commit cdbedc61c8 (mips: Use generic idle loop) broke MIPS as I did
not realize that MIPS wants to invoke the wait instructions with
interrupts enabled.

Instead of enabling interrupts in arch_cpu_idle() as Thomas' initial
patch does, we follow Linus' suggestion of doing it in the assembly
code to prevent the compiler from rearranging things.

Signed-off-by: David Daney <david.daney@xxxxxxxxxx>
Reported-by: EunBong Song <eunb.song@xxxxxxxxxxx>
Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Cc: Jonas Gorski <jogo@xxxxxxxxxxx>
---

This is only very lightly tested, we need more testing before
declaring it the definitive fix.

arch/mips/kernel/genex.S | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S
index ecb347c..57cda9a 100644
--- a/arch/mips/kernel/genex.S
+++ b/arch/mips/kernel/genex.S
@@ -132,12 +132,13 @@ LEAF(r4k_wait)
.set noreorder
/* start of rollback region */
LONG_L t0, TI_FLAGS($28)
- nop
andi t0, _TIF_NEED_RESCHED
bnez t0, 1f
nop
- nop
- nop
+ /* Enable interrupts so WAIT will complete */
+ mfc0 t0, CP0_STATUS
+ ori t0, ST0_IE
+ mtc0 t0, CP0_STATUS
.set mips3
wait
/* end of rollback region (the region size must be power of two) */
--
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/