From 4e04478aace24232d9acb9ca7c71af8ae845811f Mon Sep 17 00:00:00 2001 From: Chris Kay Date: Tue, 9 Mar 2021 13:34:35 +0000 Subject: [PATCH] arch: Enable `FEAT_SB` for supported non-Armv8.5-A platforms The speculation barrier feature (`FEAT_SB`) was introduced with and made mandatory in the Armv8.5-A extension. It was retroactively made optional in prior extensions, but the checks in our code-base do not reflect that, assuming that it is only available in Armv8.5-A or later. This change introduces the `ENABLE_FEAT_SB` definition, which derives support for the `sb` instruction in the assembler from the feature flags passed to it. Note that we assume that if this feature is enabled then all the cores in the system support it - enabling speculation barriers for only a subset of the cores is unsupported. Signed-off-by: Chris Kay Change-Id: I978ed38829385b221b10ba56d49b78f4756e20ea --- Makefile | 9 +++++++++ include/arch/aarch32/asm_macros.S | 6 +++--- include/arch/aarch64/asm_macros.S | 6 +++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index b6c8b210c..24096e1ef 100644 --- a/Makefile +++ b/Makefile @@ -245,6 +245,13 @@ endif # arch-features # Determine if FEAT_RNG is supported ENABLE_FEAT_RNG = $(if $(findstring rng,${arch-features}),1,0) +# Determine if FEAT_SB is supported +ENABLE_FEAT_SB = $(if $(findstring sb,${arch-features}),1,0) + +ifeq "8.5" "$(word 1, $(sort 8.5 $(ARM_ARCH_MAJOR).$(ARM_ARCH_MINOR)))" +ENABLE_FEAT_SB = 1 +endif + ifneq ($(findstring armclang,$(notdir $(CC))),) TF_CFLAGS_aarch32 = -target arm-arm-none-eabi $(march32-directive) TF_CFLAGS_aarch64 = -target aarch64-arm-none-eabi $(march64-directive) @@ -945,6 +952,7 @@ $(eval $(call assert_booleans,\ COT_DESC_IN_DTB \ USE_SP804_TIMER \ ENABLE_FEAT_RNG \ + ENABLE_FEAT_SB \ ))) $(eval $(call assert_numerics,\ @@ -1038,6 +1046,7 @@ $(eval $(call add_defines,\ COT_DESC_IN_DTB \ USE_SP804_TIMER \ ENABLE_FEAT_RNG \ + ENABLE_FEAT_SB \ ))) ifeq (${SANITIZE_UB},trap) diff --git a/include/arch/aarch32/asm_macros.S b/include/arch/aarch32/asm_macros.S index f75da0ce6..483f9fe05 100644 --- a/include/arch/aarch32/asm_macros.S +++ b/include/arch/aarch32/asm_macros.S @@ -107,12 +107,12 @@ #else /* - * Macro for mitigating against speculative execution beyond ERET. - * If possible use Speculation Barrier instruction defined in ARMv8.5 + * Macro for mitigating against speculative execution beyond ERET. Uses the + * speculation barrier instruction introduced by FEAT_SB, if it's enabled. */ .macro exception_return eret -#if ARM_ARCH_AT_LEAST(8, 5) +#if ENABLE_FEAT_SB sb #else dsb nsh diff --git a/include/arch/aarch64/asm_macros.S b/include/arch/aarch64/asm_macros.S index cbb9f0be8..464c05be1 100644 --- a/include/arch/aarch64/asm_macros.S +++ b/include/arch/aarch64/asm_macros.S @@ -219,12 +219,12 @@ .endm /* - * Macro for mitigating against speculative execution beyond ERET. - * If possible use Speculation Barrier instruction defined in ARMv8.5 + * Macro for mitigating against speculative execution beyond ERET. Uses the + * speculation barrier instruction introduced by FEAT_SB, if it's enabled. */ .macro exception_return eret -#if ARM_ARCH_AT_LEAST(8, 5) +#if ENABLE_FEAT_SB sb #else dsb nsh