Commit 4277ff5e authored by Ralf Baechle's avatar Ralf Baechle

[MIPS] Fix use of ehb instruction for non-R2 configurations.

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent b4ab24e1
...@@ -87,7 +87,7 @@ FEXPORT(restore_all) # restore full frame ...@@ -87,7 +87,7 @@ FEXPORT(restore_all) # restore full frame
ori v1, v0, TCSTATUS_IXMT ori v1, v0, TCSTATUS_IXMT
mtc0 v1, CP0_TCSTATUS mtc0 v1, CP0_TCSTATUS
andi v0, TCSTATUS_IXMT andi v0, TCSTATUS_IXMT
ehb _ehb
mfc0 t0, CP0_TCCONTEXT mfc0 t0, CP0_TCCONTEXT
DMT 9 # dmt t1 DMT 9 # dmt t1
jal mips_ihb jal mips_ihb
...@@ -95,7 +95,7 @@ FEXPORT(restore_all) # restore full frame ...@@ -95,7 +95,7 @@ FEXPORT(restore_all) # restore full frame
andi t3, t0, 0xff00 andi t3, t0, 0xff00
or t2, t2, t3 or t2, t2, t3
mtc0 t2, CP0_STATUS mtc0 t2, CP0_STATUS
ehb _ehb
andi t1, t1, VPECONTROL_TE andi t1, t1, VPECONTROL_TE
beqz t1, 1f beqz t1, 1f
EMT EMT
...@@ -105,7 +105,7 @@ FEXPORT(restore_all) # restore full frame ...@@ -105,7 +105,7 @@ FEXPORT(restore_all) # restore full frame
xori v1, v1, TCSTATUS_IXMT xori v1, v1, TCSTATUS_IXMT
or v1, v0, v1 or v1, v0, v1
mtc0 v1, CP0_TCSTATUS mtc0 v1, CP0_TCSTATUS
ehb _ehb
xor t0, t0, t3 xor t0, t0, t3
mtc0 t0, CP0_TCCONTEXT mtc0 t0, CP0_TCCONTEXT
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
......
...@@ -291,7 +291,7 @@ ...@@ -291,7 +291,7 @@
ori t1, t2, TCSTATUS_IXMT ori t1, t2, TCSTATUS_IXMT
mtc0 t1, CP0_TCSTATUS mtc0 t1, CP0_TCSTATUS
andi t2, t2, TCSTATUS_IXMT andi t2, t2, TCSTATUS_IXMT
ehb _ehb
DMT 9 # dmt t1 DMT 9 # dmt t1
jal mips_ihb jal mips_ihb
nop nop
...@@ -310,7 +310,7 @@ ...@@ -310,7 +310,7 @@
xori t1, t1, TCSTATUS_IXMT xori t1, t1, TCSTATUS_IXMT
or t1, t1, t2 or t1, t1, t2
mtc0 t1, CP0_TCSTATUS mtc0 t1, CP0_TCSTATUS
ehb _ehb
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
LONG_L v0, GDB_FR_STATUS(sp) LONG_L v0, GDB_FR_STATUS(sp)
LONG_L v1, GDB_FR_EPC(sp) LONG_L v1, GDB_FR_EPC(sp)
......
...@@ -214,7 +214,7 @@ NESTED(except_vec_vi_handler, 0, sp) ...@@ -214,7 +214,7 @@ NESTED(except_vec_vi_handler, 0, sp)
mtc0 t0, CP0_TCCONTEXT mtc0 t0, CP0_TCCONTEXT
xor t1, t1, t0 xor t1, t1, t0
mtc0 t1, CP0_STATUS mtc0 t1, CP0_STATUS
ehb _ehb
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
CLI CLI
move a0, sp move a0, sp
......
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
/* Clear TKSU, leave IXMT */ /* Clear TKSU, leave IXMT */
xori t0, 0x00001800 xori t0, 0x00001800
mtc0 t0, CP0_TCSTATUS mtc0 t0, CP0_TCSTATUS
ehb _ehb
/* We need to leave the global IE bit set, but clear EXL...*/ /* We need to leave the global IE bit set, but clear EXL...*/
mfc0 t0, CP0_STATUS mfc0 t0, CP0_STATUS
or t0, ST0_CU0 | ST0_EXL | ST0_ERL | \set | \clr or t0, ST0_CU0 | ST0_EXL | ST0_ERL | \set | \clr
......
...@@ -94,7 +94,7 @@ ...@@ -94,7 +94,7 @@
ori t1, t2, TCSTATUS_IXMT ori t1, t2, TCSTATUS_IXMT
mtc0 t1, CP0_TCSTATUS mtc0 t1, CP0_TCSTATUS
andi t2, t2, TCSTATUS_IXMT andi t2, t2, TCSTATUS_IXMT
ehb _ehb
DMT 8 # dmt t0 DMT 8 # dmt t0
move t1,ra move t1,ra
jal mips_ihb jal mips_ihb
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
or a2, t1 or a2, t1
mtc0 a2, CP0_STATUS mtc0 a2, CP0_STATUS
#ifdef CONFIG_MIPS_MT_SMTC #ifdef CONFIG_MIPS_MT_SMTC
ehb _ehb
andi t0, t0, VPECONTROL_TE andi t0, t0, VPECONTROL_TE
beqz t0, 1f beqz t0, 1f
emt emt
...@@ -118,7 +118,7 @@ ...@@ -118,7 +118,7 @@
xori t1, t1, TCSTATUS_IXMT xori t1, t1, TCSTATUS_IXMT
or t1, t1, t2 or t1, t1, t2
mtc0 t1, CP0_TCSTATUS mtc0 t1, CP0_TCSTATUS
ehb _ehb
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
move v0, a0 move v0, a0
jr ra jr ra
......
...@@ -52,12 +52,12 @@ FEXPORT(__smtc_ipi_vector) ...@@ -52,12 +52,12 @@ FEXPORT(__smtc_ipi_vector)
.set noat .set noat
/* Disable thread scheduling to make Status update atomic */ /* Disable thread scheduling to make Status update atomic */
DMT 27 # dmt k1 DMT 27 # dmt k1
ehb _ehb
/* Set EXL */ /* Set EXL */
mfc0 k0,CP0_STATUS mfc0 k0,CP0_STATUS
ori k0,k0,ST0_EXL ori k0,k0,ST0_EXL
mtc0 k0,CP0_STATUS mtc0 k0,CP0_STATUS
ehb _ehb
/* Thread scheduling now inhibited by EXL. Restore TE state. */ /* Thread scheduling now inhibited by EXL. Restore TE state. */
andi k1,k1,VPECONTROL_TE andi k1,k1,VPECONTROL_TE
beqz k1,1f beqz k1,1f
...@@ -82,7 +82,7 @@ FEXPORT(__smtc_ipi_vector) ...@@ -82,7 +82,7 @@ FEXPORT(__smtc_ipi_vector)
li k1,ST0_CU0 li k1,ST0_CU0
or k1,k1,k0 or k1,k1,k0
mtc0 k1,CP0_STATUS mtc0 k1,CP0_STATUS
ehb _ehb
get_saved_sp get_saved_sp
/* Interrupting TC will have pre-set values in slots in the new frame */ /* Interrupting TC will have pre-set values in slots in the new frame */
2: subu k1,k1,PT_SIZE 2: subu k1,k1,PT_SIZE
...@@ -90,7 +90,7 @@ FEXPORT(__smtc_ipi_vector) ...@@ -90,7 +90,7 @@ FEXPORT(__smtc_ipi_vector)
lw k0,PT_TCSTATUS(k1) lw k0,PT_TCSTATUS(k1)
/* Write it to TCStatus to restore CU/KSU/IXMT state */ /* Write it to TCStatus to restore CU/KSU/IXMT state */
mtc0 k0,$2,1 mtc0 k0,$2,1
ehb _ehb
lw k0,PT_EPC(k1) lw k0,PT_EPC(k1)
mtc0 k0,CP0_EPC mtc0 k0,CP0_EPC
/* Save all will redundantly recompute the SP, but use it for now */ /* Save all will redundantly recompute the SP, but use it for now */
...@@ -116,7 +116,7 @@ LEAF(self_ipi) ...@@ -116,7 +116,7 @@ LEAF(self_ipi)
mfc0 t0,CP0_TCSTATUS mfc0 t0,CP0_TCSTATUS
ori t1,t0,TCSTATUS_IXMT ori t1,t0,TCSTATUS_IXMT
mtc0 t1,CP0_TCSTATUS mtc0 t1,CP0_TCSTATUS
ehb _ehb
/* We know we're in kernel mode, so prepare stack frame */ /* We know we're in kernel mode, so prepare stack frame */
subu t1,sp,PT_SIZE subu t1,sp,PT_SIZE
sw ra,PT_EPC(t1) sw ra,PT_EPC(t1)
......
...@@ -26,14 +26,14 @@ ...@@ -26,14 +26,14 @@
ori \reg, \reg, TCSTATUS_IXMT ori \reg, \reg, TCSTATUS_IXMT
xori \reg, \reg, TCSTATUS_IXMT xori \reg, \reg, TCSTATUS_IXMT
mtc0 \reg, CP0_TCSTATUS mtc0 \reg, CP0_TCSTATUS
ehb _ehb
.endm .endm
.macro local_irq_disable reg=t0 .macro local_irq_disable reg=t0
mfc0 \reg, CP0_TCSTATUS mfc0 \reg, CP0_TCSTATUS
ori \reg, \reg, TCSTATUS_IXMT ori \reg, \reg, TCSTATUS_IXMT
mtc0 \reg, CP0_TCSTATUS mtc0 \reg, CP0_TCSTATUS
ehb _ehb
.endm .endm
#else #else
.macro local_irq_enable reg=t0 .macro local_irq_enable reg=t0
......
...@@ -1459,7 +1459,8 @@ static inline void __emt(unsigned int previous) ...@@ -1459,7 +1459,8 @@ static inline void __emt(unsigned int previous)
static inline void __ehb(void) static inline void __ehb(void)
{ {
__asm__ __volatile__( __asm__ __volatile__(
" ehb \n"); " .set mips32r2 \n"
" ehb \n" " .set mips0 \n");
} }
/* /*
......
...@@ -304,7 +304,7 @@ ...@@ -304,7 +304,7 @@
mfc0 v0, CP0_TCSTATUS mfc0 v0, CP0_TCSTATUS
ori v0, TCSTATUS_IXMT ori v0, TCSTATUS_IXMT
mtc0 v0, CP0_TCSTATUS mtc0 v0, CP0_TCSTATUS
ehb _ehb
DMT 5 # dmt a1 DMT 5 # dmt a1
jal mips_ihb jal mips_ihb
#endif /* CONFIG_MIPS_MT_SMTC */ #endif /* CONFIG_MIPS_MT_SMTC */
...@@ -325,14 +325,14 @@ ...@@ -325,14 +325,14 @@
* restore TCStatus.IXMT. * restore TCStatus.IXMT.
*/ */
LONG_L v1, PT_TCSTATUS(sp) LONG_L v1, PT_TCSTATUS(sp)
ehb _ehb
mfc0 v0, CP0_TCSTATUS mfc0 v0, CP0_TCSTATUS
andi v1, TCSTATUS_IXMT andi v1, TCSTATUS_IXMT
/* We know that TCStatua.IXMT should be set from above */ /* We know that TCStatua.IXMT should be set from above */
xori v0, v0, TCSTATUS_IXMT xori v0, v0, TCSTATUS_IXMT
or v0, v0, v1 or v0, v0, v1
mtc0 v0, CP0_TCSTATUS mtc0 v0, CP0_TCSTATUS
ehb _ehb
andi a1, a1, VPECONTROL_TE andi a1, a1, VPECONTROL_TE
beqz a1, 1f beqz a1, 1f
emt emt
...@@ -411,7 +411,7 @@ ...@@ -411,7 +411,7 @@
/* Clear TKSU, leave IXMT */ /* Clear TKSU, leave IXMT */
xori t0, 0x00001800 xori t0, 0x00001800
mtc0 t0, CP0_TCSTATUS mtc0 t0, CP0_TCSTATUS
ehb _ehb
/* We need to leave the global IE bit set, but clear EXL...*/ /* We need to leave the global IE bit set, but clear EXL...*/
mfc0 t0, CP0_STATUS mfc0 t0, CP0_STATUS
ori t0, ST0_EXL | ST0_ERL ori t0, ST0_EXL | ST0_ERL
...@@ -438,7 +438,7 @@ ...@@ -438,7 +438,7 @@
* and enable interrupts only for the * and enable interrupts only for the
* current TC, using the TCStatus register. * current TC, using the TCStatus register.
*/ */
ehb _ehb
mfc0 t0,CP0_TCSTATUS mfc0 t0,CP0_TCSTATUS
/* Fortunately CU 0 is in the same place in both registers */ /* Fortunately CU 0 is in the same place in both registers */
/* Set TCU0, TKSU (for later inversion) and IXMT */ /* Set TCU0, TKSU (for later inversion) and IXMT */
...@@ -447,7 +447,7 @@ ...@@ -447,7 +447,7 @@
/* Clear TKSU *and* IXMT */ /* Clear TKSU *and* IXMT */
xori t0, 0x00001c00 xori t0, 0x00001c00
mtc0 t0, CP0_TCSTATUS mtc0 t0, CP0_TCSTATUS
ehb _ehb
/* We need to leave the global IE bit set, but clear EXL...*/ /* We need to leave the global IE bit set, but clear EXL...*/
mfc0 t0, CP0_STATUS mfc0 t0, CP0_STATUS
ori t0, ST0_EXL ori t0, ST0_EXL
...@@ -479,7 +479,7 @@ ...@@ -479,7 +479,7 @@
andi v1, v0, TCSTATUS_IXMT andi v1, v0, TCSTATUS_IXMT
ori v0, TCSTATUS_IXMT ori v0, TCSTATUS_IXMT
mtc0 v0, CP0_TCSTATUS mtc0 v0, CP0_TCSTATUS
ehb _ehb
DMT 2 # dmt v0 DMT 2 # dmt v0
/* /*
* We don't know a priori if ra is "live" * We don't know a priori if ra is "live"
...@@ -495,7 +495,7 @@ ...@@ -495,7 +495,7 @@
xori t0, 0x1e xori t0, 0x1e
mtc0 t0, CP0_STATUS mtc0 t0, CP0_STATUS
#ifdef CONFIG_MIPS_MT_SMTC #ifdef CONFIG_MIPS_MT_SMTC
ehb _ehb
andi v0, v0, VPECONTROL_TE andi v0, v0, VPECONTROL_TE
beqz v0, 2f beqz v0, 2f
nop /* delay slot */ nop /* delay slot */
......
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