1# Copyright (C) 2018 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# 15 16PROJECT_QEMU_INC_LOCAL_DIR := $(GET_LOCAL_DIR) 17 18ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 19PACKAGE_TRUSTY_IMAGES := true 20endif 21 22APPLOADER_ALLOW_NS_CONNECT := true 23 24# Include Secretkeeper TA 25SECRETKEEPER_ENABLED := true 26 27# All qemu-generic-arm64* builds default to SPMC_EL=3 28# while the arm32 builds use the SPD because both 29# Hafnium and EL3 SPMC only support AArch64. 30ifneq ($(filter generic-arm64%,$(QEMU_TRUSTY_PROJECT)),) 31SPMC_EL ?= 3 32endif 33 34ifneq ($(SPMC_EL),) 35LIB_SM_WITH_FFA_LOOP := true 36GENERIC_ARM64_DEBUG := FFA 37 38# Merge FIQ-IRQ to keep the FF-A implementation simpler 39ARM_MERGE_FIQ_IRQ := true 40 41# TF-A on qemu sets PLATFORM_CORE_COUNT=32 and requires that the 42# SP manifest specifies that exact number of execution contexts 43SMP_MAX_CPUS := 32 44SMP_CPU_CLUSTER_SHIFT := 4 45endif 46 47include project/$(QEMU_TRUSTY_PROJECT).mk 48 49# limit physical memory to 29 bits to make the mapping 50# as small as possible while covering the entire kernel plus 51# enough pages for the page tables for the initial mappings 52GLOBAL_DEFINES += MMU_IDENT_SIZE_SHIFT=29 53 54# Qemu statically built with glibc<2.29 uses a syscall to implement 55# clock_gettime instead of the VDSO, which makes the calls much slower 56APP_TIMERTEST_MAX_CLOCK_PERIOD := 2000 57 58# Derive RPMB key using HKDF 59WITH_HKDF_RPMB_KEY ?= true 60 61# Always allow provisioning for emulator builds 62STATIC_SYSTEM_STATE_FLAG_PROVISIONING_ALLOWED := 1 63 64# Emulator builds are unlocked by default. qemu-generic-arm32-test-debug 65# overrides this to ensure that we have at least one target that tests with app 66# loading locked. 67STATIC_SYSTEM_STATE_FLAG_APP_LOADING_UNLOCKED ?= 1 68 69MODULES += \ 70 trusty/user/app/storage/rpmb_dev \ 71 72RPMB_DEV := $(BUILDDIR)/host_tools/rpmb_dev 73 74# Enable unittests that should only run in the emulator 75STORAGE_UNITTEST_ON_EMULATOR := true 76 77PROJECT_KEYS_DIR := $(PROJECT_QEMU_INC_LOCAL_DIR)/keys 78 79APPLOADER_SIGN_PRIVATE_KEY_0_FILE := \ 80 $(PROJECT_KEYS_DIR)/apploader_sign_test_private_key_0.der 81 82APPLOADER_SIGN_PUBLIC_KEY_0_FILE := \ 83 $(PROJECT_KEYS_DIR)/apploader_sign_test_public_key_0.der 84 85APPLOADER_SIGN_PRIVATE_KEY_1_FILE := \ 86 $(PROJECT_KEYS_DIR)/apploader_sign_test_private_key_1.der 87 88APPLOADER_SIGN_PUBLIC_KEY_1_FILE := \ 89 $(PROJECT_KEYS_DIR)/apploader_sign_test_public_key_1.der 90 91# Key ID 1 should only be allowed if SYSTEM_STATE_FLAG_APP_LOADING_UNLOCKED is 92# true 93APPLOADER_SIGN_KEY_1_UNLOCKED_ONLY := true 94 95# The default signing key is key 0, but each application 96# can specify a different key identifier 97APPLOADER_SIGN_KEY_ID ?= 0 98 99# Treat key slot 1 as a dev key by default. In tests this key is only expected 100# to be enabled if SYSTEM_STATE_FLAG_APP_LOADING_UNLOCKED is true. 101APPLOADER_SIGN_UNLOCKED_KEY_ID ?= 1 102 103APPLOADER_ENCRYPT_KEY_0_FILE := \ 104 $(PROJECT_KEYS_DIR)/apploader_encrypt_test_key_0.bin 105 106LK_BIN := $(BUILDDIR)/lk.bin 107 108EXTRA_BUILDRULES += external/trusty/bootloader/test-runner/test-runner-inc.mk 109TEST_RUNNER_BIN := $(BUILDDIR)/test-runner/external/trusty/bootloader/test-runner/test-runner.bin 110 111ifeq (true,$(call TOBOOL,$(HAFNIUM))) 112HAFNIUM_PLATFORM := secure_qemu_aarch64 113include external/hafnium/rules.mk 114BL32_BIN := $(HAFNIUM_BIN) 115else 116BL32_BIN := $(LK_BIN) 117endif 118 119ATF_DEBUG := 1 120ATF_PLAT := qemu 121ATF_WITH_TRUSTY_GENERIC_SERVICES := true 122ATF_BUILD_BASE := $(abspath $(BUILDDIR)/atf) 123ATF_TOOLCHAIN_PREFIX := $(ARCH_arm64_TOOLCHAIN_PREFIX) 124ATF_ROOT := $(call FIND_EXTERNAL,arm-trusted-firmware) 125include project/qemu-atf-inc.mk 126 127# Try using the qemu from the prebuilts 128QEMU_BUILD_BASE := $(abspath $(BUILDDIR)/qemu-build) 129QEMU_ARCH := aarch64 130QEMU_PREBUILTS_DIR ?= prebuilts/android-emulator/trusty-x86_64 131QEMU_PREBUILTS := $(wildcard $(QEMU_PREBUILTS_DIR)) 132 133ifeq (,$(QEMU_PREBUILTS)) 134# No prebuilts, build qemu from source 135QEMU_ROOT := $(call FIND_EXTERNAL,qemu) 136QEMU_TARGET := aarch64-softmmu,arm-softmmu 137include project/qemu-qemu-inc.mk 138else 139# We have prebuilts, copy them into the build directory 140QEMU_BIN := $(QEMU_BUILD_BASE)/bin/qemu-system-$(QEMU_ARCH) 141 142# The qemu prebuilts now contain an Android.bp file. 143# We do not want it in the build directory because Soong reads it. 144$(QEMU_BUILD_BASE): $(QEMU_PREBUILTS) 145 @echo creating qemu output directory 146 @rm -rf $@ 147 @cp -r $< $@ 148 @rm -f $@/Android.bp 149 150# The binary is inside the build directory, so create 151# an empty dependency between them 152$(QEMU_BIN): $(QEMU_BUILD_BASE) 153 @echo creating qemu binary 154 155EXTRA_BUILDDEPS += $(QEMU_BUILD_BASE) $(QEMU_BIN) 156endif 157 158ifneq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 159LINUX_ARCH ?= arm64 160include project/linux-inc.mk 161endif 162 163RUN_SCRIPT := $(BUILDDIR)/run 164STOP_SCRIPT := $(BUILDDIR)/stop 165ALLOC_ADB_PORTS_PY := $(BUILDDIR)/alloc_adb_ports.py 166HOST_COMMANDS_OUT_DIR := $(BUILDDIR)/host_commands 167QEMU_PY := $(BUILDDIR)/qemu.py 168QEMU_ERROR_PY := $(BUILDDIR)/qemu_error.py 169QEMU_OPTIONS_PY := $(BUILDDIR)/qemu_options.py 170QEMU_LLDB_SUPPORT_PY := $(BUILDDIR)/lldb_support.py 171QEMU_LLDBINIT := $(BUILDDIR)/lldbinit 172PY3_CMD := $(BUILDDIR)/py3-cmd 173RUN_PY := $(BUILDDIR)/run.py 174 175$(ATF_OUT_DIR): 176 mkdir -p $@ 177 178# ATF built binaries 179ATF_BIN := $(ATF_OUT_DIR)/bl31.bin 180ATF_EXTRA_BINS += \ 181 $(ATF_OUT_DIR)/bl1.bin \ 182 $(ATF_OUT_DIR)/bl2.bin \ 183 184# For ATF bootloader semihosting calls, bl32 and bl33 need to be in place 185ATF_SYMLINKS := \ 186 $(ATF_OUT_DIR)/bl32.bin \ 187 $(ATF_OUT_DIR)/bl33.bin \ 188 $(EXTRA_ATF_SYMLINKS) \ 189 190$(ATF_OUT_DIR)/bl32.bin: BUILDDIR := $(BUILDDIR) 191$(ATF_OUT_DIR)/bl32.bin: ATF_OUT_DIR := $(ATF_OUT_DIR) 192$(ATF_OUT_DIR)/bl32.bin: $(BL32_BIN) $(ATF_OUT_DIR) 193 $(NOECHO)ln -rsf $< $@ 194 195$(ATF_OUT_DIR)/bl33.bin: BUILDDIR := $(BUILDDIR) 196$(ATF_OUT_DIR)/bl33.bin: ATF_OUT_DIR := $(ATF_OUT_DIR) 197$(ATF_OUT_DIR)/bl33.bin: $(TEST_RUNNER_BIN) $(ATF_OUT_DIR) 198 $(NOECHO)ln -rsf $< $@ 199 200ATF_GENERATED_FILES := \ 201 $(ATF_OUT_DIR)/RPMB_DATA \ 202 $(ATF_OUT_DIR)/metadata.img \ 203 204$(ATF_OUT_DIR)/RPMB_DATA: ATF_OUT_DIR := $(ATF_OUT_DIR) 205$(ATF_OUT_DIR)/RPMB_DATA: $(RPMB_DEV) 206 @echo Initialize rpmb device 207 $< --dev $(ATF_OUT_DIR)/RPMB_DATA --init --size 2048 208 209ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 210ANDROID_OUT_SRC_DIR := 211ANDROID_OUT_SRC_FILES := 212else 213ifneq (,$(ANDROID_BUILD_TOP)) 214# We are building Trusty inside an Android environment, 215# which means we can use a fresh Android build instead of prebuilts 216ANDROID_OUT_SRC_DIR := $(ANDROID_BUILD_TOP) 217else 218ANDROID_OUT_SRC_DIR := trusty/prebuilts/aosp/android 219endif 220ANDROID_OUT_SRC_FILES := $(addprefix $(ANDROID_OUT_SRC_DIR)/,$(ANDROID_OUT_FILES)) 221endif 222 223MKE2FS ?= $(ANDROID_OUT_SRC_DIR)/out/host/linux-x86/bin/mke2fs 224$(ATF_OUT_DIR)/metadata.img: MKE2FS := $(MKE2FS) 225$(ATF_OUT_DIR)/metadata.img: 226 @echo Create metadata.img 227 MKE2FS_CONFIG= $(MKE2FS) -t ext4 -F $@ -O has_journal,extent,huge_file,dir_nlink,extra_isize,uninit_bg 16m 228 229QEMU_SCRIPTS := \ 230 $(ALLOC_ADB_PORTS_PY) \ 231 $(HOST_COMMANDS_OUT_DIR) \ 232 $(QEMU_PY) \ 233 $(QEMU_ERROR_PY) \ 234 $(QEMU_OPTIONS_PY) \ 235 $(QEMU_LLDB_SUPPORT_PY) \ 236 $(QEMU_LLDBINIT) \ 237 $(RUN_PY) \ 238 239$(QEMU_SCRIPTS): .PHONY 240EXTRA_BUILDDEPS += $(QEMU_SCRIPTS) 241 242# Copied so that the resulting build tree contains all files needed to run 243$(ALLOC_ADB_PORTS_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/alloc_adb_ports.py 244 @echo copying $@ 245 @cp $< $@ 246 247# Copied so that the resulting build tree contains all files needed to run 248$(HOST_COMMANDS_OUT_DIR): $(PROJECT_QEMU_INC_LOCAL_DIR)/host_commands 249 @echo copying $@ 250 @rm -rf $@ 251 @cp -a $< $@ 252 253# Copied so that the resulting build tree contains all files needed to run 254$(QEMU_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/qemu.py 255 @echo copying $@ 256 @cp $< $@ 257 258# Copied so that the resulting build tree contains all files needed to run 259$(QEMU_ERROR_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/qemu_error.py 260 @echo copying $@ 261 @cp $< $@ 262 263# Script used to generate qemu architecture options. Need to specify qemu 264# options file name since different projects use different python script 265$(QEMU_OPTIONS_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/qemu_arm64_options.py 266 @echo copying $@ 267 @cp $< $@ 268 269# Script used in LLDB for setting breakpoints adjusted for KASLR and ASLR 270$(QEMU_LLDB_SUPPORT_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/lldb_support.py 271 @echo copying $@ 272 @cp $< $@ 273 274# Companion script to lldb_support.py that contains LLDB commands 275$(QEMU_LLDBINIT): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/lldbinit 276 @echo copying $@ 277 @cp $< $@ 278 279# Python version of the run shell script which can be imported by other Python 280# scripts for more granular control over how tests share emulator instances. 281# It serves as a wrapper around qemu.py which defaults the config. 282$(RUN_PY): $(PROJECT_QEMU_INC_LOCAL_DIR)/qemu/run.py 283 @echo copying $@ 284 @cp $< $@ 285 286# Copy prebuilt hermetic Python 3 command into the build directory so that the 287# build does not rely on the host having Python 3 installed. Hermetic python 3 288# contains the standard library so this is all we need to run the qemu scripts 289$(PY3_CMD): $(BUILDTOOLS_BINDIR)/py3-cmd 290 @echo copying $@ 291 @$(MKDIR) 292 @cp $< $@ 293 294EXTRA_BUILDDEPS += $(PY3_CMD) 295 296# List of files we need from Android 297ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 298ANDROID_OUT_FILES := 299 300else 301ANDROID_OUT_FILES := \ 302 out/host/linux-x86/bin/adb \ 303 out/host/linux-x86/bin/mke2fs \ 304 out/target/product/trusty/ramdisk.img \ 305 out/target/product/trusty/system.img \ 306 out/target/product/trusty/vendor.img \ 307 out/target/product/trusty/userdata.img \ 308 out/target/product/trusty/data/nativetest64 \ 309 310endif 311# Copy Android prebuilts into the build directory so that the build does not 312# depend on any files in the source tree. We want to package the build artifacts 313# without any dependencies on the sources. 314# Because files in the prebuilts directory are not writeable the directory must 315# be cleared before copying in the fresh content. `rm -rf` is used to accomplish 316# this because it bypasses writing un-writeable files in addition to bringing 317# the target directory to the same state as with a clean build. 318ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 319ANDROID_OUT_BUILD_DIR := 320 321else 322ANDROID_OUT_BUILD_DIR := $(BUILDDIR)/aosp/android 323 324endif 325 326ANDROID_OUT_IMAGE_DIR := $(ANDROID_OUT_BUILD_DIR)/out/target/product/trusty 327ANDROID_OUT_ADB_PATH := $(ANDROID_OUT_BUILD_DIR)/out/host/linux-x86/bin/adb 328 329# Copy the files listed in ANDROID_OUT_FILES from ANDROID_OUT_SRC_DIR into 330# ANDROID_OUT_BUILD_DIR preserving the directory structure relative to the 331# top-level ANDROID_OUT_SRC_DIR directory 332$(ANDROID_OUT_BUILD_DIR): ANDROID_OUT_SRC_DIR := $(ANDROID_OUT_SRC_DIR) 333$(ANDROID_OUT_BUILD_DIR): ANDROID_OUT_IMAGE_DIR := $(ANDROID_OUT_IMAGE_DIR) 334$(ANDROID_OUT_BUILD_DIR): ANDROID_OUT_FILES := $(ANDROID_OUT_FILES) 335$(ANDROID_OUT_BUILD_DIR): LINUX_RAMDISK_IMAGE := $(LINUX_RAMDISK_IMAGE) 336$(ANDROID_OUT_BUILD_DIR): RAMDISK_CP := $(if $(LINUX_RAMDISK_IMAGE),cp,/bin/true) 337$(ANDROID_OUT_BUILD_DIR): $(ANDROID_OUT_SRC_FILES) $(LINUX_RAMDISK_IMAGE) 338 @echo creating Android output directory 339 @rm -rf $@ 340 @mkdir -p $@ 341 @cd $(ANDROID_OUT_SRC_DIR) && cp -r --parents -t $@ $(ANDROID_OUT_FILES) 342 @$(RAMDISK_CP) $(LINUX_RAMDISK_IMAGE) $(ANDROID_OUT_IMAGE_DIR)/ramdisk.img 343 344EXTRA_BUILDDEPS += $(ANDROID_OUT_BUILD_DIR) 345 346ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES_ONLY))) 347QEMU_CONFIG := 348 349else 350QEMU_CONFIG := $(BUILDDIR)/config.json 351 352endif 353 354# Save variables to a json file to export paths known to the build system to 355# the test system 356$(QEMU_CONFIG): QEMU_BIN := $(subst $(BUILDDIR)/,,$(QEMU_BIN)) 357$(QEMU_CONFIG): EXTRA_QEMU_FLAGS := ["-machine", "gic-version=$(GIC_VERSION)"] 358$(QEMU_CONFIG): ATF_OUT_DIR := $(subst $(BUILDDIR)/,,$(ATF_OUT_DIR)) 359$(QEMU_CONFIG): LINUX_BUILD_DIR := $(subst $(BUILDDIR)/,,$(LINUX_BUILD_DIR)) 360$(QEMU_CONFIG): LINUX_ARCH := $(LINUX_ARCH) 361$(QEMU_CONFIG): ANDROID_OUT_IMAGE_DIR := $(subst $(BUILDDIR)/,,$(ANDROID_OUT_IMAGE_DIR)) 362$(QEMU_CONFIG): ANDROID_OUT_ADB_PATH := $(subst $(BUILDDIR)/,,$(ANDROID_OUT_ADB_PATH)) 363$(QEMU_CONFIG): RPMB_DEV := $(subst $(BUILDDIR)/,,$(RPMB_DEV)) 364$(QEMU_CONFIG): $(ATF_OUT_COPIED_FILES) $(ATF_SYMLINKS) $(ATF_GENERATED_FILES) 365 @echo generating $@ 366 @echo '{ "linux": "$(LINUX_BUILD_DIR)",' > $@ 367 @echo ' "linux_arch": "$(LINUX_ARCH)",' >> $@ 368 @echo ' "initrd": "$(ANDROID_OUT_IMAGE_DIR)/ramdisk.img",' >> $@ 369 @echo ' "atf": "$(ATF_OUT_DIR)", ' >> $@ 370 @echo ' "qemu": "$(QEMU_BIN)", ' >> $@ 371 @echo ' "extra_qemu_flags": $(EXTRA_QEMU_FLAGS), ' >> $@ 372 @echo ' "android_image_dir": "$(ANDROID_OUT_IMAGE_DIR)", ' >> $@ 373 @echo ' "adb": "$(ANDROID_OUT_ADB_PATH)", ' >> $@ 374 @echo ' "rpmbd": "$(RPMB_DEV)", ' >> $@ 375 @echo ' "arch": "$(ARCH)" }' >> $@ 376 377EXTRA_BUILDDEPS += $(QEMU_CONFIG) 378 379# The original run shell script was replaced by run.py. Create symlink to 380# preserve backwards compatibility. 381$(RUN_SCRIPT): $(RUN_PY) 382 @echo creating $@ 383 @ln -sf $(abspath $<) $@ 384 385EXTRA_BUILDDEPS += $(RUN_SCRIPT) 386 387# Create a script to stop all stale emulators. 388$(STOP_SCRIPT): 389 @echo generating $@ 390 @echo "#!/bin/sh" >$@ 391 @echo 'killall qemu-system-aarch64' >>$@ 392 @chmod +x $@ 393 394EXTRA_BUILDDEPS += $(STOP_SCRIPT) 395 396ifeq (true,$(call TOBOOL,$(PACKAGE_QEMU_TRUSTY))) 397 398# Files & directories to copy into QEMU package archive 399QEMU_PACKAGE_FILES := \ 400 $(OUTBIN) $(QEMU_SCRIPTS) $(PY3_CMD) $(QEMU_CONFIG) $(RPMB_DEV) \ 401 $(RUN_SCRIPT) $(STOP_SCRIPT) \ 402 $(QEMU_BIN) $(ATF_BIN) $(ATF_SYMLINKS) \ 403 $(ATF_GENERATED_FILES) \ 404 $(ATF_OUT_COPIED_FILES) \ 405 $(LINUX_IMAGE) \ 406 407ifneq (true,$(call TOBOOL,$(PACKAGE_QEMU_WITHOUT_ANDROID))) 408# The Android prebuilts are pretty large and not all users need them 409QEMU_PACKAGE_FILES += $(ANDROID_OUT_BUILD_DIR) 410endif 411 412# Other files/directories that should be included in the package but which are 413# not make targets and therefore cannot be pre-requisites. The target that 414# creates these files must be in the QEMU_PACKAGE_FILES variable. 415QEMU_PACKAGE_EXTRA_FILES := \ 416 $(LINUX_BUILD_DIR)/scripts \ 417 $(QEMU_BUILD_BASE) $(ATF_EXTRA_BINS) \ 418 419QEMU_PACKAGE_ARCHIVE := $(BUILDDIR)/trusty_qemu_package.zip 420 421include project/qemu-package-inc.mk 422endif 423 424ifeq (true,$(call TOBOOL,$(PACKAGE_TRUSTY_IMAGES))) 425 426# Files & directories to copy into Trusty image archive for use with QEMU 427# emulator. This does not include the QEMU emulator itself, which is located in 428# prebuilts/android-emulator/trusty-x86_64/ and part of the trusty qemu device 429# host package built in AOSP. 430QEMU_PACKAGE_FILES := \ 431 $(OUTBIN) $(QEMU_SCRIPTS) $(PY3_CMD) \ 432 $(STOP_SCRIPT) \ 433 $(ATF_BIN) $(ATF_SYMLINKS) $(TEST_RUNNER_BIN) \ 434 $(ATF_GENERATED_FILES) \ 435 $(ATF_OUT_COPIED_FILES) \ 436 437# Other files/directories that should be included in the package but which are 438# not make targets and therefore cannot be pre-requisites. The target that 439# creates these files must be in the QEMU_PACKAGE_FILES variable. 440QEMU_PACKAGE_EXTRA_FILES := \ 441 $(ATF_EXTRA_BINS) \ 442 443QEMU_PACKAGE_ARCHIVE := $(BUILDDIR)/trusty_image_package.tar.gz 444 445include project/qemu-package-inc.mk 446endif 447 448ANDROID_OUT_FILES := 449ANDROID_OUT_BUILD_DIR := 450ANDROID_OUT_SRC_DIR := 451ANDROID_OUT_SRC_FILES := 452ATF_BIN := 453ATF_BUILD_BASE := 454ATF_EXTRA_BINS := 455ATF_OUT_COPIED_FILES := 456ATF_OUT_DIR := 457ATF_RELATIVE_TO_BUILD_BASE := 458ATF_SYMLINKS := 459EXTRA_ATF_SYMLINKS := 460HAFNIUM_BIN := 461LINUX_ARCH := 462LINUX_BUILD_DIR := 463LINUX_IMAGE := 464LINUX_RAMDISK_IMAGE := 465RUN_SCRIPT := 466TEST_RUNNER_BIN := 467QEMU_BIN := 468QEMU_BUILD_BASE := 469QEMU_CONFIG := 470QEMU_ERROR_PY := 471QEMU_OPTIONS_PY := 472QEMU_LLDB_SUPPORT_PY := 473QEMU_LLDBINIT := 474QEMU_PREBUILTS := 475QEMU_PY := 476QEMU_SCRIPTS := 477PY3_CMD := 478RUN_PY := 479