Trusted Firmware-A Tests, version 2.0

This is the first public version of the tests for the Trusted
Firmware-A project. Please see the documentation provided in the
source tree for more details.

Change-Id: I6f3452046a1351ac94a71b3525c30a4ca8db7867
Signed-off-by: Sandrine Bailleux <sandrine.bailleux@arm.com>
Co-authored-by: amobal01 <amol.balasokamble@arm.com>
Co-authored-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Co-authored-by: Asha R <asha.r@arm.com>
Co-authored-by: Chandni Cherukuri <chandni.cherukuri@arm.com>
Co-authored-by: David Cunado <david.cunado@arm.com>
Co-authored-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Co-authored-by: Douglas Raillard <douglas.raillard@arm.com>
Co-authored-by: dp-arm <dimitris.papastamos@arm.com>
Co-authored-by: Jeenu Viswambharan <jeenu.viswambharan@arm.com>
Co-authored-by: Jonathan Wright <jonathan.wright@arm.com>
Co-authored-by: Kévin Petit <kevin.petit@arm.com>
Co-authored-by: Roberto Vargas <roberto.vargas@arm.com>
Co-authored-by: Sathees Balya <sathees.balya@arm.com>
Co-authored-by: Shawon Roy <Shawon.Roy@arm.com>
Co-authored-by: Soby Mathew <soby.mathew@arm.com>
Co-authored-by: Thomas Abraham <thomas.abraham@arm.com>
Co-authored-by: Vikram Kanigiri <vikram.kanigiri@arm.com>
Co-authored-by: Yatharth Kochar <yatharth.kochar@arm.com>
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..4f054bc
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,462 @@
+#
+# Copyright (c) 2018, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# TFTF Version
+VERSION_MAJOR		:= 2
+VERSION_MINOR		:= 0
+
+################################################################################
+# Default values for build configurations, and their dependencies
+################################################################################
+
+include defaults.mk
+
+PLAT			:= ${DEFAULT_PLAT}
+
+# Assertions enabled for DEBUG builds by default
+ENABLE_ASSERTIONS	:= ${DEBUG}
+
+################################################################################
+# Checkpatch script options
+################################################################################
+
+CHECKCODE_ARGS		:=	--no-patch
+# Do not check the coding style on imported library files or documentation files
+INC_LIB_DIRS_TO_CHECK	:=	$(sort $(filter-out			\
+					include/lib/stdlib,		\
+					$(wildcard include/lib/*)))
+LIB_DIRS_TO_CHECK	:=	$(sort $(filter-out			\
+					lib/compiler-rt			\
+					lib/stdlib,			\
+					$(wildcard lib/*)))
+ROOT_DIRS_TO_CHECK	:=	$(sort $(filter-out			\
+					lib				\
+					include				\
+					docs				\
+					%.md				\
+					%.rst,				\
+					$(wildcard *)))
+CHECK_PATHS		:=	${ROOT_DIRS_TO_CHECK}			\
+				${INC_LIB_DIRS_TO_CHECK}		\
+				${LIB_DIRS_TO_CHECK}
+
+ifeq (${V},0)
+	Q=@
+else
+	Q=
+endif
+export Q
+
+ifneq (${DEBUG}, 0)
+	BUILD_TYPE	:=	debug
+	# Use LOG_LEVEL_INFO by default for debug builds
+	LOG_LEVEL       :=      40
+else
+	BUILD_TYPE	:=	release
+	# Use LOG_LEVEL_ERROR by default for release builds
+	LOG_LEVEL       :=      20
+endif
+
+# Default build string (git branch and commit)
+ifeq (${BUILD_STRING},)
+        BUILD_STRING    :=      $(shell git log -n 1 --pretty=format:"%h")
+endif
+
+VERSION_STRING		:= 	v${VERSION_MAJOR}.${VERSION_MINOR}(${PLAT},${BUILD_TYPE}):${BUILD_STRING}
+
+BUILD_BASE		:=	./build
+BUILD_PLAT		:=	${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
+
+PLAT_MAKEFILE		:=	platform.mk
+# Generate the platforms list by recursively searching for all directories
+# under /plat containing a PLAT_MAKEFILE. Append each platform with a `|`
+# char and strip out the final '|'.
+PLATFORMS		:=	$(shell find plat/ -name '${PLAT_MAKEFILE}' -print0 |			\
+					sed -r 's%[^\x00]*\/([^/]*)\/${PLAT_MAKEFILE}\x00%\1|%g' |	\
+					sed -r 's/\|$$//')
+
+# Convenience function for adding build definitions
+# $(eval $(call add_define,BAR_DEFINES,FOO)) will have:
+# -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise
+# inside the BAR_DEFINES variable.
+define add_define
+$(1) += -D$(2)$(if $(value $(2)),=$(value $(2)),)
+endef
+
+# Convenience function for verifying option has a boolean value
+# $(eval $(call assert_boolean,FOO)) will assert FOO is 0 or 1
+define assert_boolean
+$(and $(patsubst 0,,$(value $(1))),$(patsubst 1,,$(value $(1))),$(error $(1) must be boolean))
+endef
+
+ifeq (${PLAT},)
+  $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform")
+endif
+PLAT_PATH		:=	$(shell find plat/ -wholename '*/${PLAT}')
+PLAT_MAKEFILE_FULL	:=	${PLAT_PATH}/${PLAT_MAKEFILE}
+ifeq ($(wildcard ${PLAT_MAKEFILE_FULL}),)
+  $(error "Error: Invalid platform. The following platforms are available: ${PLATFORMS}")
+endif
+
+.PHONY: all
+all: msg_start
+
+.PHONY: msg_start
+msg_start:
+	@echo "Building ${PLAT}"
+	@echo "Using the following tests file: ${TESTS_FILE}"
+
+# Include test images makefiles.
+include tftf/framework/framework.mk
+include tftf/tests/tests.mk
+include fwu/ns_bl1u/ns_bl1u.mk
+include fwu/ns_bl2u/ns_bl2u.mk
+include spm/cactus/cactus.mk
+
+# Include platform specific makefile last because:
+# - the platform makefile may use all previous definitions in this file.
+# - the platform makefile may wish overwriting some of them.
+include ${PLAT_MAKEFILE_FULL}
+
+
+.SUFFIXES:
+
+################################################################################
+# Build options checks
+################################################################################
+$(eval $(call assert_boolean,DEBUG))
+$(eval $(call assert_boolean,ENABLE_ASSERTIONS))
+$(eval $(call assert_boolean,FIRMWARE_UPDATE))
+$(eval $(call assert_boolean,FWU_BL_TEST))
+$(eval $(call assert_boolean,NEW_TEST_SESSION))
+$(eval $(call assert_boolean,SHELL_COLOR))
+$(eval $(call assert_boolean,USE_NVM))
+
+################################################################################
+# Add definitions to the cpp preprocessor based on the current build options.
+# This is done after including the platform specific makefile to allow the
+# platform to overwrite the default options
+################################################################################
+$(eval $(call add_define,TFTF_DEFINES,ARM_ARCH_MAJOR))
+$(eval $(call add_define,TFTF_DEFINES,ARM_ARCH_MINOR))
+$(eval $(call add_define,TFTF_DEFINES,DEBUG))
+$(eval $(call add_define,TFTF_DEFINES,ENABLE_ASSERTIONS))
+$(eval $(call add_define,TFTF_DEFINES,LOG_LEVEL))
+$(eval $(call add_define,TFTF_DEFINES,NEW_TEST_SESSION))
+$(eval $(call add_define,TFTF_DEFINES,PLAT_${PLAT}))
+$(eval $(call add_define,TFTF_DEFINES,SHELL_COLOR))
+$(eval $(call add_define,TFTF_DEFINES,USE_NVM))
+
+ifeq (${ARCH},aarch32)
+        $(eval $(call add_define,TFTF_DEFINES,AARCH32))
+else
+        $(eval $(call add_define,TFTF_DEFINES,AARCH64))
+endif
+
+################################################################################
+
+# Assembler, compiler and linker flags shared across all test images.
+COMMON_ASFLAGS		:=
+COMMON_CFLAGS		:=
+COMMON_LDFLAGS		:=
+
+ifeq (${DEBUG},1)
+COMMON_CFLAGS		+= 	-g
+COMMON_ASFLAGS		+= 	-g -Wa,--gdwarf-2
+endif
+
+COMMON_ASFLAGS_aarch64	:=	-mgeneral-regs-only
+COMMON_CFLAGS_aarch64	:=	-mgeneral-regs-only
+
+COMMON_ASFLAGS_aarch32	:=	-march=armv8-a
+COMMON_CFLAGS_aarch32	:=	-march=armv8-a
+
+COMMON_ASFLAGS		+=	-nostdinc -ffreestanding -Wa,--fatal-warnings	\
+				-Werror -Wmissing-include-dirs			\
+				-D__ASSEMBLY__ $(COMMON_ASFLAGS_$(ARCH))
+COMMON_CFLAGS		+=	-nostdinc -ffreestanding -Wall	-Werror 	\
+				-Wmissing-include-dirs $(COMMON_CFLAGS_$(ARCH))	\
+				-std=gnu99 -Os
+COMMON_CFLAGS		+=	-ffunction-sections -fdata-sections
+
+# Get the content of CFLAGS user defined value last so they are appended after
+# the options defined in the Makefile
+COMMON_CFLAGS 		+=	${CFLAGS}
+
+COMMON_LDFLAGS		+=	--fatal-warnings -O1 --gc-sections --build-id=none
+
+CC			:=	${CROSS_COMPILE}gcc
+CPP			:=	${CROSS_COMPILE}cpp
+AS			:=	${CROSS_COMPILE}gcc
+AR			:=	${CROSS_COMPILE}ar
+LD			:=	${CROSS_COMPILE}ld
+OC			:=	${CROSS_COMPILE}objcopy
+OD			:=	${CROSS_COMPILE}objdump
+NM			:=	${CROSS_COMPILE}nm
+PP			:=	${CROSS_COMPILE}gcc
+
+################################################################################
+
+TFTF_SOURCES		:= ${FRAMEWORK_SOURCES}	${TESTS_SOURCES} ${PLAT_SOURCES}
+TFTF_INCLUDES		+= ${PLAT_INCLUDES}
+TFTF_CFLAGS		+= ${COMMON_CFLAGS}
+TFTF_ASFLAGS		+= ${COMMON_ASFLAGS}
+TFTF_LDFLAGS		+= ${COMMON_LDFLAGS}
+
+NS_BL1U_SOURCES		+= ${PLAT_SOURCES}
+NS_BL1U_INCLUDES	+= ${PLAT_INCLUDES}
+NS_BL1U_CFLAGS		+= ${COMMON_CFLAGS}
+NS_BL1U_ASFLAGS		+= ${COMMON_ASFLAGS}
+NS_BL1U_LDFLAGS		+= ${COMMON_LDFLAGS}
+
+NS_BL2U_SOURCES		+= ${PLAT_SOURCES}
+NS_BL2U_INCLUDES	+= ${PLAT_INCLUDES}
+NS_BL2U_CFLAGS		+= ${COMMON_CFLAGS}
+NS_BL2U_ASFLAGS		+= ${COMMON_ASFLAGS}
+NS_BL2U_LDFLAGS		+= ${COMMON_LDFLAGS}
+
+CACTUS_INCLUDES		+= ${PLAT_INCLUDES}
+CACTUS_CFLAGS		+= ${COMMON_CFLAGS}
+CACTUS_ASFLAGS		+= ${COMMON_ASFLAGS}
+CACTUS_LDFLAGS		+= ${COMMON_LDFLAGS}
+
+.PHONY: locate-checkpatch
+locate-checkpatch:
+ifndef CHECKPATCH
+	$(error "Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/script/checkpatch.pl")
+else
+ifeq (,$(wildcard ${CHECKPATCH}))
+	$(error "The file CHECKPATCH points to cannot be found, use eg: CHECKPATCH=../linux/script/checkpatch.pl")
+endif
+endif
+
+.PHONY: clean
+clean:
+			@echo "  CLEAN"
+			${Q}rm -rf ${BUILD_PLAT}
+			${MAKE} -C el3_payload clean
+
+.PHONY: realclean distclean
+realclean distclean:
+			@echo "  REALCLEAN"
+			${Q}rm -rf ${BUILD_BASE}
+			${Q}rm -f ${CURDIR}/cscope.*
+			${MAKE} -C el3_payload distclean
+
+.PHONY: checkcodebase
+checkcodebase:		locate-checkpatch
+	@echo "  CHECKING STYLE"
+	@if test -d .git ; then						\
+		git ls-files | grep -E -v 'stdlib|docs|\.md|\.rst' |	\
+		while read GIT_FILE ;					\
+		do ${CHECKPATCH} ${CHECKCODE_ARGS} -f $$GIT_FILE ;	\
+		done ;							\
+	else								\
+		 find . -type f -not -iwholename "*.git*"		\
+		 -not -iwholename "*build*"				\
+		 -not -iwholename "*stdlib*"				\
+		 -not -iwholename "*docs*"				\
+		 -not -iwholename "*.md"				\
+		 -not -iwholename "*.rst"				\
+		 -exec ${CHECKPATCH} ${CHECKCODE_ARGS} -f {} \; ;	\
+	fi
+
+.PHONY: checkpatch
+checkpatch:		locate-checkpatch
+			@echo "  CHECKING STYLE"
+			${Q}COMMON_COMMIT=$$(git merge-base HEAD ${BASE_COMMIT});	\
+			for commit in `git rev-list $$COMMON_COMMIT..HEAD`; do		\
+				printf "\n[*] Checking style of '$$commit'\n\n";	\
+				git log --format=email "$$commit~..$$commit"		\
+					-- ${CHECK_PATHS} | ${CHECKPATCH} - || true;	\
+				git diff --format=email "$$commit~..$$commit"		\
+					-- ${CHECK_PATHS} | ${CHECKPATCH} - || true;	\
+			done
+
+ifneq (${FIRMWARE_UPDATE},1)
+.PHONY: ns_bl1u ns_bl2u
+ns_bl1u ns_bl2u:
+	@echo "ERROR: Can't build $@ because Firmware Update is not supported \
+	on this platform."
+	@exit 1
+endif
+
+ifneq (${ARCH}-${PLAT},aarch64-fvp)
+.PHONY: cactus
+cactus:
+	@echo "ERROR: $@ is supported only on AArch64 FVP."
+	@exit 1
+endif
+
+MAKE_DEP = -Wp,-MD,$(DEP) -MT $$@
+
+define MAKE_C
+
+$(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2))))
+$(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
+
+$(OBJ) : $(2)
+	@echo "  CC      $$<"
+	$$(Q)$$(CC) $$($(3)_CFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -DIMAGE_$(3) $(MAKE_DEP) -c $$< -o $$@
+
+-include $(DEP)
+endef
+
+
+define MAKE_S
+
+$(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2))))
+$(eval DEP := $(patsubst %.o,%.d,$(OBJ)))
+
+$(OBJ) : $(2)
+	@echo "  AS      $$<"
+	$$(Q)$$(AS) $$($(3)_ASFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -DIMAGE_$(3) $(MAKE_DEP) -c $$< -o $$@
+
+-include $(DEP)
+endef
+
+
+define MAKE_LD
+
+$(eval DEP := $(1).d)
+
+$(1) : $(2)
+	@echo "  PP      $$<"
+	$$(Q)$$(AS) $$($(3)_ASFLAGS) ${$(3)_INCLUDES} ${$(3)_DEFINES} -P -E $(MAKE_DEP) -o $$@ $$<
+
+-include $(DEP)
+endef
+
+
+define MAKE_OBJS
+	$(eval C_OBJS := $(filter %.c,$(2)))
+	$(eval REMAIN := $(filter-out %.c,$(2)))
+	$(eval $(foreach obj,$(C_OBJS),$(call MAKE_C,$(1),$(obj),$(3))))
+
+	$(eval S_OBJS := $(filter %.S,$(REMAIN)))
+	$(eval REMAIN := $(filter-out %.S,$(REMAIN)))
+	$(eval $(foreach obj,$(S_OBJS),$(call MAKE_S,$(1),$(obj),$(3))))
+
+	$(and $(REMAIN),$(error Unexpected source files present: $(REMAIN)))
+endef
+
+
+# NOTE: The line continuation '\' is required in the next define otherwise we
+# end up with a line-feed characer at the end of the last c filename.
+# Also bare this issue in mind if extending the list of supported filetypes.
+define SOURCES_TO_OBJS
+	$(notdir $(patsubst %.c,%.o,$(filter %.c,$(1)))) \
+	$(notdir $(patsubst %.S,%.o,$(filter %.S,$(1))))
+endef
+
+define uppercase
+$(shell echo $(1) | tr '[:lower:]' '[:upper:]')
+endef
+
+define MAKE_IMG
+	$(eval IMG_PREFIX := $(call uppercase, $(1)))
+	$(eval BUILD_DIR  := ${BUILD_PLAT}/$(1))
+	$(eval SOURCES    := $(${IMG_PREFIX}_SOURCES))
+	$(eval OBJS       := $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
+	$(eval LINKERFILE := $(BUILD_DIR)/$(1).ld)
+	$(eval MAPFILE    := $(BUILD_DIR)/$(1).map)
+	$(eval ELF        := $(BUILD_DIR)/$(1).elf)
+	$(eval DUMP       := $(BUILD_DIR)/$(1).dump)
+	$(eval BIN        := $(BUILD_PLAT)/$(1).bin)
+
+	$(eval $(call MAKE_OBJS,$(BUILD_DIR),$(SOURCES),${IMG_PREFIX}))
+	$(eval $(call MAKE_LD,$(LINKERFILE),$(${IMG_PREFIX}_LINKERFILE),${IMG_PREFIX}))
+
+$(BUILD_DIR) :
+	$$(Q)mkdir -p "$$@"
+
+$(ELF) : $(OBJS) $(LINKERFILE)
+	@echo "  LD      $$@"
+	@echo 'const char build_message[] = "Built : "__TIME__", "__DATE__; \
+               const char version_string[] = "${VERSION_STRING}";' | \
+		$$(CC) $$(${IMG_PREFIX}_CFLAGS) ${${IMG_PREFIX}_INCLUDES} ${${IMG_PREFIX}_DEFINES} -c -xc - -o $(BUILD_DIR)/build_message.o
+	$$(Q)$$(LD) -o $$@ $$(${IMG_PREFIX}_LDFLAGS) -Map=$(MAPFILE) \
+		-T $(LINKERFILE) $(BUILD_DIR)/build_message.o $(OBJS)
+
+$(DUMP) : $(ELF)
+	@echo "  OD      $$@"
+	$${Q}$${OD} -dx $$< > $$@
+
+$(BIN) : $(ELF)
+	@echo "  BIN     $$@"
+	$$(Q)$$(OC) -O binary $$< $$@
+	@echo
+	@echo "Built $$@ successfully"
+	@echo
+
+.PHONY : $(1)
+$(1) : $(BUILD_DIR) $(BIN) $(DUMP)
+
+all : $(1)
+
+endef
+
+$(AUTOGEN_DIR):
+	$(Q)mkdir -p "$@"
+
+$(AUTOGEN_DIR)/tests_list.c $(AUTOGEN_DIR)/tests_list.h: $(AUTOGEN_DIR) ${TESTS_FILE} ${PLAT_TESTS_SKIP_LIST}
+	@echo "  AUTOGEN $@"
+	tools/generate_test_list/generate_test_list.pl $(AUTOGEN_DIR)/tests_list.c $(AUTOGEN_DIR)/tests_list.h  ${TESTS_FILE} $(PLAT_TESTS_SKIP_LIST)
+
+$(eval $(call MAKE_IMG,tftf))
+
+ifeq ($(FIRMWARE_UPDATE), 1)
+  $(eval $(call MAKE_IMG,ns_bl1u))
+  $(eval $(call MAKE_IMG,ns_bl2u))
+endif
+
+ifeq (${ARCH}-${PLAT},aarch64-fvp)
+  $(eval $(call MAKE_IMG,cactus))
+endif
+
+# The EL3 test payload is only supported in AArch64. It has an independent build
+# system.
+.PHONY: el3_payload
+ifneq (${ARCH},aarch32)
+el3_payload: $(BUILD_DIR)
+	${Q}${MAKE} -C el3_payload PLAT=${PLAT}
+	${Q}find "el3_payload/build/${PLAT}" -name '*.bin' -exec cp {} "${BUILD_PLAT}" \;
+
+all: el3_payload
+endif
+
+.PHONY: cscope
+cscope:
+	@echo "  CSCOPE"
+	${Q}find ${CURDIR} -name "*.[chsS]" > cscope.files
+	${Q}cscope -b -q -k
+
+.PHONY: help
+help:
+	@echo "usage: ${MAKE} PLAT=<${PLATFORMS}> <all|tftf|ns_bl1u|ns_bl2u|cactus|el3_payload|distclean|clean|checkcodebase|checkpatch>"
+	@echo ""
+	@echo "PLAT is used to specify which platform you wish to build."
+	@echo "If no platform is specified, PLAT defaults to: ${DEFAULT_PLAT}"
+	@echo ""
+	@echo "Supported Targets:"
+	@echo "  all            Build all supported binaries for this platform"
+	@echo "                 (i.e. TFTF and FWU images)"
+	@echo "  tftf           Build the TFTF image"
+	@echo "  ns_bl1u        Build the NS_BL1U image"
+	@echo "  ns_bl2u        Build the NS_BL2U image"
+	@echo "  cactus         Build the Cactus image (Test S-EL0 payload)."
+	@echo "  el3_payload    Build the EL3 test payload"
+	@echo "  checkcodebase  Check the coding style of the entire source tree"
+	@echo "  checkpatch     Check the coding style on changes in the current"
+	@echo "                 branch against BASE_COMMIT (default origin/master)"
+	@echo "  clean          Clean the build for the selected platform"
+	@echo "  cscope         Generate cscope index"
+	@echo "  distclean      Remove all build artifacts for all platforms"
+	@echo ""
+	@echo "note: most build targets require PLAT to be set to a specific platform."
+	@echo ""
+	@echo "example: build all targets for the FVP platform:"
+	@echo "  CROSS_COMPILE=aarch64-none-elf- make PLAT=fvp all"