From f18217902a4c84c2cb6695164ffa1db540a0146b Mon Sep 17 00:00:00 2001 From: Alexei Fedorov Date: Mon, 7 Dec 2020 16:38:53 +0000 Subject: [PATCH] TF-A: Add build option for Arm Feature Modifiers This patch adds a new ARM_ARCH_FEATURE build option to add support for compiler's feature modifiers. It has the form '[no]feature+...' and defaults to 'none'. This option translates into compiler option '-march=armvX[.Y]-a+[no]feature+...'. Change-Id: I37742f270a898f5d6968e146cbcc04cbf53ef2ad Signed-off-by: Alexei Fedorov --- Makefile | 43 +++++++++++++++++++------- docs/getting_started/build-options.rst | 6 ++++ make_helpers/defaults.mk | 3 ++ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 5c9186ece..f950eb834 100644 --- a/Makefile +++ b/Makefile @@ -185,13 +185,14 @@ target32-directive = -target arm-none-eabi else target32-directive = -target armv8a-none-eabi -# Set the compiler's target architecture profile based on ARM_ARCH_MINOR option +# Set the compiler's target architecture profile based on +# ARM_ARCH_MAJOR ARM_ARCH_MINOR options ifeq (${ARM_ARCH_MINOR},0) -march32-directive = -march=armv8-a -march64-directive = -march=armv8-a +march32-directive = -march=armv${ARM_ARCH_MAJOR}-a +march64-directive = -march=armv${ARM_ARCH_MAJOR}-a else -march32-directive = -march=armv8.${ARM_ARCH_MINOR}-a -march64-directive = -march=armv8.${ARM_ARCH_MINOR}-a +march32-directive = -march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a +march64-directive = -march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a endif endif @@ -203,23 +204,43 @@ mem_tag_arch_support = yes endif endif -# Enabled required option for memory stack tagging. Currently, these options are -# enabled only for clang and armclang compiler. +# Get architecture feature modifiers +arch-features = ${ARM_ARCH_FEATURE} + +# Enable required options for memory stack tagging. +# Currently, these options are enabled only for clang and armclang compiler. ifeq (${SUPPORT_STACK_MEMTAG},yes) ifdef mem_tag_arch_support +# Check for armclang and clang compilers ifneq ( ,$(filter $(notdir $(CC)),armclang clang)) -march64-directive = -march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a+memtag +# Add "memtag" architecture feature modifier if not specified +ifeq ( ,$(findstring memtag,$(arch-features))) +arch-features := $(arch-features)+memtag +endif # memtag ifeq ($(notdir $(CC)),armclang) TF_CFLAGS += -mmemtag-stack else ifeq ($(notdir $(CC)),clang) TF_CFLAGS += -fsanitize=memtag -endif -endif +endif # armclang +endif # armclang clang else $(error "Error: stack memory tagging is not supported for architecture \ ${ARCH},armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a") +endif # mem_tag_arch_support +endif # SUPPORT_STACK_MEMTAG + +# Set the compiler's architecture feature modifiers +ifneq ($(arch-features), none) +# Strip "none+" from arch-features +arch-features := $(subst none+,,$(arch-features)) +ifeq ($(ARCH), aarch32) +march32-directive := $(march32-directive)+$(arch-features) +else +march64-directive := $(march64-directive)+$(arch-features) endif -endif +# Print features +$(info Arm Architecture Features specified: $(subst +, ,$(arch-features))) +endif # arch-features ifneq ($(findstring armclang,$(notdir $(CC))),) TF_CFLAGS_aarch32 = -target arm-arm-none-eabi $(march32-directive) diff --git a/docs/getting_started/build-options.rst b/docs/getting_started/build-options.rst index 8adf4ad8b..d4eb6a768 100644 --- a/docs/getting_started/build-options.rst +++ b/docs/getting_started/build-options.rst @@ -26,6 +26,12 @@ Common build options ``aarch64`` or ``aarch32`` as values. By default, it is defined to ``aarch64``. +- ``ARM_ARCH_FEATURE``: Optional Arm Architecture build option which specifies + one or more feature modifiers. This option has the form ``[no]feature+...`` + and defaults to ``none``. It translates into compiler option + ``-march=armvX[.Y]-a+[no]feature+...``. See compiler's documentation for the + list of supported feature modifiers. + - ``ARM_ARCH_MAJOR``: The major version of Arm Architecture to target when compiling TF-A. Its value must be numeric, and defaults to 8 . See also, *Armv8 Architecture Extensions* and *Armv7 Architecture Extensions* in diff --git a/make_helpers/defaults.mk b/make_helpers/defaults.mk index 578bd5987..9e5fe8557 100644 --- a/make_helpers/defaults.mk +++ b/make_helpers/defaults.mk @@ -19,6 +19,9 @@ AARCH32_SP := none # The Target build architecture. Supported values are: aarch64, aarch32. ARCH := aarch64 +# ARM Architecture feature modifiers: none by default +ARM_ARCH_FEATURE := none + # ARM Architecture major and minor versions: 8.0 by default. ARM_ARCH_MAJOR := 8 ARM_ARCH_MINOR := 0