aboutsummaryrefslogtreecommitdiff
path: root/arch/ppc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-18 09:33:25 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-18 09:33:25 -0700
commit844d6c48be7f11592d287a9fe2183007c4ebfbbb (patch)
treec5df0cb0520a0537b49db5708af288c7991e5f82 /arch/ppc
parent0894910cce8d9105e5d8457fd8686fe96dc958eb (diff)
parent2b02d13996fe28478e45605de9bd8bdca25718de (diff)
Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: [POWERPC] Fix invalid semicolon after if statement [POWERPC] ps3: Fix no storage devices found [POWERPC] Fix for assembler -g [POWERPC] Fix small race in 44x tlbie function [POWERPC] Remove unused code causing a compile warning [POWERPC] cell: Fix errno for modular spufs_create with invalid neighbour
Diffstat (limited to 'arch/ppc')
-rw-r--r--arch/ppc/kernel/misc.S12
1 files changed, 11 insertions, 1 deletions
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S
index 0da55368655..a22e1f4d94c 100644
--- a/arch/ppc/kernel/misc.S
+++ b/arch/ppc/kernel/misc.S
@@ -237,9 +237,19 @@ _GLOBAL(_tlbie)
mfspr r4,SPRN_MMUCR
mfspr r5,SPRN_PID /* Get PID */
rlwimi r4,r5,0,24,31 /* Set TID */
- mtspr SPRN_MMUCR,r4
+ /* We have to run the search with interrupts disabled, even critical
+ * and debug interrupts (in fact the only critical exceptions we have
+ * are debug and machine check). Otherwise an interrupt which causes
+ * a TLB miss can clobber the MMUCR between the mtspr and the tlbsx. */
+ mfmsr r5
+ lis r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@ha
+ addi r6,r6,(MSR_EE|MSR_CE|MSR_ME|MSR_DE)@l
+ andc r6,r5,r6
+ mtmsr r6
+ mtspr SPRN_MMUCR,r4
tlbsx. r3, 0, r3
+ mtmsr r5
bne 10f
sync
/* There are only 64 TLB entries, so r3 < 64,