blob: 3ea39fb844ebd133650530d701e99b415b2b9bac [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001#
Alexei Fedorov0f305472019-10-29 14:06:54 +00002# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
Chris Kayecb8a762024-01-04 11:56:37 +00007include ../make_helpers/build_macros.mk
8
Alexei Fedorov0f305472019-10-29 14:06:54 +00009# Default number of threads per CPU on FVP
10FVP_MAX_PE_PER_CPU := 1
11
12# Check the PE per core count
13ifneq ($(FVP_MAX_PE_PER_CPU),$(filter $(FVP_MAX_PE_PER_CPU),1 2))
14$(error "Incorrect FVP_MAX_PE_PER_CPU specified for FVP port")
15endif
16
17# Convenience function for adding build definitions
18# $(eval $(call add_define,BAR_DEFINES,FOO)) will have:
19# -DFOO if $(FOO) is empty; -DFOO=$(FOO) otherwise
20# inside the BAR_DEFINES variable.
21define add_define
22$(1) += -D$(2)$(if $(value $(2)),=$(value $(2)),)
23endef
24
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020025CC := ${CROSS_COMPILE}gcc
26AS := ${CROSS_COMPILE}as
27LD := ${CROSS_COMPILE}ld
28OC := ${CROSS_COMPILE}objcopy
29OD := ${CROSS_COMPILE}objdump
30
31PLAT ?= fvp
32
33ASFLAGS := -nostdinc -ffreestanding -Wa,--fatal-warnings -Werror
34ASFLAGS += -Iplat/${PLAT}/ -I.
35
Chris Kayecb8a762024-01-04 11:56:37 +000036LDFLAGS += $(call ld_option,--no-warn-rwx-segments)
37
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020038PLAT_BUILD_DIR := build/${PLAT}
39SOURCES := entrypoint.S spin.S uart.S plat/${PLAT}/platform.S
40OBJS := $(patsubst %,$(PLAT_BUILD_DIR)/%,$(notdir $(SOURCES:.S=.o)))
41
42PROGRAM := el3_payload
43LINKER_SCRIPT := ${PLAT_BUILD_DIR}/${PROGRAM}.ld
44ELF := ${PLAT_BUILD_DIR}/${PROGRAM}.elf
45BIN := ${PLAT_BUILD_DIR}/${PROGRAM}.bin
46DUMP := ${PLAT_BUILD_DIR}/${PROGRAM}.dump
47
48include plat/${PLAT}/platform.mk
49
Alexei Fedorov0f305472019-10-29 14:06:54 +000050# Pass FVP_MAX_PE_PER_CPU to the build system
51$(eval $(call add_define,ASFLAGS,FVP_MAX_PE_PER_CPU))
52
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020053all: ${BIN}
54
55${PLAT_BUILD_DIR}:
56 mkdir -p $@
57
58${PLAT_BUILD_DIR}/%.o: %.S ${PLAT_BUILD_DIR}
59 @echo " CC $<"
60 ${CC} ${ASFLAGS} -c $< -o $@
61
62# Specific rule for this '.o' file to avoid worrying about
63# plat/${PLAT}/platform.S being in a sub-directory...
64# TODO: Fix this workaround.
65${PLAT_BUILD_DIR}/platform.o: plat/${PLAT}/platform.S ${PLAT_BUILD_DIR}
66 @echo " CC $<"
67 ${CC} ${ASFLAGS} -c $< -o $@
68
69${PLAT_BUILD_DIR}/%.ld: %.ld.S ${PLAT_BUILD_DIR}
70 @echo " PP $<"
71 ${CC} -DDRAM_BASE=${DRAM_BASE} -DDRAM_SIZE=${DRAM_SIZE} -E -P -o $@ $<
72
73${ELF}: ${LINKER_SCRIPT} ${OBJS}
74 @echo " LD $<"
75 ${LD} ${LDFLAGS} ${OBJS} --script ${LINKER_SCRIPT} -o $@
76
77${BIN}: ${ELF}
78 @echo " BIN $@"
79 ${OC} -O binary $< $@
80
81${DUMP}: $(ELF)
82 @echo " OD $$@"
83 ${OD} -dx $< > $@
84
85dump: ${DUMP}
86
87clean:
88 rm -rf ${PLAT_BUILD_DIR}
89
90distclean: clean
91 rm -rf build/
92
93run: run_${PLAT}
94
Sandrine Bailleux47ab4f42019-05-10 13:23:41 +020095run_juno: ${ELF} scripts/juno/run_armds_script.sh scripts/juno/load_el3_payload.ds
96 scripts/juno/run_armds_script.sh scripts/juno/load_el3_payload.ds
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020097
98run_fvp: scripts/fvp/run_fvp.sh
99 scripts/fvp/run_fvp.sh
100
101help:
102 @echo "EL3 test payload"
103 @echo
104 @echo "To build:"
105 @echo "make [PLAT=fvp|juno] [TARGETS]"
106 @echo ""
107 @echo "The default platform is fvp."
108 @echo
109 @echo "TARGETS:"
110 @echo " all Build the payload [default target]"
111 @echo " dump Generate a dump file of the program"
112 @echo " run Run the payload on the given platform."
113 @echo " /!\ For Juno, requires a connection to a Juno board via DSTREAM"