arm64: errata: Pass --fix-cortex-a53-843419 to ld if workaround enabled
authorWill Deacon <will.deacon@arm.com>
Mon, 22 Aug 2016 10:58:36 +0000 (11:58 +0100)
committerWill Deacon <will.deacon@arm.com>
Fri, 26 Aug 2016 10:33:22 +0000 (11:33 +0100)
Cortex-A53 erratum 843419 is worked around by the linker, although it is
a configure-time option to GCC as to whether ld is actually asked to
apply the workaround or not.

This patch ensures that we pass --fix-cortex-a53-843419 to the linker
when both CONFIG_ARM64_ERRATUM_843419=y and the linker supports the
option.

Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
arch/arm64/Kconfig
arch/arm64/Makefile

index 1e49fbc4b075af832dea7b2bd34ed98d05b21aaf..0579f6e0a5fd21f377f4dcaf6a96cfb5fbab3a37 100644 (file)
@@ -418,18 +418,13 @@ config ARM64_ERRATUM_845719
 
 config ARM64_ERRATUM_843419
        bool "Cortex-A53: 843419: A load or store might access an incorrect address"
-       depends on MODULES
        default y
-       select ARM64_MODULE_CMODEL_LARGE
+       select ARM64_MODULE_CMODEL_LARGE if MODULES
        help
-         This option builds kernel modules using the large memory model in
-         order to avoid the use of the ADRP instruction, which can cause
-         a subsequent memory access to use an incorrect address on Cortex-A53
-         parts up to r0p4.
-
-         Note that the kernel itself must be linked with a version of ld
-         which fixes potentially affected ADRP instructions through the
-         use of veneers.
+         This option links the kernel with '--fix-cortex-a53-843419' and
+         builds modules using the large memory model in order to avoid the use
+         of the ADRP instruction, which can cause a subsequent memory access
+         to use an incorrect address on Cortex-A53 parts up to r0p4.
 
          If unsure, say Y.
 
index 5b54f8c021d8332624839e1c7eb8249eff7ba360..0b53c752f23f8449659ef521771a04ce25f3cc26 100644 (file)
@@ -18,6 +18,14 @@ ifneq ($(CONFIG_RELOCATABLE),)
 LDFLAGS_vmlinux                += -pie -Bsymbolic
 endif
 
+ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
+  ifeq ($(call ld-option, --fix-cortex-a53-843419),)
+$(warning ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum)
+  else
+LDFLAGS_vmlinux        += --fix-cortex-a53-843419
+  endif
+endif
+
 KBUILD_DEFCONFIG := defconfig
 
 # Check for binutils support for specific extensions