mirror of https://gitee.com/openkylin/linux.git
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: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
f94d9a8ef9
commit
087d990b37
|
@ -4,7 +4,8 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
extern void (*cpu_wait)(void);
|
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 r4k_wait_irqoff(void);
|
||||||
extern void __pastwait(void);
|
extern void __pastwait(void);
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ handle_vcei:
|
||||||
__FINIT
|
__FINIT
|
||||||
|
|
||||||
.align 5 /* 32 byte rollback region */
|
.align 5 /* 32 byte rollback region */
|
||||||
LEAF(r4k_wait)
|
LEAF(__r4k_wait)
|
||||||
.set push
|
.set push
|
||||||
.set noreorder
|
.set noreorder
|
||||||
/* start of rollback region */
|
/* start of rollback region */
|
||||||
|
@ -146,14 +146,14 @@ LEAF(r4k_wait)
|
||||||
jr ra
|
jr ra
|
||||||
nop
|
nop
|
||||||
.set pop
|
.set pop
|
||||||
END(r4k_wait)
|
END(__r4k_wait)
|
||||||
|
|
||||||
.macro BUILD_ROLLBACK_PROLOGUE handler
|
.macro BUILD_ROLLBACK_PROLOGUE handler
|
||||||
FEXPORT(rollback_\handler)
|
FEXPORT(rollback_\handler)
|
||||||
.set push
|
.set push
|
||||||
.set noat
|
.set noat
|
||||||
MFC0 k0, CP0_EPC
|
MFC0 k0, CP0_EPC
|
||||||
PTR_LA k1, r4k_wait
|
PTR_LA k1, __r4k_wait
|
||||||
ori k0, 0x1f /* 32 byte rollback region */
|
ori k0, 0x1f /* 32 byte rollback region */
|
||||||
xori k0, 0x1f
|
xori k0, 0x1f
|
||||||
bne k0, k1, 9f
|
bne k0, k1, 9f
|
||||||
|
|
|
@ -45,6 +45,12 @@ static void r39xx_wait(void)
|
||||||
local_irq_enable();
|
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
|
* This variant is preferable as it allows testing need_resched and going to
|
||||||
* sleep depending on the outcome atomically. Unfortunately the "It is
|
* sleep depending on the outcome atomically. Unfortunately the "It is
|
||||||
|
|
Loading…
Reference in New Issue