arm64: errata: add workaround for cortex-a53 erratum #845719
authorWill Deacon <will.deacon@arm.com>
Mon, 23 Mar 2015 19:07:02 +0000 (19:07 +0000)
committerKevin Hilman <khilman@linaro.org>
Mon, 18 May 2015 23:16:15 +0000 (16:16 -0700)
When running a compat (AArch32) userspace on Cortex-A53, a load at EL0
from a virtual address that matches the bottom 32 bits of the virtual
address used by a recent load at (AArch64) EL1 might return incorrect
data.

This patch works around the issue by writing to the contextidr_el1
register on the exception return path when returning to a 32-bit task.

Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
(cherry picked from commit 905e8c5dcaa147163672b06fe9dcb5abaacbc711)
[khilman: modified to remove dependency on alternatives framwork.  Feature
          is now only compile-time selectable, and defaults to off. ]
Signed-off-by: Kevin Hilman <khilman@linaro.org>
arch/arm64/Kconfig
arch/arm64/kernel/entry.S

index 56b3f6d447ae10b8d53f9cfb767826fe90a97c11..50d090002bc8663b595360a6a9fbd1d3ed8fbe2f 100644 (file)
@@ -122,6 +122,32 @@ endmenu
 
 menu "Kernel Features"
 
+menu "ARM errata workarounds"
+
+config ARM64_ERRATUM_845719
+       bool "Cortex-A53: 845719: a load might read incorrect data"
+       depends on COMPAT
+       default n
+       help
+         This option adds an alternative code sequence to work around ARM
+         erratum 845719 on Cortex-A53 parts up to r0p4.
+
+         When running a compat (AArch32) userspace on an affected Cortex-A53
+         part, a load at EL0 from a virtual address that matches the bottom 32
+         bits of the virtual address used by a recent load at (AArch64) EL1
+         might return incorrect data.
+
+         The workaround is to write the contextidr_el1 register on exception
+         return to a 32-bit task.
+         Please note that this does not necessarily enable the workaround,
+         as it depends on the alternative framework, which will only patch
+         the kernel if an affected CPU is detected.
+
+         If unsure, say Y.
+
+endmenu
+
+
 config ARM64_64K_PAGES
        bool "Enable 64KB pages support"
        help
index 1d1314280a03a678c4ef63092712d49079386cdd..bb64eedfbefd7775572ff06c322125eacc0e40b2 100644 (file)
        ldp     x21, x22, [sp, #S_PC]           // load ELR, SPSR
        .if     \el == 0
        ldr     x23, [sp, #S_SP]                // load return stack pointer
+#ifdef CONFIG_ARM64_ERRATUM_845719
+       tbz     x22, #4, 1f
+#ifdef CONFIG_PID_IN_CONTEXTIDR
+       mrs     x29, contextidr_el1
+       msr     contextidr_el1, x29
+1:
+#else
+       msr     contextidr_el1, xzr
+1:
+#endif
+#endif
        .endif
        .if     \ret
        ldr     x1, [sp, #S_X1]                 // preserve x0 (syscall return)