aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2011-02-28 12:15:16 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-03-09 16:40:12 -0500
commitfcbdc5fe6ebe07d502c9b652cb63376bcc4227ac (patch)
tree6472c243e21776c0fcac35d01b77924ed1c16e11 /arch/arm
parentf5412be599602124d2bdd49947b231dd77c0bf99 (diff)
ARM: 6772/1: errata: possible fault MMU translations following an ASID switch
On the r2p* and r3p* versions of the Cortex-A9, a speculative memory access may cause a page table walk which starts prior to an ASID switch but completes afterwards. This can populate the micro-TLB with a stale entry which may be hit with the new ASID. This workaround places two dsb instructions in the mm switching code so that no page table walks can cross the ASID switch. Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/Kconfig11
-rw-r--r--arch/arm/mm/proc-v7.S6
2 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 166efa2a19cd..ec0f6589af05 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1202,6 +1202,17 @@ config ARM_ERRATA_753970
1202 This has the same effect as the cache sync operation: store buffer 1202 This has the same effect as the cache sync operation: store buffer
1203 drain and waiting for all buffers empty. 1203 drain and waiting for all buffers empty.
1204 1204
1205config ARM_ERRATA_754322
1206 bool "ARM errata: possible faulty MMU translations following an ASID switch"
1207 depends on CPU_V7
1208 help
1209 This option enables the workaround for the 754322 Cortex-A9 (r2p*,
1210 r3p*) erratum. A speculative memory access may cause a page table walk
1211 which starts prior to an ASID switch but completes afterwards. This
1212 can populate the micro-TLB with a stale entry which may be hit with
1213 the new ASID. This workaround places two dsb instructions in the mm
1214 switching code so that no page table walks can cross the ASID switch.
1215
1205endmenu 1216endmenu
1206 1217
1207source "arch/arm/common/Kconfig" 1218source "arch/arm/common/Kconfig"
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 8e3356239136..f7498f1a2e86 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -108,10 +108,16 @@ ENTRY(cpu_v7_switch_mm)
108#ifdef CONFIG_ARM_ERRATA_430973 108#ifdef CONFIG_ARM_ERRATA_430973
109 mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB 109 mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
110#endif 110#endif
111#ifdef CONFIG_ARM_ERRATA_754322
112 dsb
113#endif
111 mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID 114 mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID
112 isb 115 isb
1131: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0 1161: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
114 isb 117 isb
118#ifdef CONFIG_ARM_ERRATA_754322
119 dsb
120#endif
115 mcr p15, 0, r1, c13, c0, 1 @ set context ID 121 mcr p15, 0, r1, c13, c0, 1 @ set context ID
116 isb 122 isb
117#endif 123#endif