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