1 .. SPDX-License-Identifier: GPL-2.0+
7 QEMU for ARM supports a special 'virt' machine designed for emulation and
8 virtualization purposes. This document describes how to run U-Boot under it.
9 Both 32-bit ARM and AArch64 are supported.
11 The 'virt' platform provides the following as the basic functionality:
13 - A freely configurable amount of CPU cores
14 - U-Boot loaded and executing in the emulated flash at address 0x0
15 - A generated device tree blob placed at the start of RAM
16 - A freely configurable amount of RAM, described by the DTB
17 - A PL011 serial port, discoverable via the DTB
18 - An ARMv7/ARMv8 architected timer
19 - PSCI for rebooting the system
20 - A generic ECAM-based PCI host controller, discoverable via the DTB
22 Additionally, a number of optional peripherals can be added to the PCI bus.
24 See :doc:`../../develop/devicetree/dt_qemu` for information on how to see
25 the devicetree actually generated by QEMU.
29 Set the CROSS_COMPILE environment variable as usual, and run:
33 make qemu_arm_defconfig
38 make qemu_arm64_defconfig
43 The minimal QEMU command line to get U-Boot up and running is:
47 qemu-system-arm -machine virt -nographic -bios u-boot.bin
51 qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin
53 Note that for some odd reason qemu-system-aarch64 needs to be explicitly
54 told to use a 64-bit CPU or it will boot in 32-bit mode. The -nographic argument
55 ensures that output appears on the terminal. Use Ctrl-A X to quit.
57 Additional persistent U-Boot environment support can be added as follows:
59 - Create envstore.img using qemu-img::
61 qemu-img create -f raw envstore.img 64M
63 - Add a pflash drive parameter to the command line::
65 -drive if=pflash,format=raw,index=1,file=envstore.img
67 Additional peripherals that have been tested to work in both U-Boot and Linux
68 can be enabled with the following command line parameters:
70 - To add a video console, remove "-nographic" and add e.g.::
72 -serial stdio -device VGA
74 - To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
76 -drive if=none,file=disk.img,format=raw,id=mydisk \
77 -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
79 - To add an Intel E1000 network adapter, pass e.g.::
81 -netdev user,id=net0 -device e1000,netdev=net0
83 - To add an EHCI-compliant USB host controller, pass e.g.::
85 -device usb-ehci,id=ehci
87 - To add a USB keyboard attached to an emulated xHCI controller, pass e.g.::
89 -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0
91 - To add an NVMe disk, pass e.g.::
93 -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
95 - To add a random number generator, pass e.g.::
97 -device virtio-rng-pci
99 These have been tested in QEMU 2.9.0 but should work in at least 2.5.0 as well.
104 It is possible to install and boot a standard Linux distribution using
105 qemu_arm64 by setting up a root disk::
107 qemu-img create root.img 20G
109 then using the installer to install. For example, with Debian 12::
111 qemu-system-aarch64 \
112 -machine virt -cpu cortex-a53 -m 4G -smp 4 \
114 -serial stdio -device VGA \
115 -nic user,model=virtio-net-pci \
116 -device virtio-rng-pci \
117 -device qemu-xhci,id=xhci \
118 -device usb-kbd -device usb-tablet \
119 -drive if=virtio,file=debian-12.0.0-arm64-netinst.iso,format=raw,readonly=on,media=cdrom \
120 -drive if=virtio,file=root.img,format=raw,media=disk
122 The output will be something like this::
124 U-Boot 2023.10-rc2-00075-gbe8fbe718e35 (Aug 11 2023 - 08:38:49 +0000)
127 Core: 51 devices, 14 uclasses, devicetree: board
129 Loading Environment from Flash... *** Warning - bad CRC, using default environment
132 Out: serial,vidconsole
133 Err: serial,vidconsole
134 Bus xhci_pci: Register 8001040 NbrPorts 8
135 Starting the controller
137 scanning bus xhci_pci for devices... 3 USB Device(s) found
138 Net: eth0: virtio-net#32
139 Hit any key to stop autoboot: 0
140 Scanning for bootflows in all bootdevs
141 Seq Method State Uclass Part Name Filename
142 --- ----------- ------ -------- ---- ------------------------ ----------------
143 Scanning global bootmeth 'efi_mgr':
145 fatal: no kernel available
146 scanning bus for devices...
147 Scanning bootdev 'virtio-blk#34.bootdev':
148 0 efi ready virtio 2 virtio-blk#34.bootdev.par efi/boot/bootaa64.efi
149 ** Booting bootflow 'virtio-blk#34.bootdev.part_2' with efi
150 Using prior-stage device tree
151 Failed to load EFI variables
152 Error: writing contents
153 ** Unable to write file ubootefi.var **
154 Failed to persist EFI variables
155 Missing TPMv2 device for EFI_TCG_PROTOCOL
156 Booting /efi\boot\bootaa64.efi
157 Error: writing contents
158 ** Unable to write file ubootefi.var **
159 Failed to persist EFI variables
162 Standard boot looks through various available devices and finds the virtio
163 disks, then boots from the first one. After a second or so the grub menu appears
164 and you can work through the installer flow normally.
166 After the installation, you can boot into the installed system by running QEMU
167 again without the drive argument corresponding to the installer CD image.
169 Enabling TPMv2 support
170 ----------------------
172 To emulate a TPM the swtpm package may be used. It can be built from the
173 following repositories:
175 https://github.com/stefanberger/swtpm.git
177 Swtpm provides a socket for the TPM emulation which can be consumed by QEMU.
179 In a first console invoke swtpm with::
181 swtpm socket --tpmstate dir=/tmp/mytpm1 \
182 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --log level=20
184 In a second console invoke qemu-system-aarch64 with::
186 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \
187 -tpmdev emulator,id=tpm0,chardev=chrtpm \
188 -device tpm-tis-device,tpmdev=tpm0
190 Enable the TPM on U-Boot's command line with::
197 The debug UART on the ARM virt board uses these settings::
200 CONFIG_DEBUG_UART_PL010=y
201 CONFIG_DEBUG_UART_BASE=0x9000000
202 CONFIG_DEBUG_UART_CLOCK=0