This workaround is necessary on certain CPUs when switching from user
mode to kernel mode. Move it from its slightly odd location in the
middle of get_saved_sp (which it is unrelated to) into the
setup_kernel_mode macro.
Since the setup_kernel_mode is a new self contained macro, we can ensure
that reordering is on and drop the NOP delay slot fillers.
Signed-off-by: Matt Redfearn <matt.redfearn@mips.com>
---
arch/mips/include/asm/stackframe.h | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/arch/mips/include/asm/stackframe.h
b/arch/mips/include/asm/stackframe.h
index 494fe41f5619..a47a9f5591a3 100644
--- a/arch/mips/include/asm/stackframe.h
+++ b/arch/mips/include/asm/stackframe.h
@@ -49,6 +49,24 @@
#endif
.macro setup_kernel_mode docfi=0
+ .set push
+ .set reorder
+
+#if !defined(CONFIG_SMP) && defined(CONFIG_CPU_JUMP_WORKAROUNDS)
+ /*
+ * Clear BTB (branch target buffer), forbid RAS (return address
+ * stack) to workaround the Out-of-order Issue in Loongson2F
+ * via its diagnostic register.
+ */
+ move k0, ra
+ jal 1f
+1: jal 1f
+1: jal 1f
+1: jal 1f
+1: move ra, k0
+ li k0, 3
+ mtc0 k0, $22
+#endif /* !CONFIG_SMP && CONFIG_CPU_JUMP_WORKAROUNDS */
/* Set thread_info if we're coming from user mode */
ori $28, sp, _THREAD_MASK
@@ -59,6 +77,7 @@
pref 0, 0($28) /* Prefetch the current pointer */
.set pop
#endif
+ .set pop
.endm
.macro SAVE_AT docfi=0
@@ -160,25 +179,6 @@
#else /* !CONFIG_SMP */
/* Uniprocessor variation */
.macro get_saved_sp docfi=0 tosp=0
-#ifdef CONFIG_CPU_JUMP_WORKAROUNDS
- /*
- * Clear BTB (branch target buffer), forbid RAS (return address
- * stack) to workaround the Out-of-order Issue in Loongson2F
- * via its diagnostic register.
- */
- move k0, ra
- jal 1f
- nop
-1: jal 1f
- nop
-1: jal 1f
- nop
-1: jal 1f
- nop
-1: move ra, k0
- li k0, 3
- mtc0 k0, $22
-#endif /* CONFIG_CPU_JUMP_WORKAROUNDS */
#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32)
lui k1, %hi(kernelsp)
#else
--
2.7.4
|