1################################################################################
2# Following variables defines how the NS_USER (Non Secure User - Client
3# Application), NS_KERNEL (Non Secure Kernel), S_KERNEL (Secure Kernel) and
4# S_USER (Secure User - TA) are compiled
5################################################################################
6COMPILE_NS_USER ?= 64
7override COMPILE_NS_KERNEL := 64
8COMPILE_S_USER ?= 64
9COMPILE_S_KERNEL ?= 64
10
11################################################################################
12# If you change this, you MUST run `make arm-tf-clean` first before rebuilding
13################################################################################
14TF_A_TRUSTED_BOARD_BOOT ?= n
15
16BR2_ROOTFS_OVERLAY = $(ROOT)/build/br-ext/board/qemu/overlay
17BR2_ROOTFS_POST_BUILD_SCRIPT = $(ROOT)/build/br-ext/board/qemu/post-build.sh
18BR2_ROOTFS_POST_SCRIPT_ARGS = "$(QEMU_VIRTFS_AUTOMOUNT) $(QEMU_VIRTFS_MOUNTPOINT) $(QEMU_PSS_AUTOMOUNT)"
19
20OPTEE_OS_PLATFORM = vexpress-qemu_armv8a
21
22########################################################################################
23# If you change this, you MUST run `make arm-tf-clean optee-os-clean` before rebuilding
24########################################################################################
25XEN_BOOT ?= n
26ifeq ($(XEN_BOOT),y)
27GICV3 = y
28# For DomU, guest.cfg and other images can be picked up from mounted folder
29QEMU_VIRTFS_AUTOMOUNT = y
30endif
31
32# Option to enable Rust examples
33# Currently supported only on x86_64 hosts
34ifeq ($(shell uname -m),x86_64)
35RUST_ENABLE ?= y
36endif
37
38# Enable fTPM
39MEASURED_BOOT_FTPM ?= y
40
41include common.mk
42
43DEBUG ?= 1
44
45# Option to build with GICV3 enabled
46GICV3 ?= y
47
48# Option to configure FF-A and SPM:
49# n:	disabled
50# 3:	SPMC and SPMD at EL3 (in TF-A)
51# 2:	SPMC at S-EL2 (in Hafnium), SPMD at EL3 (in TF-A)
52# 1:	SPMC at S-EL1 (in OP-TEE), SPMD at EL3 (in TF-A)
53SPMC_AT_EL ?= n
54ifneq ($(filter-out n 1 2 3,$(SPMC_AT_EL)),)
55$(error Unsupported SPMC_AT_EL value $(SPMC_AT_EL))
56endif
57
58# Option to configure Pointer Authentication for TA's
59PAUTH ?= n
60
61# Option to configure Memory Tagging Extension
62MEMTAG ?= n
63
64################################################################################
65# Paths to git projects and various binaries
66################################################################################
67TF_A_PATH		?= $(ROOT)/trusted-firmware-a
68BINARIES_PATH		?= $(ROOT)/out/bin
69QEMU_PATH		?= $(ROOT)/qemu
70QEMU_BUILD		?= $(QEMU_PATH)/build
71MODULE_OUTPUT		?= $(ROOT)/out/kernel_modules
72UBOOT_PATH		?= $(ROOT)/u-boot
73UBOOT_BIN		?= $(UBOOT_PATH)/u-boot.bin
74MKIMAGE_PATH		?= $(UBOOT_PATH)/tools
75HAFNIUM_PATH		?= $(ROOT)/hafnium
76HAFNIUM_BIN		?= $(HAFNIUM_PATH)/out/reference/secure_qemu_aarch64_clang/hafnium.bin
77
78ROOTFS_GZ		?= $(BINARIES_PATH)/rootfs.cpio.gz
79ROOTFS_UGZ		?= $(BINARIES_PATH)/rootfs.cpio.uboot
80
81KERNEL_IMAGE		?= $(LINUX_PATH)/arch/arm64/boot/Image
82KERNEL_IMAGEGZ		?= $(LINUX_PATH)/arch/arm64/boot/Image.gz
83KERNEL_UIMAGE		?= $(BINARIES_PATH)/uImage
84
85SCMI_DTSO 		?= $(ROOT)/build/qemu_v8/qemu-v8-scmi-overlay.dtso
86SCMI_DTBO 		?= $(BINARIES_PATH)/qemu-v8-scmi-overlay.dtbo
87SCMI_DTB 		?= $(BINARIES_PATH)/qemu-v8-scmi.dtb
88
89# Load and entry addresses (u-boot only)
90# If you change this please also change in kconfigs/u-boot_qemu_v8.conf
91KERNEL_ENTRY		?= 0x42200000
92KERNEL_LOADADDR		?= 0x42200000
93ROOTFS_ENTRY		?= 0x45000000
94ROOTFS_LOADADDR		?= 0x45000000
95
96ifeq ($(SPMC_AT_EL),2)
97BL32_DEPS		?= hafnium optee-os
98else
99BL32_DEPS		?= optee-os
100endif
101
102BL33_BIN		?= $(UBOOT_BIN)
103BL33_DEPS		?= u-boot
104
105XEN_PATH		?= $(ROOT)/xen
106XEN_IMAGE		?= $(XEN_PATH)/xen/xen.efi
107XEN_EXT4		?= $(BINARIES_PATH)/xen.ext4
108XEN_CFG			?= $(ROOT)/build/qemu_v8/xen/xen.cfg
109
110ifeq ($(GICV3),y)
111	TFA_GIC_DRIVER	?= QEMU_GICV3
112	QEMU_GIC_VERSION = 3
113else
114	TFA_GIC_DRIVER	?= QEMU_GICV2
115	QEMU_GIC_VERSION = 2
116endif
117
118################################################################################
119# Targets
120################################################################################
121TARGET_DEPS := arm-tf buildroot linux optee-os qemu
122TARGET_CLEAN := arm-tf-clean buildroot-clean linux-clean optee-os-clean \
123	qemu-clean check-clean
124
125TARGET_DEPS 		+= $(BL33_DEPS)
126
127TARGET_DEPS		+= $(KERNEL_UIMAGE) $(ROOTFS_UGZ)
128TARGET_CLEAN		+= u-boot-clean
129
130ifeq ($(XEN_BOOT),y)
131TARGET_DEPS		+= xen-create-image
132endif
133
134ifeq ($(WITH_SCMI),y)
135TARGET_DEPS		+= $(SCMI_DTB)
136endif
137
138all: $(TARGET_DEPS)
139
140clean: $(TARGET_CLEAN)
141
142$(BINARIES_PATH):
143	mkdir -p $@
144
145include toolchain.mk
146
147################################################################################
148# ARM Trusted Firmware
149################################################################################
150TF_A_EXPORTS ?= \
151	CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)" \
152	CC="$(CCACHE)$(AARCH64_CROSS_COMPILE)gcc" \
153	LD="$(CCACHE)$(AARCH64_CROSS_COMPILE)ld"
154
155TF_A_DEBUG ?= $(DEBUG)
156ifeq ($(TF_A_DEBUG),0)
157TF_A_LOGLVL ?= 30
158TF_A_OUT = $(TF_A_PATH)/build/qemu/release
159else
160TF_A_LOGLVL ?= 40
161TF_A_OUT = $(TF_A_PATH)/build/qemu/debug
162endif
163
164TF_A_FLAGS ?= \
165	BL33=$(BL33_BIN) \
166	PLAT=qemu \
167	QEMU_USE_GIC_DRIVER=$(TFA_GIC_DRIVER) \
168	ENABLE_SVE_FOR_NS=2 \
169	ENABLE_SME_FOR_NS=2 \
170	ENABLE_SVE_FOR_SWD=1 \
171	ENABLE_SME_FOR_SWD=1 \
172	ENABLE_FEAT_FGT=2 \
173	ENABLE_FEAT_HCX=2 \
174	ENABLE_FEAT_ECV=2 \
175	BL32_RAM_LOCATION=tdram \
176	DEBUG=$(TF_A_DEBUG) \
177	LOG_LEVEL=$(TF_A_LOGLVL)
178
179TF_A_FLAGS_BL32_OPTEE  = BL32=$(OPTEE_OS_HEADER_V2_BIN)
180TF_A_FLAGS_BL32_OPTEE += BL32_EXTRA1=$(OPTEE_OS_PAGER_V2_BIN)
181TF_A_FLAGS_BL32_OPTEE += BL32_EXTRA2=$(OPTEE_OS_PAGEABLE_V2_BIN)
182
183TF_A_FLAGS_SPMC_AT_EL_n  = $(TF_A_FLAGS_BL32_OPTEE) SPD=opteed
184TF_A_FLAGS_SPMC_AT_EL_1  = $(TF_A_FLAGS_BL32_OPTEE) SPD=spmd
185TF_A_FLAGS_SPMC_AT_EL_1 += CTX_INCLUDE_EL2_REGS=0 SPMD_SPM_AT_SEL2=0
186TF_A_FLAGS_SPMC_AT_EL_1 += ENABLE_SME_FOR_NS=0 ENABLE_SME_FOR_SWD=0
187TF_A_FLAGS_SPMC_AT_EL_1 += QEMU_TOS_FW_CONFIG_DTS=../build/qemu_v8/spmc_el1_manifest.dts
188TF_A_FLAGS_SPMC_AT_EL_1 += SPMC_OPTEE=1
189TF_A_FLAGS_SPMC_AT_EL_1 += QEMU_TOS_FW_CONFIG_DTS=../build/qemu_v8/spmc_el1_manifest.dts
190TF_A_FLAGS_SPMC_AT_EL_2  = SPD=spmd
191TF_A_FLAGS_SPMC_AT_EL_2 += ENABLE_FEAT_SEL2=1
192TF_A_FLAGS_SPMC_AT_EL_2 += SP_LAYOUT_FILE=../build/qemu_v8/sp_layout.json
193TF_A_FLAGS_SPMC_AT_EL_2 += NEED_FDT=yes
194TF_A_FLAGS_SPMC_AT_EL_2 += BL32=$(HAFNIUM_BIN)
195TF_A_FLAGS_SPMC_AT_EL_2 += QEMU_TOS_FW_CONFIG_DTS=../build/qemu_v8/spmc_el2_manifest.dts
196TF_A_FLAGS_SPMC_AT_EL_2 += QEMU_TB_FW_CONFIG_DTS=../build/qemu_v8/tb_fw_config.dts
197ifneq ($(PAUTH),y)
198TF_A_FLAGS_SPMC_AT_EL_2 += BRANCH_PROTECTION=1
199endif
200ifneq ($(MEMTAG),y)
201TF_A_FLAGS_SPMC_AT_EL_2 += ENABLE_FEAT_MTE2=2
202endif
203TF_A_FLAGS_SPMC_AT_EL_3  = SPD=spmd SPMC_AT_EL3=1
204TF_A_FLAGS_SPMC_AT_EL_3 += CTX_INCLUDE_EL2_REGS=0 SPMD_SPM_AT_SEL2=0
205TF_A_FLAGS_SPMC_AT_EL_3 += ENABLE_SME_FOR_NS=0 ENABLE_SME_FOR_SWD=0
206TF_A_FLAGS_SPMC_AT_EL_3 += BL32=$(OPTEE_OS_PAGER_V2_BIN)
207TF_A_FLAGS_SPMC_AT_EL_3 += QEMU_TOS_FW_CONFIG_DTS=../build/qemu_v8/spmc_el3_manifest.dts
208
209TF_A_FLAGS += $(TF_A_FLAGS_SPMC_AT_EL_$(SPMC_AT_EL))
210
211ifeq ($(TF_A_TRUSTED_BOARD_BOOT),y)
212TF_A_FLAGS += \
213	MBEDTLS_DIR=$(ROOT)/mbedtls \
214	TRUSTED_BOARD_BOOT=1 \
215	GENERATE_COT=1
216endif
217
218ifeq ($(PAUTH),y)
219TF_A_FLAGS += BRANCH_PROTECTION=1
220endif
221ifeq ($(MEMTAG),y)
222TF_A_FLAGS += ENABLE_FEAT_MTE2=2
223endif
224
225arm-tf: $(BL32_DEPS) $(BL33_DEPS)
226	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) all fip
227	mkdir -p $(BINARIES_PATH)
228	ln -sf $(TF_A_OUT)/bl1.bin $(BINARIES_PATH)
229	ln -sf $(TF_A_OUT)/bl2.bin $(BINARIES_PATH)
230	ln -sf $(TF_A_OUT)/bl31.bin $(BINARIES_PATH)
231ifeq ($(TF_A_TRUSTED_BOARD_BOOT),y)
232	ln -sf $(TF_A_OUT)/trusted_key.crt $(BINARIES_PATH)
233	ln -sf $(TF_A_OUT)/tos_fw_key.crt $(BINARIES_PATH)
234	ln -sf $(TF_A_OUT)/tos_fw_content.crt $(BINARIES_PATH)
235	ln -sf $(TF_A_OUT)/tb_fw.crt $(BINARIES_PATH)
236	ln -sf $(TF_A_OUT)/soc_fw_key.crt $(BINARIES_PATH)
237	ln -sf $(TF_A_OUT)/soc_fw_content.crt $(BINARIES_PATH)
238	ln -sf $(TF_A_OUT)/nt_fw_key.crt $(BINARIES_PATH)
239	ln -sf $(TF_A_OUT)/nt_fw_content.crt $(BINARIES_PATH)
240endif
241	rm -f $(BINARIES_PATH)/bl32.bin
242	rm -f $(BINARIES_PATH)/bl32_extra1.bin
243	rm -f $(BINARIES_PATH)/bl32_extra2.bin
244	rm -f $(BINARIES_PATH)/tos_fw_config.dtb
245	rm -f $(BINARIES_PATH)/op-tee.pkg
246ifeq ($(SPMC_AT_EL),1)
247	ln -sf $(TF_A_OUT)/fdts/spmc_el1_manifest.dtb \
248		$(BINARIES_PATH)/tos_fw_config.dtb
249	ln -sf $(OPTEE_OS_HEADER_V2_BIN) $(BINARIES_PATH)/bl32.bin
250	ln -sf $(OPTEE_OS_PAGER_V2_BIN) $(BINARIES_PATH)/bl32_extra1.bin
251	ln -sf $(OPTEE_OS_PAGEABLE_V2_BIN) $(BINARIES_PATH)/bl32_extra2.bin
252else ifeq ($(SPMC_AT_EL),2)
253	ln -sf $(TF_A_OUT)/fdts/spmc_el2_manifest.dtb \
254		$(BINARIES_PATH)/tos_fw_config.dtb
255	ln -sf $(TF_A_OUT)/fdts/tb_fw_config.dtb \
256		$(BINARIES_PATH)/tb_fw_config.dtb
257	ln -sf $(HAFNIUM_BIN) $(BINARIES_PATH)/bl32.bin
258	ln -sf $(TF_A_OUT)/op-tee.pkg $(BINARIES_PATH)/op-tee.pkg
259else ifeq ($(SPMC_AT_EL),3)
260	ln -sf $(TF_A_OUT)/fdts/spmc_el3_manifest.dtb \
261		$(BINARIES_PATH)/tos_fw_config.dtb
262	ln -sf $(OPTEE_OS_PAGER_V2_BIN) $(BINARIES_PATH)/bl32.bin
263else
264	ln -sf $(OPTEE_OS_HEADER_V2_BIN) $(BINARIES_PATH)/bl32.bin
265	ln -sf $(OPTEE_OS_PAGER_V2_BIN) $(BINARIES_PATH)/bl32_extra1.bin
266	ln -sf $(OPTEE_OS_PAGEABLE_V2_BIN) $(BINARIES_PATH)/bl32_extra2.bin
267endif
268	ln -sf $(BL33_BIN) $(BINARIES_PATH)/bl33.bin
269
270arm-tf-clean:
271	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) clean
272
273################################################################################
274# QEMU
275################################################################################
276$(QEMU_BUILD)/config-host.mak:
277	cd $(QEMU_PATH); ./configure --target-list=aarch64-softmmu --enable-slirp\
278			$(QEMU_CONFIGURE_PARAMS_COMMON)
279
280qemu: $(QEMU_BUILD)/.stamp_qemu
281
282$(QEMU_BUILD)/.stamp_qemu: $(QEMU_BUILD)/config-host.mak
283	$(MAKE) -C $(QEMU_PATH)
284	touch $@
285
286qemu-clean:
287	rm -f $(QEMU_BUILD)/.stamp_qemu
288	$(MAKE) -C $(QEMU_PATH) distclean
289
290################################################################################
291# U-Boot
292################################################################################
293ifeq ($(XEN_BOOT),y)
294UBOOT_DEFCONFIG_FILES := $(UBOOT_PATH)/configs/qemu_arm64_defconfig		\
295			 $(ROOT)/build/kconfigs/u-boot_xen_qemu_v8.conf
296else
297UBOOT_DEFCONFIG_FILES := $(UBOOT_PATH)/configs/qemu_arm64_defconfig		\
298			 $(ROOT)/build/kconfigs/u-boot_qemu_v8.conf
299endif
300
301UBOOT_COMMON_FLAGS ?= CROSS_COMPILE=$(CROSS_COMPILE_NS_KERNEL)
302
303$(UBOOT_PATH)/.config: $(UBOOT_DEFCONFIG_FILES)
304	cd $(UBOOT_PATH) && \
305                scripts/kconfig/merge_config.sh $(UBOOT_DEFCONFIG_FILES)
306
307.PHONY: u-boot-defconfig
308u-boot-defconfig: $(UBOOT_PATH)/.config
309
310.PHONY: u-boot
311u-boot: u-boot-defconfig
312	$(MAKE) -C $(UBOOT_PATH) $(UBOOT_COMMON_FLAGS)
313
314.PHONY: u-boot-clean
315u-boot-clean:
316	$(MAKE) -C $(UBOOT_PATH) $(UBOOT_COMMON_FLAGS) distclean
317
318################################################################################
319
320################################################################################
321# Linux kernel
322################################################################################
323LINUX_DEFCONFIG_COMMON_ARCH := arm64
324LINUX_DEFCONFIG_COMMON_FILES := \
325		$(LINUX_PATH)/arch/arm64/configs/defconfig \
326		$(CURDIR)/kconfigs/qemu.conf
327
328linux-defconfig: $(LINUX_PATH)/.config
329
330LINUX_COMMON_FLAGS += ARCH=arm64
331LINUX_COMMON_TARGETS += Image scripts_gdb
332
333linux: linux-common
334	mkdir -p $(BINARIES_PATH)
335	ln -sf $(LINUX_PATH)/arch/arm64/boot/Image $(BINARIES_PATH)
336
337linux-modules: linux
338	$(MAKE) -C $(LINUX_PATH) $(LINUX_COMMON_FLAGS) modules
339	$(MAKE) -C $(LINUX_PATH) $(LINUX_COMMON_FLAGS) INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$(MODULE_OUTPUT) modules_install
340
341linux-defconfig-clean: linux-defconfig-clean-common
342
343LINUX_CLEAN_COMMON_FLAGS += ARCH=arm64
344
345linux-clean: linux-clean-common
346
347LINUX_CLEANER_COMMON_FLAGS += ARCH=arm64
348
349linux-cleaner: linux-cleaner-common
350
351################################################################################
352# OP-TEE
353################################################################################
354OPTEE_OS_COMMON_FLAGS += DEBUG=$(DEBUG) CFG_ARM_GICV3=$(GICV3)
355OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_1 = CFG_CORE_SEL1_SPMC=y
356OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_2 = CFG_CORE_SEL2_SPMC=y
357OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_2 += CFG_ARM_GICV3=n CFG_CORE_HAFNIUM_INTC=y
358# [0e00.0000 0e2f.ffff] is reserved to early boot and SPMC
359# [0e30.0000 0e33.ffff] is reserved manifest etc (op-tee.pkg)
360OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_2 += CFG_TZDRAM_START=0x0e304000
361OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_2 += CFG_TZDRAM_SIZE=0x00cfc000
362OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_2 += CFG_CORE_WORKAROUND_NSITR_CACHE_PRIME=n
363OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_3 = CFG_CORE_EL3_SPMC=y
364OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_3 += CFG_DT_ADDR=0x40000000
365OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_3 += CFG_CORE_RESERVED_SHM=n
366
367ifeq ($(XEN_BOOT),y)
368OPTEE_OS_COMMON_FLAGS += CFG_NS_VIRTUALIZATION=y
369endif
370
371ifeq ($(PAUTH),y)
372OPTEE_OS_COMMON_FLAGS += CFG_TA_PAUTH=y
373OPTEE_OS_COMMON_FLAGS += CFG_CORE_PAUTH=y
374endif
375ifeq ($(MEMTAG),y)
376OPTEE_OS_COMMON_FLAGS += CFG_MEMTAG=y
377endif
378
379ifneq ($(QEMU_SMP),)
380CFG_TEE_CORE_NB_CORE ?= $(QEMU_SMP)
381OPTEE_OS_COMMON_FLAGS += CFG_TEE_CORE_NB_CORE=$(CFG_TEE_CORE_NB_CORE)
382endif
383
384ifeq ($(WITH_SCMI),y)
385OPTEE_OS_COMMON_FLAGS += CFG_SCMI_SCPFW=y
386OPTEE_OS_COMMON_FLAGS += CFG_SCP_FIRMWARE=$(ROOT)/SCP-firmware
387endif
388
389OPTEE_OS_COMMON_FLAGS += $(OPTEE_OS_COMMON_FLAGS_SPMC_AT_EL_$(SPMC_AT_EL))
390
391optee-os: optee-os-common
392
393optee-os-clean: optee-os-clean-common
394
395################################################################################
396# Hafnium
397################################################################################
398
399HAFNIUM_EXPORTS = PATH=$(TOOLCHAIN_ROOT)/clang-$(CLANG_BUILD_VER)/bin:$(PATH)
400
401.hafnium_checkout:
402	git -C $(HAFNIUM_PATH) submodule update --init
403	touch $@
404
405hafnium: $(HAFNIUM_BIN)
406
407$(HAFNIUM_BIN): .hafnium_checkout | $(OUT_PATH)
408	$(HAFNIUM_EXPORTS) $(MAKE) -C $(HAFNIUM_PATH) $(HAFNIUM_FLAGS) PLATFORM=secure_qemu_aarch64
409
410
411################################################################################
412# mkimage - create images to be loaded by U-Boot
413################################################################################
414# Without the objcopy, the uImage will be 10x bigger.
415$(KERNEL_UIMAGE): u-boot linux | $(BINARIES_PATH)
416	${AARCH64_CROSS_COMPILE}objcopy -O binary \
417					-R .note \
418					-R .comment \
419					-S $(LINUX_PATH)/vmlinux \
420					$(BINARIES_PATH)/linux.bin
421	$(MKIMAGE_PATH)/mkimage -A arm64 \
422				-O linux \
423				-T kernel \
424				-C none \
425				-a $(KERNEL_LOADADDR) \
426				-e $(KERNEL_ENTRY) \
427				-n "Linux kernel" \
428				-d $(BINARIES_PATH)/linux.bin $(KERNEL_UIMAGE)
429
430.PHONY: uImage
431uImage: $(KERNEL_UIMAGE)
432
433$(ROOTFS_UGZ): u-boot buildroot | $(BINARIES_PATH)
434	ln -sf $(ROOT)/out-br/images/rootfs.cpio.gz $(BINARIES_PATH)
435	$(MKIMAGE_PATH)/mkimage -A arm64 \
436				-T ramdisk \
437				-C gzip \
438				-a $(ROOTFS_LOADADDR) \
439				-e $(ROOTFS_ENTRY) \
440				-n "Root file system" \
441				-d $(ROOTFS_GZ) $(ROOTFS_UGZ)
442
443.PHONY: uRootfs
444uRootfs: $(ROOTFS_UGZ)
445
446################################################################################
447# XEN
448################################################################################
449
450XEN_CONFIGS = .config $(ROOT)/build/kconfigs/xen.conf
451ifeq ($(XEN_DEBUG),y)
452XEN_CONFIGS += $(ROOT)/build/kconfigs/xen_debug.conf
453endif
454
455ifneq ($(filter 1 2 3,$(SPMC_AT_EL)),)
456XEN_FFA = y
457endif
458
459$(XEN_PATH)/xen/.config:
460	$(MAKE) -C $(XEN_PATH)/xen XEN_TARGET_ARCH=arm64 defconfig
461	cd $(XEN_PATH)/xen && \
462	env XEN_TARGET_ARCH=arm64 tools/kconfig/merge_config.sh $(XEN_CONFIGS)
463
464xen-menuconfig:
465	$(MAKE) -C $(XEN_PATH)/xen XEN_TARGET_ARCH=arm64 menuconfig
466
467xen: $(XEN_PATH)/xen/.config
468	$(MAKE) -C $(XEN_PATH) dist-xen \
469	XEN_TARGET_ARCH=arm64 \
470	CONFIG_XEN_INSTALL_SUFFIX=.gz	\
471	CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)"
472
473xen-create-image: xen
474
475XEN_TMP = $(BINARIES_PATH)/xen_files
476
477$(XEN_TMP):
478	mkdir -p $@
479
480xen-create-image: linux buildroot | $(XEN_TMP)
481	cp $(KERNEL_IMAGE) $(XEN_TMP)
482	cp $(XEN_IMAGE) $(XEN_TMP)
483	cp $(XEN_CFG) $(XEN_TMP)
484	cp $(ROOT)/out-br/images/rootfs.cpio.gz $(XEN_TMP)
485	rm -f $(XEN_EXT4)
486	mke2fs -t ext4 -d $(XEN_TMP) $(XEN_EXT4) 100M
487
488
489################################################################################
490# Run targets
491################################################################################
492.PHONY: run
493# This target enforces updating root fs etc
494run: all
495	$(MAKE) run-only
496
497
498ifeq ($(XEN_BOOT),y)
499QEMU_VIRT	= true
500else ifeq ($(SPMC_AT_EL),2)
501QEMU_VIRT	= true
502else
503QEMU_VIRT	= false
504endif
505
506ifeq ($(XEN_BOOT),y)
507QEMU_MEM 	?= 3072
508QEMU_SMP	?= 4
509QEMU_XEN	?= -drive if=none,file=$(XEN_EXT4),format=raw,id=hd1 \
510		   -device virtio-blk-device,drive=hd1
511else
512QEMU_SMP 	?= 2
513QEMU_MEM 	?= 1057
514endif
515
516ifeq ($(XEN_BOOT),y)
517QEMU_SME	= off
518else ifeq ($(SPMC_AT_EL),n)
519QEMU_SME	= on
520else ifeq ($(SPMC_AT_EL),2)
521QEMU_SME	= on
522else
523QEMU_SME	= off
524endif
525QEMU_CPU	?= max,sme=$(QEMU_SME),pauth-impdef=on
526
527ifeq ($(MEMTAG),y)
528QEMU_MTE	= on
529else ifeq ($(SPMC_AT_EL),2)
530QEMU_MTE	= on
531else
532QEMU_MTE	= off
533endif
534
535QEMU_BASE_ARGS = -nographic
536QEMU_BASE_ARGS += -smp $(QEMU_SMP)
537QEMU_BASE_ARGS += -cpu $(QEMU_CPU)
538QEMU_BASE_ARGS += -d unimp -semihosting-config enable=on,target=native
539QEMU_BASE_ARGS += -m $(QEMU_MEM)
540QEMU_BASE_ARGS += -bios bl1.bin
541QEMU_BASE_ARGS += -initrd rootfs.cpio.gz
542QEMU_BASE_ARGS += -kernel Image
543QEMU_BASE_ARGS += -append 'console=ttyAMA0,38400 keep_bootcon root=/dev/vda2 $(QEMU_KERNEL_BOOTARGS)'
544QEMU_BASE_ARGS += $(QEMU_XEN)
545QEMU_BASE_ARGS += $(QEMU_EXTRA_ARGS)
546QEMU_BASE_ARGS += -machine virt,acpi=off,secure=on,mte=$(QEMU_MTE),gic-version=$(QEMU_GIC_VERSION),virtualization=$(QEMU_VIRT)
547
548ifeq ($(WITH_SCMI),y)
549QEMU_SCMI_ARGS 	= -dtb $(SCMI_DTB)
550
551$(SCMI_DTBO): $(SCMI_DTSO)
552	mkdir -p $(BINARIES_PATH)
553	dtc -I dts -O dtb -o $(SCMI_DTBO) $(SCMI_DTSO)
554
555$(SCMI_DTB): $(SCMI_DTBO) $(QEMU_BUILD)/.stamp_qemu linux arm-tf buildroot
556	ln -sf $(ROOT)/out-br/images/rootfs.cpio.gz $(BINARIES_PATH)/
557	cd $(BINARIES_PATH) && $(QEMU_BUILD)/aarch64-softmmu/qemu-system-aarch64 \
558		$(QEMU_BASE_ARGS) -machine dumpdtb=qemu_v8.dtb
559	cd $(BINARIES_PATH) && fdtoverlay -i qemu_v8.dtb -o $(SCMI_DTB) $(SCMI_DTBO)
560endif
561
562QEMU_RUN_ARGS = $(QEMU_BASE_ARGS) $(QEMU_SCMI_ARGS)
563QEMU_RUN_ARGS += $(QEMU_RUN_ARGS_COMMON)
564QEMU_RUN_ARGS += -s -S -serial tcp:127.0.0.1:$(QEMU_NW_PORT) -serial tcp:127.0.0.1:$(QEMU_SW_PORT)
565
566# The aarch64-softmmu part of the path to qemu-system-aarch64 was removed
567# somewhere between 8.1.2 and 9.1.2
568QEMU_BIN = $(or $(wildcard $(QEMU_BUILD)/qemu-system-aarch64),$(wildcard $(QEMU_BUILD)/aarch64-softmmu/qemu-system-aarch64),qemu-system-aarch64-not-found)
569
570.PHONY: run-only
571run-only:
572	ln -sf $(ROOT)/out-br/images/rootfs.cpio.gz $(BINARIES_PATH)/
573	$(call check-terminal)
574	$(call run-help)
575	$(call launch-terminal,$(QEMU_NW_PORT),"Normal World")
576	$(call launch-terminal,$(QEMU_SW_PORT),"Secure World")
577	$(call wait-for-ports,$(QEMU_NW_PORT),$(QEMU_SW_PORT))
578	cd $(BINARIES_PATH) && $(QEMU_BIN) $(QEMU_RUN_ARGS)
579
580ifneq ($(filter check check-rust,$(MAKECMDGOALS)),)
581CHECK_DEPS := all
582endif
583
584ifneq ($(TIMEOUT),)
585check-args := --timeout $(TIMEOUT)
586endif
587ifneq ($(CHECK_TESTS),)
588check-args += --tests $(CHECK_TESTS)
589endif
590ifneq ($(XTEST_ARGS),)
591check-args += --xtest-args "$(XTEST_ARGS)"
592endif
593
594QEMU_CHECK_ARGS = $(QEMU_BASE_ARGS) $(QEMU_SCMI_ARGS)
595QEMU_CHECK_ARGS += -serial mon:stdio -serial file:serial1.log
596ifeq ($(XEN_BOOT),y)
597QEMU_CHECK_ARGS += -fsdev local,id=fsdev0,path=../..,security_model=none -device virtio-9p-device,fsdev=fsdev0,mount_tag=host
598endif
599
600check: $(CHECK_DEPS)
601	ln -sf $(ROOT)/out-br/images/rootfs.cpio.gz $(BINARIES_PATH)/
602	cd $(BINARIES_PATH) && \
603		export QEMU=$(QEMU_BIN) && \
604		export QEMU_CHECK_ARGS="$(QEMU_CHECK_ARGS)" && \
605		export XEN_BOOT=$(XEN_BOOT) && \
606		export XEN_FFA=$(XEN_FFA) && \
607		export RUST_ENABLE=$(RUST_ENABLE) && \
608		expect $(ROOT)/build/qemu-check.exp -- $(check-args) || \
609		(if [ "$(DUMP_LOGS_ON_ERROR)" ]; then \
610			echo "== $$PWD/serial0.log:"; \
611			cat serial0.log; \
612			echo "== end of $$PWD/serial0.log:"; \
613			echo "== $$PWD/serial1.log:"; \
614			cat serial1.log; \
615			echo "== end of $$PWD/serial1.log:"; \
616		fi; false)
617
618check-only: check
619
620check-clean:
621	rm -f serial0.log serial1.log
622