aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2007-06-25 15:50:41 -0400
committerKumar Gala <galak@kernel.crashing.org>2007-10-03 21:36:36 -0400
commit7401685242fbcbf4b0660726372c77a88c4af17d (patch)
tree71b814468d705c2c48184161c38a0295c832239d /arch
parent663edbd2640447dc43840568cd5701e6c9878d63 (diff)
[POWERPC] 8xx: Work around CPU15 erratum.
The CPU15 erratum on MPC8xx chips can cause incorrect code execution under certain circumstances, where there is a conditional or indirect branch in the last word of a page, with a target in the last cache line of the next page. This patch implements one of the suggested workarounds, by forcing a TLB miss whenever execution crosses a page boundary. This is done by invalidating the pages before and after the one being loaded into the TLB in the ITLB miss handler. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/head_8xx.S6
-rw-r--r--arch/powerpc/platforms/8xx/Kconfig16
2 files changed, 22 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 9c30938aad5..f7458396cd7 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -298,6 +298,12 @@ InstructionTLBMiss:
298 stw r10, 0(r0) 298 stw r10, 0(r0)
299 stw r11, 4(r0) 299 stw r11, 4(r0)
300 mfspr r10, SPRN_SRR0 /* Get effective address of fault */ 300 mfspr r10, SPRN_SRR0 /* Get effective address of fault */
301#ifdef CONFIG_8xx_CPU15
302 addi r11, r10, 0x1000
303 tlbie r11
304 addi r11, r10, -0x1000
305 tlbie r11
306#endif
301 DO_8xx_CPU6(0x3780, r3) 307 DO_8xx_CPU6(0x3780, r3)
302 mtspr SPRN_MD_EPN, r10 /* Have to use MD_EPN for walk, MI_EPN can't */ 308 mtspr SPRN_MD_EPN, r10 /* Have to use MD_EPN for walk, MI_EPN can't */
303 mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */ 309 mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */
diff --git a/arch/powerpc/platforms/8xx/Kconfig b/arch/powerpc/platforms/8xx/Kconfig
index 8ecd01ad0de..322b155f24e 100644
--- a/arch/powerpc/platforms/8xx/Kconfig
+++ b/arch/powerpc/platforms/8xx/Kconfig
@@ -100,6 +100,22 @@ config 8xx_CPU6
100 100
101 If in doubt, say N here. 101 If in doubt, say N here.
102 102
103config 8xx_CPU15
104 bool "CPU15 Silicon Errata"
105 default y
106 help
107 This enables a workaround for erratum CPU15 on MPC8xx chips.
108 This bug can cause incorrect code execution under certain
109 circumstances. This workaround adds some overhead (a TLB miss
110 every time execution crosses a page boundary), and you may wish
111 to disable it if you have worked around the bug in the compiler
112 (by not placing conditional branches or branches to LR or CTR
113 in the last word of a page, with a target of the last cache
114 line in the next page), or if you have used some other
115 workaround.
116
117 If in doubt, say Y here.
118
103choice 119choice
104 prompt "Microcode patch selection" 120 prompt "Microcode patch selection"
105 default NO_UCODE_PATCH 121 default NO_UCODE_PATCH