blob: f2a39e9afd0bd9ec233f6072de2d3284e5411ff0 [file] [log] [blame]
Paul Beesleyf3653a62019-05-22 11:22:44 +01001QEMU virt Armv8-A
2=================
Douglas Raillardd7c21b72017-06-28 15:23:03 +01003
Dan Handley610e7e12018-03-01 18:44:00 +00004Trusted Firmware-A (TF-A) implements the EL3 firmware layer for QEMU virt
5Armv8-A. BL1 is used as the BootROM, supplied with the -bios argument.
Douglas Raillardd7c21b72017-06-28 15:23:03 +01006When QEMU starts all CPUs are released simultaneously, BL1 selects a
7primary CPU to handle the boot and the secondaries are placed in a polling
8loop to be released by normal world via PSCI.
9
10BL2 edits the Flattened Device Tree, FDT, generated by QEMU at run-time to
11add a node describing PSCI and also enable methods for the CPUs.
12
Andrew Walbran9c4d0692020-01-15 14:11:31 +000013If ``ARM_LINUX_KERNEL_AS_BL33`` is set to 1 then this FDT will be passed to BL33
14via register x0, as expected by a Linux kernel. This allows a Linux kernel image
15to be booted directly as BL33 rather than using a bootloader.
16
Masahiro Yamada894a38d2019-12-26 13:26:49 +090017An ARM64 defconfig v5.5 Linux kernel is known to boot, FDT doesn't need to be
Douglas Raillardd7c21b72017-06-28 15:23:03 +010018provided as it's generated by QEMU.
19
20Current limitations:
21
22- Only cold boot is supported
Douglas Raillardd7c21b72017-06-28 15:23:03 +010023
Masahiro Yamadac88f22a2020-07-04 16:12:55 +090024Getting non-TF images
25---------------------
26
27``QEMU_EFI.fd`` can be downloaded from
Masahiro Yamada894a38d2019-12-26 13:26:49 +090028http://snapshots.linaro.org/components/kernel/leg-virt-tianocore-edk2-upstream/latest/QEMU-KERNEL-AARCH64/RELEASE_GCC5/QEMU_EFI.fd
Douglas Raillardd7c21b72017-06-28 15:23:03 +010029
Masahiro Yamadac88f22a2020-07-04 16:12:55 +090030or, can be built as follows:
31
32.. code:: shell
33
34 git clone https://github.com/tianocore/edk2.git
35 cd edk2
36 git submodule update --init
37 make -C BaseTools
38 source edksetup.sh
39 export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-
40 build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemuKernel.dsc
41
42````
43
44Then, you will get ``Build/ArmVirtQemuKernel-AARCH64/DEBUG_GCC5/FV/QEMU_EFI.fd``
45
46Please note you do not need to use GCC 5 in spite of the environment variable
Harrison Mutaiac31bfd2023-02-06 17:54:54 +000047``GCC5_AARCH64_PREFIX``.
Masahiro Yamadac88f22a2020-07-04 16:12:55 +090048
49The rootfs can be built by using Buildroot as follows:
50
51.. code:: shell
52
53 git clone git://git.buildroot.net/buildroot.git
54 cd buildroot
55 make qemu_aarch64_virt_defconfig
56 utils/config -e BR2_TARGET_ROOTFS_CPIO
57 utils/config -e BR2_TARGET_ROOTFS_CPIO_GZIP
58 make olddefconfig
59 make
60
61Then, you will get ``output/images/rootfs.cpio.gz``.
62
Sumit Garg8aeb8792019-11-15 20:16:58 +053063Booting via semi-hosting option
64-------------------------------
65
Douglas Raillardd7c21b72017-06-28 15:23:03 +010066Boot binaries, except BL1, are primarily loaded via semi-hosting so all
67binaries has to reside in the same directory as QEMU is started from. This
68is conveniently achieved with symlinks the local names as:
69
70- ``bl2.bin`` -> BL2
71- ``bl31.bin`` -> BL31
72- ``bl33.bin`` -> BL33 (``QEMU_EFI.fd``)
Masahiro Yamada894a38d2019-12-26 13:26:49 +090073- ``Image`` -> linux/arch/arm64/boot/Image
Douglas Raillardd7c21b72017-06-28 15:23:03 +010074
75To build:
76
Paul Beesley493e3492019-03-13 15:11:04 +000077.. code:: shell
Douglas Raillardd7c21b72017-06-28 15:23:03 +010078
Paul Beesleyf3653a62019-05-22 11:22:44 +010079 make CROSS_COMPILE=aarch64-none-elf- PLAT=qemu
Douglas Raillardd7c21b72017-06-28 15:23:03 +010080
Masahiro Yamada79ecdd22020-07-04 17:15:44 +090081To start (QEMU v5.0.0):
Douglas Raillardd7c21b72017-06-28 15:23:03 +010082
Paul Beesley493e3492019-03-13 15:11:04 +000083.. code:: shell
Douglas Raillardd7c21b72017-06-28 15:23:03 +010084
85 qemu-system-aarch64 -nographic -machine virt,secure=on -cpu cortex-a57 \
86 -kernel Image \
Masahiro Yamada1eae7242020-07-04 17:10:25 +090087 -append "console=ttyAMA0,38400 keep_bootcon" \
Masahiro Yamadac88f22a2020-07-04 16:12:55 +090088 -initrd rootfs.cpio.gz -smp 2 -m 1024 -bios bl1.bin \
Douglas Raillardd7c21b72017-06-28 15:23:03 +010089 -d unimp -semihosting-config enable,target=native
Sumit Garg8aeb8792019-11-15 20:16:58 +053090
Harrison Mutaiac31bfd2023-02-06 17:54:54 +000091Booting via flash based firmware
92--------------------------------
Sumit Garg8aeb8792019-11-15 20:16:58 +053093
Harrison Mutaiac31bfd2023-02-06 17:54:54 +000094An alternate approach to deploy a full system stack on QEMU is to load the
95firmware via a secure flash device. This involves concatenating ``bl1.bin`` and
96``fip.bin`` to create a boot ROM that is flashed onto secure FLASH0 with the
97``-bios`` option.
Sumit Garg8aeb8792019-11-15 20:16:58 +053098
Harrison Mutaiac31bfd2023-02-06 17:54:54 +000099For example, to test the following firmware stack:
100
101
102- BL32 - ``bl32.bin`` -> ``tee-header_v2.bin``
103- BL32 Extra1 - ``bl32_extra1.bin`` -> ``tee-pager_v2.bin``
104- BL32 Extra2 - ``bl32_extra2.bin`` -> ``tee-pageable_v2.bin``
105- BL33 - ``bl33.bin`` -> ``QEMU_EFI.fd`` (EDK II)
Sumit Garg8aeb8792019-11-15 20:16:58 +0530106- ``Image`` -> linux/arch/arm64/boot/Image
107
Sumit Garg8aeb8792019-11-15 20:16:58 +0530108
Harrison Mutaiac31bfd2023-02-06 17:54:54 +00001091. Compile TF-A
Sumit Garg8aeb8792019-11-15 20:16:58 +0530110
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000111 .. code:: shell
Sumit Garg8aeb8792019-11-15 20:16:58 +0530112
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000113 make CROSS_COMPILE=aarch64-linux-gnu- PLAT=qemu BL32=bl32.bin \
114 BL32_EXTRA1=bl32_extra1.bin BL32_EXTRA2=bl32_extra2.bin \
115 BL33=bl33.bin BL32_RAM_LOCATION=tdram SPD=opteed all fip
Sumit Garg8aeb8792019-11-15 20:16:58 +0530116
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000117 Or, alternatively, to build with TBBR enabled, as well as, BL31 and BL32 encrypted with
118 test key:
Sumit Garg8aeb8792019-11-15 20:16:58 +0530119
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000120 .. code:: shell
Sumit Garg8aeb8792019-11-15 20:16:58 +0530121
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000122 make CROSS_COMPILE=aarch64-linux-gnu- PLAT=qemu BL32=bl32.bin \
123 BL32_EXTRA1=bl32_extra1.bin BL32_EXTRA2=bl32_extra2.bin \
124 BL33=bl33.bin BL32_RAM_LOCATION=tdram SPD=opteed all fip \
125 MBEDTLS_DIR=<path-to-mbedtls-repo> TRUSTED_BOARD_BOOT=1 \
126 GENERATE_COT=1 DECRYPTION_SUPPORT=aes_gcm FW_ENC_STATUS=0 \
127 ENCRYPT_BL31=1 ENCRYPT_BL32=1
Sumit Garg8aeb8792019-11-15 20:16:58 +0530128
Harrison Mutaiac31bfd2023-02-06 17:54:54 +00001292. Concatenate ``bl1.bin`` and ``fip.bin`` to create the boot ROM
Sumit Garg8aeb8792019-11-15 20:16:58 +0530130
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000131 .. code:: shell
Sumit Garg8aeb8792019-11-15 20:16:58 +0530132
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000133 dd if=build/qemu/release/bl1.bin of=flash.bin bs=4096 conv=notrunc
134 dd if=build/qemu/release/fip.bin of=flash.bin seek=64 bs=4096 conv=notrunc
Sumit Garg8aeb8792019-11-15 20:16:58 +0530135
Harrison Mutaiac31bfd2023-02-06 17:54:54 +00001363. Launch QEMU
Sumit Garg8aeb8792019-11-15 20:16:58 +0530137
Harrison Mutaiac31bfd2023-02-06 17:54:54 +0000138 .. code:: shell
139
140 qemu-system-aarch64 -nographic -machine virt,secure=on
141 -cpu cortex-a57 -kernel Image \
142 -append 'console=ttyAMA0,38400 keep_bootcon' \
143 -initrd rootfs.cpio.gz -smp 2 -m 1024 -bios flash.bin \
144 -d unimp
145
146The ``-bios`` option abstracts the loading of raw bare metal binaries into flash
147or ROM memory. QEMU loads the binary into the region corresponding to
148the hardware's entrypoint, from which the binary is executed upon a platform
149"reset". In addition to this, it places the information about the kernel
150provided with option ``-kernel``, and the RamDisk provided with ``-initrd``,
151into the firmware configuration ``fw_cfg``. In this setup, EDK II is responsible
152for extracting and launching these from ``fw_cfg``.
153
154.. note::
155 QEMU may be launched with or without ACPI (``-acpi``/``-no-acpi``). In
156 either case, ensure that the kernel build options are aligned with the
157 parameters passed to QEMU.
Harrison Mutai6c231502022-11-15 18:28:18 +0000158
159Running QEMU in OpenCI
160-----------------------
161
162Linaro's continuous integration platform OpenCI supports running emulated tests
163on QEMU. The tests are kicked off on Jenkins and deployed through the Linaro
164Automation and Validation Architecture `LAVA`_.
165
166There are a set of Linux boot tests provided in OpenCI. They rely on prebuilt
167`binaries`_ for UEFI, the kernel, root file system, as well as, any other TF-A
168dependencies, and are run as part of the OpenCI TF-A `daily job`_. To run them
169manually, a `builder`_ job may be triggered with the test configuration
170``qemu-boot-tests``.
171
172
173You may see the following warning repeated several times in the boot logs:
174
175.. code:: shell
176
177 pflash_write: Write to buffer emulation is flawed
178
179Please ignore this as it is an unresolved `issue in QEMU`_, it is an internal
180QEMU warning that logs flawed use of "write to buffer".
181
182.. note::
183 For more information on how to trigger jobs in OpenCI, please refer to
184 Linaro's CI documentation, which explains how to trigger a `manual job`_.
185
186.. _binaries: https://downloads.trustedfirmware.org/tf-a/linux_boot/
187.. _daily job: https://ci.trustedfirmware.org/view/TF-A/job/tf-a-main/
188.. _builder: https://ci.trustedfirmware.org/view/TF-A/job/tf-a-builder/
189.. _LAVA: https://tf.validation.linaro.org/
190.. _manual job: https://tf-ci-users-guide.readthedocs.io/en/latest/#manual-job-trigger
191.. _issue in QEMU: https://git.qemu.org/?p=qemu.git;a=blob;f=hw/block/pflash_cfi01.c;h=0cbc2fb4cbf62c9a033b8dd89012374ff74ed610;hb=refs/heads/master#l500