summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--payloads/libpayload/arch/arm64/Kconfig8
-rwxr-xr-xpayloads/libpayload/bin/lpgcc6
-rw-r--r--src/arch/arm64/Kconfig9
-rwxr-xr-xutil/xcompile/xcompile20
4 files changed, 43 insertions, 0 deletions
diff --git a/payloads/libpayload/arch/arm64/Kconfig b/payloads/libpayload/arch/arm64/Kconfig
index d2f8e5675a..a28a1f27d2 100644
--- a/payloads/libpayload/arch/arm64/Kconfig
+++ b/payloads/libpayload/arch/arm64/Kconfig
@@ -33,6 +33,14 @@ config ARCH_SPECIFIC_OPTIONS # dummy
def_bool y
select LITTLE_ENDIAN
+config ARM64_A53_ERRATUM_843419
+ bool "Enable Cortex-A53 erratum 843419 linker workaround"
+ default n
+ help
+ Some early Cortex-A53 revisions had a hardware bug that results in
+ incorrect address calculations in rare cases. This option enables a
+ linker workaround to avoid those cases if your toolchain supports it.
+
config DMA_LIM_EXCL
hex "DMA address limit(exclusive) in MiB units"
default 0x1000
diff --git a/payloads/libpayload/bin/lpgcc b/payloads/libpayload/bin/lpgcc
index 17d8edaf03..8d0260b895 100755
--- a/payloads/libpayload/bin/lpgcc
+++ b/payloads/libpayload/bin/lpgcc
@@ -181,6 +181,12 @@ else
echo "Could not find head.o"
exit 1
fi
+
+ if grep -q ARM64_A53_ERRATUM_843419=y $BASE/../libpayload.config &&
+ grep -q fix-cortex-a53-843419 $BASE/../libpayload.xcompile; then
+ _LDFLAGS+=" -Wl,--fix-cortex-a53-843419"
+ fi
+
if [ $DEBUGME -eq 1 ]; then
echo "$DEFAULT_CC $_LDFLAGS $HEAD_O $CMDLINE $_CFLAGS -lpayload $_LIBGCC"
fi
diff --git a/src/arch/arm64/Kconfig b/src/arch/arm64/Kconfig
index b7cdc12168..f2adf5c6b6 100644
--- a/src/arch/arm64/Kconfig
+++ b/src/arch/arm64/Kconfig
@@ -55,3 +55,12 @@ config ARM64_SECURE_OS_FILE
depends on ARM64_USE_SECURE_OS
help
Secure OS binary file.
+
+config ARM64_A53_ERRATUM_843419
+ bool
+ default n
+ help
+ Some early Cortex-A53 revisions had a hardware bug that results in
+ incorrect address calculations in rare cases. This option enables a
+ linker workaround to avoid those cases if your toolchain supports it.
+ Should be selected automatically by SoCs that are affected.
diff --git a/util/xcompile/xcompile b/util/xcompile/xcompile
index e712ac34e3..46a30d15f0 100755
--- a/util/xcompile/xcompile
+++ b/util/xcompile/xcompile
@@ -87,6 +87,18 @@ testcc() {
$1 -nostdlib -Werror $2 -c "$tmp_c" -o "$tmp_o" >/dev/null 2>&1
}
+testld() {
+ local gcc="$1"
+ local cflags="$2"
+ local ld="$3"
+ local ldflags="$4"
+ local tmp_o="$TMPFILE.o"
+ local tmp_elf="$TMPFILE.elf"
+ rm -f "$tmp_elf"
+ testcc $1 $2 &&
+ $3 -nostdlib -static $4 -o "$tmp_elf" "$tmp_o" >/dev/null 2>&1
+}
+
testas() {
local gccprefix="$1"
local twidth="$2"
@@ -163,6 +175,11 @@ detect_special_flags() {
;;
x64)
;;
+ arm64)
+ testld "$GCC" "$CFLAGS_GCC" "${GCCPREFIX}ld${LINKER_SUFFIX}" \
+ "$LDFLAGS --fix-cortex-a53-843419" && \
+ LDFLAGS_ARM64_A53_ERRATUM_843419+=" --fix-cortex-a53-843419"
+ ;;
mipsel)
testcc "$GCC" "$CFLAGS_GCC -mno-abicalls -fno-pic" && \
CFLAGS_GCC+=" -mno-abicalls -fno-pic"
@@ -203,6 +220,9 @@ endif
CPP_${TARCH}:=${GCCPREFIX}cpp
AS_${TARCH}:=${GCCPREFIX}as ${ASFLAGS}
LD_${TARCH}:=${GCCPREFIX}ld${LINKER_SUFFIX} ${LDFLAGS}
+ifeq (\$(CONFIG_ARM64_A53_ERRATUM_843419)\$(CONFIG_LP_ARM64_A53_ERRATUM_843419),y)
+LD_${TARCH}+=${LDFLAGS_ARM64_A53_ERRATUM_843419}
+endif
NM_${TARCH}:=${GCCPREFIX}nm
OBJCOPY_${TARCH}:=${GCCPREFIX}objcopy
OBJDUMP_${TARCH}:=${GCCPREFIX}objdump