xen/arm: Add workaround for Cortex-A53 erratum #843419

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 d81133d45d)
This commit is contained in:
Luca Fancellu authored and Stefano Stabellini committed 2021-03-19 12:33:22 -07:00
1 parent 8d6755fb44
commit a8a6736c97
4 files changed
+40

No files matched your search

+1
View 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 |
+19
View 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
+8
View 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
+12
View 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))
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.