diff options
| author | Wu Zhangjin <wuzhangjin@gmail.com> | 2010-03-12 23:34:15 -0500 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2010-04-12 12:26:15 -0400 |
| commit | f1df323924e2fde14cbcd51209a8cbfc33e0c232 (patch) | |
| tree | a0f5a3c09e4a9e8ec3eb11bcc4e9d729b0af9dce | |
| parent | d814c28ceca8f659c0012eaec8e21eee43710716 (diff) | |
MIPS: Loongson-2F: Flush the branch target history in BTB and RAS
As per chapter 15 "Errata: Issue of Out-of-order in loongson"[1] to work
around the Loongson 2F erratum we need to do:
"When switching from user mode to kernel mode, you should flush the
branch target history such as BTB and RAS."
[1] Chinese version: http://www.loongson.cn/uploadfile/file/200808211
[2] English version of chapter 15:
http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source
Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
Cc: linux-mips@linux-mips.org
Cc: Shinya Kuribayashi <shinya.kuribayashi@necel.com>
Patchwork: http://patchwork.linux-mips.org/patch/1066/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
| -rw-r--r-- | arch/mips/include/asm/stackframe.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index 3b6da3330e32..c8419129e770 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h | |||
| @@ -121,6 +121,25 @@ | |||
| 121 | .endm | 121 | .endm |
| 122 | #else | 122 | #else |
| 123 | .macro get_saved_sp /* Uniprocessor variation */ | 123 | .macro get_saved_sp /* Uniprocessor variation */ |
| 124 | #ifdef CONFIG_CPU_LOONGSON2F | ||
| 125 | /* | ||
| 126 | * Clear BTB (branch target buffer), forbid RAS (return address | ||
| 127 | * stack) to workaround the Out-of-order Issue in Loongson2F | ||
| 128 | * via its diagnostic register. | ||
| 129 | */ | ||
| 130 | move k0, ra | ||
| 131 | jal 1f | ||
| 132 | nop | ||
| 133 | 1: jal 1f | ||
| 134 | nop | ||
| 135 | 1: jal 1f | ||
| 136 | nop | ||
| 137 | 1: jal 1f | ||
| 138 | nop | ||
| 139 | 1: move ra, k0 | ||
| 140 | li k0, 3 | ||
| 141 | mtc0 k0, $22 | ||
| 142 | #endif /* CONFIG_CPU_LOONGSON2F */ | ||
| 124 | #if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) | 143 | #if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) |
| 125 | lui k1, %hi(kernelsp) | 144 | lui k1, %hi(kernelsp) |
| 126 | #else | 145 | #else |
