xen/arm: Add workaround for Cortex-A53 erratum #843419
authorLuca Fancellu <luca.fancellu@arm.com>
Thu, 10 Dec 2020 10:42:58 +0000 (10:42 +0000)
committerStefano Stabellini <sstabellini@kernel.org>
Fri, 19 Mar 2021 19:33:22 +0000 (12:33 -0700)
On the Cortex A53, when executing in AArch64 state, a load or store instruction
which uses the result of an ADRP instruction as a base register, or which uses
a base register written by an instruction immediately after an ADRP to the
same register, might access an incorrect address.

The workaround is to enable the linker flag --fix-cortex-a53-843419
if present, to check and fix the affected sequence. Otherwise print a warning
that Xen may be susceptible to this errata

Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
Reviewed-by: Bertrand Marquis <bertrand.marquis@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
(cherry picked from commit d81133d45d81d35a4e7445778bfd1179190cbd31)

docs/misc/arm/silicon-errata.txt
xen/arch/arm/Kconfig
xen/arch/arm/Makefile
xen/scripts/Kbuild.include

index a15290285f6fe4271d8cb334864d6c893f833554..67f9f3b395026268b981bdaa849b292f632f637c 100644 (file)
@@ -45,6 +45,7 @@ stable hypervisors.
 | ARM            | Cortex-A53      | #827319         | ARM64_ERRATUM_827319    |
 | ARM            | Cortex-A53      | #824069         | ARM64_ERRATUM_824069    |
 | ARM            | Cortex-A53      | #819472         | ARM64_ERRATUM_819472    |
+| ARM            | Cortex-A53      | #843419         | ARM64_ERRATUM_843419    |
 | ARM            | Cortex-A55      | #1530923        | N/A                     |
 | ARM            | Cortex-A57      | #852523         | N/A                     |
 | ARM            | Cortex-A57      | #832075         | ARM64_ERRATUM_832075    |
index f938dd21bd9566473ed1dbc859dc2c9e338f2dee..3a17c9e319d4a4a2b4659398b2356f5b1ad5c0d5 100644 (file)
@@ -186,6 +186,25 @@ config ARM64_ERRATUM_819472
 
          If unsure, say Y.
 
+config ARM64_ERRATUM_843419
+       bool "Cortex-A53: 843419: A load or store might access an incorrect address"
+       default y
+       depends on ARM_64
+       help
+         This option adds an alternative code sequence to work around ARM
+         erratum 843419 on Cortex-A53 parts up to r0p4.
+
+         When executing in AArch64 state, a load or store instruction which uses
+         the result of an ADRP instruction as a base register, or which uses a
+         base register written by an instruction immediately after an ADRP to the
+         same register, might access an incorrect address.
+
+         The workaround enables the linker to check if the affected sequence is
+         produced and it will fix it with an alternative not affected sequence
+         that produce the same behavior.
+
+         If unsure, say Y.
+
 config ARM64_ERRATUM_832075
        bool "Cortex-A57: 832075: possible deadlock on mixing exclusive memory accesses with device loads"
        default y
index 1ded44d200478a950c15eb8981f776bf9cb750e5..ced90495ce1ffde843742f1505867f373e166c12 100644 (file)
@@ -101,6 +101,14 @@ prelink.o: $(ALL_OBJS) FORCE
        $(call if_changed,ld)
 endif
 
+ifeq ($(CONFIG_ARM64_ERRATUM_843419),y)
+    ifeq ($(call ld-option, --fix-cortex-a53-843419),n)
+        $(warning ld does not support --fix-cortex-a53-843419; xen may be susceptible to erratum)
+    else
+        XEN_LDFLAGS += --fix-cortex-a53-843419
+    endif
+endif
+
 targets += prelink.o
 
 $(TARGET)-syms: prelink.o xen.lds
index e62eddc3654c4093019ce92be05424cd19137550..83c7e1457baae8a11c788f329722a8dd6331d7e4 100644 (file)
@@ -43,6 +43,18 @@ define as-option-add-closure
     endif
 endef
 
+# $(if-success,<command>,<then>,<else>)
+# Return <then> if <command> exits with 0, <else> otherwise.
+if-success = $(shell { $(1); } >/dev/null 2>&1 && echo "$(2)" || echo "$(3)")
+
+# $(success,<command>)
+# Return y if <command> exits with 0, n otherwise
+success = $(call if-success,$(1),y,n)
+
+# $(ld-option,<flag>)
+# Return y if the linker supports <flag>, n otherwise
+ld-option = $(call success,$(LD) -v $(1))
+
 # cc-ifversion
 # Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
 cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))