Commit ec786cbc authored by Andrew Thoelke's avatar Andrew Thoelke
Browse files

Merge pull request #78 from jeenuv:tf-issues-148

parents a43d431b 2da8d8bf
...@@ -28,13 +28,26 @@ ...@@ -28,13 +28,26 @@
# POSSIBILITY OF SUCH DAMAGE. # POSSIBILITY OF SUCH DAMAGE.
# #
# Decrease the verbosity of the make script #
# can be made verbose by passing V=1 at the make command line # Default values for build configurations
ifdef V #
KBUILD_VERBOSE = ${V}
else # Build verbosity
KBUILD_VERBOSE = 0 V := 0
endif # Debug build
DEBUG := 0
# Build architecture
ARCH := aarch64
# Build platform
DEFAULT_PLAT := fvp
PLAT := ${DEFAULT_PLAT}
# SPD choice
SPD := none
# Base commit to perform code check on
BASE_COMMIT := origin/master
# NS timer register save and restore
NS_TIMER_SWITCH := 0
# Checkpatch ignores # Checkpatch ignores
CHECK_IGNORE = --ignore COMPLEX_MACRO CHECK_IGNORE = --ignore COMPLEX_MACRO
...@@ -42,17 +55,14 @@ CHECK_IGNORE = --ignore COMPLEX_MACRO ...@@ -42,17 +55,14 @@ CHECK_IGNORE = --ignore COMPLEX_MACRO
CHECKPATCH_ARGS = --no-tree --no-signoff ${CHECK_IGNORE} CHECKPATCH_ARGS = --no-tree --no-signoff ${CHECK_IGNORE}
CHECKCODE_ARGS = --no-patch --no-tree --no-signoff ${CHECK_IGNORE} CHECKCODE_ARGS = --no-patch --no-tree --no-signoff ${CHECK_IGNORE}
ifeq "${KBUILD_VERBOSE}" "0" ifeq (${V},0)
Q=@ Q=@
CHECKCODE_ARGS += --no-summary --terse CHECKCODE_ARGS += --no-summary --terse
else else
Q= Q=
endif endif
export Q export Q
DEBUG ?= 0
ifneq (${DEBUG}, 0) ifneq (${DEBUG}, 0)
BUILD_TYPE := debug BUILD_TYPE := debug
else else
...@@ -69,14 +79,6 @@ BL_COMMON_SOURCES := common/bl_common.c \ ...@@ -69,14 +79,6 @@ BL_COMMON_SOURCES := common/bl_common.c \
lib/io_storage.c \ lib/io_storage.c \
plat/common/aarch64/platform_helpers.S plat/common/aarch64/platform_helpers.S
ARCH ?= aarch64
# By default, build fvp platform
DEFAULT_PLAT := fvp
PLAT ?= ${DEFAULT_PLAT}
# By default, build no SPD component
SPD ?= none
BUILD_BASE := ./build BUILD_BASE := ./build
BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE} BUILD_PLAT := ${BUILD_BASE}/${PLAT}/${BUILD_TYPE}
...@@ -84,6 +86,19 @@ PLATFORMS := $(shell ls -I common plat/) ...@@ -84,6 +86,19 @@ PLATFORMS := $(shell ls -I common plat/)
SPDS := $(shell ls -I none services/spd) SPDS := $(shell ls -I none services/spd)
HELP_PLATFORMS := $(shell echo ${PLATFORMS} | sed 's/ /|/g') HELP_PLATFORMS := $(shell echo ${PLATFORMS} | sed 's/ /|/g')
# Convenience function for adding build definitions
# $(eval $(call add_define,FOO)) will have:
# -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise
define add_define
DEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
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},) ifeq (${PLAT},)
$(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform.") $(error "Error: Unknown platform. Please use PLAT=<platform name> to specify the platform.")
endif endif
...@@ -132,7 +147,6 @@ endif ...@@ -132,7 +147,6 @@ endif
.PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool fip .PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool fip
.SUFFIXES: .SUFFIXES:
INCLUDES += -Iinclude/bl1 \ INCLUDES += -Iinclude/bl1 \
-Iinclude/bl2 \ -Iinclude/bl2 \
-Iinclude/bl31 \ -Iinclude/bl31 \
...@@ -150,28 +164,32 @@ INCLUDES += -Iinclude/bl1 \ ...@@ -150,28 +164,32 @@ INCLUDES += -Iinclude/bl1 \
${PLAT_INCLUDES} \ ${PLAT_INCLUDES} \
${SPD_INCLUDES} ${SPD_INCLUDES}
# Process DEBUG flag
$(eval $(call assert_boolean,DEBUG))
$(eval $(call add_define,DEBUG))
ifeq (${DEBUG},0)
$(eval $(call add_define,NDEBUG))
else
CFLAGS += -g
ASFLAGS += -g -Wa,--gdwarf-2
endif
# Process NS_TIMER_SWITCH flag
$(eval $(call assert_boolean,NS_TIMER_SWITCH))
$(eval $(call add_define,NS_TIMER_SWITCH))
ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \ ASFLAGS += -nostdinc -ffreestanding -Wa,--fatal-warnings \
-mgeneral-regs-only -D__ASSEMBLY__ ${INCLUDES} \ -mgeneral-regs-only -D__ASSEMBLY__ \
-DDEBUG=${DEBUG} ${DEFINES} ${INCLUDES}
CFLAGS := -nostdinc -pedantic -ffreestanding -Wall \ CFLAGS += -nostdinc -pedantic -ffreestanding -Wall \
-Werror -mgeneral-regs-only -std=c99 -c -Os \ -Werror -mgeneral-regs-only -std=c99 -c -Os \
-DDEBUG=${DEBUG} ${INCLUDES} ${CFLAGS} ${DEFINES} ${INCLUDES}
CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS += --fatal-warnings -O1 LDFLAGS += --fatal-warnings -O1
LDFLAGS += --gc-sections LDFLAGS += --gc-sections
ifneq (${DEBUG}, 0)
#CFLAGS += -g -O0
CFLAGS += -g
# -save-temps -fverbose-asm
ASFLAGS += -g -Wa,--gdwarf-2
else
CFLAGS += -DNDEBUG=1
endif
CC := ${CROSS_COMPILE}gcc CC := ${CROSS_COMPILE}gcc
CPP := ${CROSS_COMPILE}cpp CPP := ${CROSS_COMPILE}cpp
AS := ${CROSS_COMPILE}gcc AS := ${CROSS_COMPILE}gcc
...@@ -182,8 +200,6 @@ OD := ${CROSS_COMPILE}objdump ...@@ -182,8 +200,6 @@ OD := ${CROSS_COMPILE}objdump
NM := ${CROSS_COMPILE}nm NM := ${CROSS_COMPILE}nm
PP := ${CROSS_COMPILE}gcc -E ${CFLAGS} PP := ${CROSS_COMPILE}gcc -E ${CFLAGS}
BASE_COMMIT ?= origin/master
# Variables for use with Firmware Image Package # Variables for use with Firmware Image Package
FIPTOOLPATH ?= tools/fip_create FIPTOOLPATH ?= tools/fip_create
FIPTOOL ?= ${FIPTOOLPATH}/fip_create FIPTOOL ?= ${FIPTOOLPATH}/fip_create
......
...@@ -172,6 +172,8 @@ func el1_sysregs_context_save ...@@ -172,6 +172,8 @@ func el1_sysregs_context_save
mrs x9, vbar_el1 mrs x9, vbar_el1
stp x17, x9, [x0, #CTX_CONTEXTIDR_EL1] stp x17, x9, [x0, #CTX_CONTEXTIDR_EL1]
/* Save NS timer registers if the build has instructed so */
#if NS_TIMER_SWITCH
mrs x10, cntp_ctl_el0 mrs x10, cntp_ctl_el0
mrs x11, cntp_cval_el0 mrs x11, cntp_cval_el0
stp x10, x11, [x0, #CTX_CNTP_CTL_EL0] stp x10, x11, [x0, #CTX_CNTP_CTL_EL0]
...@@ -181,8 +183,11 @@ func el1_sysregs_context_save ...@@ -181,8 +183,11 @@ func el1_sysregs_context_save
stp x12, x13, [x0, #CTX_CNTV_CTL_EL0] stp x12, x13, [x0, #CTX_CNTV_CTL_EL0]
mrs x14, cntkctl_el1 mrs x14, cntkctl_el1
str x14, [x0, #CTX_CNTKCTL_EL1]
#endif
mrs x15, fpexc32_el2 mrs x15, fpexc32_el2
stp x14, x15, [x0, #CTX_CNTKCTL_EL1] str x15, [x0, #CTX_FP_FPEXC32_EL2]
ret ret
...@@ -253,6 +258,8 @@ func el1_sysregs_context_restore ...@@ -253,6 +258,8 @@ func el1_sysregs_context_restore
msr contextidr_el1, x17 msr contextidr_el1, x17
msr vbar_el1, x9 msr vbar_el1, x9
/* Restore NS timer registers if the build has instructed so */
#if NS_TIMER_SWITCH
ldp x10, x11, [x0, #CTX_CNTP_CTL_EL0] ldp x10, x11, [x0, #CTX_CNTP_CTL_EL0]
msr cntp_ctl_el0, x10 msr cntp_ctl_el0, x10
msr cntp_cval_el0, x11 msr cntp_cval_el0, x11
...@@ -261,8 +268,11 @@ func el1_sysregs_context_restore ...@@ -261,8 +268,11 @@ func el1_sysregs_context_restore
msr cntv_ctl_el0, x12 msr cntv_ctl_el0, x12
msr cntv_cval_el0, x13 msr cntv_cval_el0, x13
ldp x14, x15, [x0, #CTX_CNTKCTL_EL1] ldr x14, [x0, #CTX_CNTKCTL_EL1]
msr cntkctl_el1, x14 msr cntkctl_el1, x14
#endif
ldr x15, [x0, #CTX_FP_FPEXC32_EL2]
msr fpexc32_el2, x15 msr fpexc32_el2, x15
/* No explict ISB required here as ERET covers it */ /* No explict ISB required here as ERET covers it */
......
...@@ -83,6 +83,9 @@ To build the software for the FVPs, follow these steps: ...@@ -83,6 +83,9 @@ To build the software for the FVPs, follow these steps:
BL33=<path-to>/<bl33_image> \ BL33=<path-to>/<bl33_image> \
make PLAT=fvp all fip make PLAT=fvp all fip
See the "Summary of build options" for information on available build
options.
By default this produces a release version of the build. To produce a debug By default this produces a release version of the build. To produce a debug
version instead, refer to the "Debugging options" section below. UEFI can be version instead, refer to the "Debugging options" section below. UEFI can be
used as the BL3-3 image, refer to the "Obtaining the normal world software" used as the BL3-3 image, refer to the "Obtaining the normal world software"
...@@ -120,6 +123,39 @@ To build the software for the FVPs, follow these steps: ...@@ -120,6 +123,39 @@ To build the software for the FVPs, follow these steps:
make realclean make realclean
### Summary of build options
ARM Trusted Firmware build system supports the following build options. Unless
mentioned otherwise, these options are expected to be specified at the build
command line and are not to be modified in any component makefiles. Note that
the build system doesn't track dependency for build options. Therefore, if any
of the build options are changed from a previous build, a clean build must be
performed.
* `BL33`: Path to BL33 image in the host file system. This is mandatory for
`fip` target
* `CROSS_COMPILE`: Prefix to tool chain binaries. Please refer to examples in
this document for usage
* `DEBUG`: Chooses between a debug and release build. It can take either 0
(release) or 1 (debug) as values. 0 is the default
* `NS_TIMER_SWITCH`: Enable save and restore for non-secure timer register
contents upon world switch. It can take either 0 (don't save and restore) or
1 (do save and restore). 0 is the default. An SPD could set this to 1 if it
wants the timer registers to be saved and restored
* `PLAT`: Choose a platform to build ARM Trusted Firmware for. The chosen
platform name must be the name of one of the directories under the `plat/`
directory other than `common`
* `SPD`: Choose a Secure Payload Dispatcher component to be built into the
Trusted Firmware. The value should be the path to the directory containing
SPD source; the directory is expected to contain `spd.mk` makefile
* `V`: Verbose build. If assigned anything other than 0, the build commands
are printed. Default is 0
### Creating a Firmware Image Package ### Creating a Firmware Image Package
......
...@@ -127,6 +127,11 @@ ...@@ -127,6 +127,11 @@
#define CTX_AFSR1_EL1 0xc8 #define CTX_AFSR1_EL1 0xc8
#define CTX_CONTEXTIDR_EL1 0xd0 #define CTX_CONTEXTIDR_EL1 0xd0
#define CTX_VBAR_EL1 0xd8 #define CTX_VBAR_EL1 0xd8
/*
* If the timer registers aren't saved and restored, we don't have to reserve
* space for them in the context
*/
#if NS_TIMER_SWITCH
#define CTX_CNTP_CTL_EL0 0xe0 #define CTX_CNTP_CTL_EL0 0xe0
#define CTX_CNTP_CVAL_EL0 0xe8 #define CTX_CNTP_CVAL_EL0 0xe8
#define CTX_CNTV_CTL_EL0 0xf0 #define CTX_CNTV_CTL_EL0 0xf0
...@@ -134,6 +139,10 @@ ...@@ -134,6 +139,10 @@
#define CTX_CNTKCTL_EL1 0x100 #define CTX_CNTKCTL_EL1 0x100
#define CTX_FP_FPEXC32_EL2 0x108 #define CTX_FP_FPEXC32_EL2 0x108
#define CTX_SYSREGS_END 0x110 #define CTX_SYSREGS_END 0x110
#else
#define CTX_FP_FPEXC32_EL2 0xe0
#define CTX_SYSREGS_END 0xf0
#endif
/******************************************************************************* /*******************************************************************************
* Constants that allow assembler code to access members of and the 'fp_regs' * Constants that allow assembler code to access members of and the 'fp_regs'
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment