diff options
author | Scott Wood <scottwood@freescale.com> | 2007-06-25 15:50:41 -0400 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2007-10-03 21:36:36 -0400 |
commit | 7401685242fbcbf4b0660726372c77a88c4af17d (patch) | |
tree | 71b814468d705c2c48184161c38a0295c832239d /arch/powerpc/kernel/head_8xx.S | |
parent | 663edbd2640447dc43840568cd5701e6c9878d63 (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/powerpc/kernel/head_8xx.S')
-rw-r--r-- | arch/powerpc/kernel/head_8xx.S | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 9c30938aad52..f7458396cd7c 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 */ |