diff options
-rw-r--r-- | payloads/libpayload/arch/arm64/Kconfig | 8 | ||||
-rwxr-xr-x | payloads/libpayload/bin/lpgcc | 6 | ||||
-rw-r--r-- | src/arch/arm64/Kconfig | 9 | ||||
-rwxr-xr-x | util/xcompile/xcompile | 20 |
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 |