Commit 087d990b authored by Ralf Baechle's avatar Ralf Baechle

MIPS: Idle: Break r4k_wait into two functions and fix it.

local_irq_enable() may expand into very different code, so it rather should
stay in C.  Also this keeps the assembler code size constant which keeps
the rollback code simple.  So it's best to split r4k_wait into two parts,
one C and one assembler.

Finally add the local_irq_enable() to r4k_wait to ensure the WAIT
instruction in __r4k_wait() will work properly.
Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent f94d9a8e
......@@ -4,7 +4,8 @@
#include <linux/linkage.h>
extern void (*cpu_wait)(void);
extern asmlinkage void r4k_wait(void);
extern void r4k_wait(void);
extern asmlinkage void __r4k_wait(void);
extern void r4k_wait_irqoff(void);
extern void __pastwait(void);
......
......@@ -122,7 +122,7 @@ handle_vcei:
__FINIT
.align 5 /* 32 byte rollback region */
LEAF(r4k_wait)
LEAF(__r4k_wait)
.set push
.set noreorder
/* start of rollback region */
......@@ -146,14 +146,14 @@ LEAF(r4k_wait)
jr ra
nop
.set pop
END(r4k_wait)
END(__r4k_wait)
.macro BUILD_ROLLBACK_PROLOGUE handler
FEXPORT(rollback_\handler)
.set push
.set noat
MFC0 k0, CP0_EPC
PTR_LA k1, r4k_wait
PTR_LA k1, __r4k_wait
ori k0, 0x1f /* 32 byte rollback region */
xori k0, 0x1f
bne k0, k1, 9f
......
......@@ -45,6 +45,12 @@ static void r39xx_wait(void)
local_irq_enable();
}
void r4k_wait(void)
{
local_irq_enable();
__r4k_wait();
}
/*
* This variant is preferable as it allows testing need_resched and going to
* sleep depending on the outcome atomically. Unfortunately the "It is
......
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