
It is handy to be able to quickly build and boot a QEMU image for a particular architecture and distro.
Add a script for this purpose. It supports only arm and x86 at present. For distros it only supports Ubuntu. Both 32- and 64-bit builds are supported.
Signed-off-by: Simon Glass sjg@chromium.org ---
MAINTAINERS | 8 ++ doc/board/emulation/index.rst | 1 + doc/board/emulation/script.rst | 61 ++++++++++++ scripts/build-qemu.sh | 175 +++++++++++++++++++++++++++++++++ 4 files changed, 245 insertions(+) create mode 100644 doc/board/emulation/script.rst create mode 100755 scripts/build-qemu.sh
diff --git a/MAINTAINERS b/MAINTAINERS index 0399ed1dbf6..b45bb96d5a5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1110,6 +1110,14 @@ F: tools/efivar.py F: tools/file2include.c F: tools/mkeficapsule.c
+EMULATION +M: Simon Glass sjg@chromium.org +S: Maintained +W: https://docs.u-boot.org/en/latest/board/emulation/script.html +F: configs/qemu_x86* +F: doc/board/emulation/script.rst +F: scripts/build-qemu.sh + ENVIRONMENT M: Joe Hershberger joe.hershberger@ni.com S: Maintained diff --git a/doc/board/emulation/index.rst b/doc/board/emulation/index.rst index f8908166276..5a2a00ae225 100644 --- a/doc/board/emulation/index.rst +++ b/doc/board/emulation/index.rst @@ -8,6 +8,7 @@ Emulation
acpi blkdev + script qemu-arm qemu-mips qemu-ppce500 diff --git a/doc/board/emulation/script.rst b/doc/board/emulation/script.rst new file mode 100644 index 00000000000..23981e333cb --- /dev/null +++ b/doc/board/emulation/script.rst @@ -0,0 +1,61 @@ +.. SPDX-License-Identifier: GPL-2.0+ + +Script for building and running +=============================== + +You may find the script `scripts/build-qemu.sh` helpful for building and testing +U-Boot on QEMU. + +If uses a environment variables to control how it works: + +ubdir + base directory for building U-Boot, with each board being in its own + subdirectory + +imagedir + directory containing OS images, containin a subdirectory for each distro + type (e.g. ubuntu/ + +Once configured, you can build and run QEMU for arm64 like this:: + + scripts/build-qemu.sh -rsw + +No support is currently included for specifying a root disk, so this script can +only be used to start installers. + +Options +~~~~~~~ + +Options are available to control the script: + +-a <arch> + Select architecture (default arm, x86) + +-B + Don't build; assume a build exists + +-k + Use kvm - kernel-based Virtual Machine. By default QEMU uses its own + emulator + +-o <os> + Run an Operating System. For now this only supports 'ubuntu'. The name of + the OS file must remain unchanged from its standard name on the Ubuntu + website. + +-r + Run QEMU with the image (by default this is not done) + +-R + Select OS release (e.g. 24.04). + +-s + Use serial only (no display) + +-w + Use word version (32-bit). By default, 64-bit is used + +.. note:: + + Note: For now this is a shell script, but if it expands it might be better + as Python, accepting the slower startup. diff --git a/scripts/build-qemu.sh b/scripts/build-qemu.sh new file mode 100755 index 00000000000..0ff53593cf9 --- /dev/null +++ b/scripts/build-qemu.sh @@ -0,0 +1,175 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0+ +# +# Script to build U-Boot suitable for booting with QEMU, possibly running +# it, possibly with an OS image + +# This just an example. It assumes that + +# - you build U-Boot in ${ubdir}/<name> where <name> is the U-Boot board config +# - your OS images are in ${imagedir}/{distroname}/... + +# So far the script supports only ARM and x86. + +set -e + +usage() { + ( + if [[ -n "$1" ]]; then + echo "$1" + echo + fi + echo "Usage: $0 -aBkrsw" + echo + echo " -a - Select architecture (arm, x86)" + echo " -B - Don't build; assume a build exists" + echo " -k - Use kvm (kernel-based Virtual Machine)" + echo " -o - Run Operating System ('ubuntu' only for now)" + echo " -r - Run QEMU with the image" + echo " -R - Select OS release (e.g. 24.04)" + echo " -s - Use serial only (no display)" + echo " -w - Use word version (32-bit)" ) >&2 + exit 1 +} + +# Directory tree for OS images +imagedir=${imagedir-/vid/software/linux} + +# architecture (arm or x86) +arch=arm + +# 32- or 64-bit build +bitness=64 + +# Build U-Boot +build=yes + +# Extra setings +extra= + +# Operating System to boot (ubuntu) +os= + +release=24.04.1 + +# run the image with QEMU +run= + +# run QEMU without a display (U-Boot must be set to stdout=serial) +serial= + +# Use kvm +kvm= + +# Set ubdir to the build directory where you build U-Boot out-of-tree +# We avoid in-tree build because it gets confusing trying different builds +ubdir=${ubdir-/tmp/b} + +while getopts "a:Bko:rR:sw" opt; do + case "${opt}" in + a) + arch=$OPTARG + ;; + B) + build= + ;; + k) + kvm="-enable-kvm" + ;; + o) + os=$OPTARG + + # Expand memory and CPUs + extra+=" -m 4G -smp 4" + ;; + r) + run=1 + ;; + R) + release=$OPTARG + ;; + s) + serial=1 + ;; + w) + bitness=32 + ;; + *) + usage + ;; + esac +done + +# Build U-Boot for the selected board +build_u_boot() { + buildman -w -o $DIR --board $BOARD -I || exit $? +} + +# Run QEMU with U-Boot +run_qemu() { + if [[ -n "${os_image}" ]]; then + extra+=" -drive if=virtio,file=${os_image},format=raw,id=hd0" + fi + if [[ -n "${serial}" ]]; then + extra+=" -display none -serial mon:stdio" + else + extra+=" -serial mon:stdio" + fi + echo "Running ${qemu} ${extra}" + "${qemu}" -bios "$DIR/${BIOS}" \ + -m 512 \ + -nic none \ + ${kvm} \ + ${extra} +} + +# Check architecture +case "${arch}" in +arm) + BOARD="qemu_arm" + BIOS="u-boot.bin" + qemu=qemu-system-arm + extra+=" -machine virt" + suffix="arm" + if [[ "${bitness}" == "64" ]]; then + BOARD="qemu_arm64" + qemu=qemu-system-aarch64 + extra+=" -cpu cortex-a57" + suffix="arm64" + fi + ;; +x86) + BOARD="qemu-x86" + BIOS="u-boot.rom" + qemu=qemu-system-i386 + suffix="i386" + if [[ "${bitness}" == "64" ]]; then + BOARD="qemu-x86_64" + qemu=qemu-system-x86_64 + suffix="amd64" + fi + ;; +*) + usage "Unknown architecture '${arch}'" +esac + +# Check OS +case "${os}" in +ubuntu) + os_image="${imagedir}/${os}/${os}-${release}-desktop-${suffix}.iso" + ;; +"") + ;; +*) + usage "Unknown OS '${os}'" +esac + +DIR=${ubdir}/${BOARD} + +if [[ -n "${build}" ]]; then + build_u_boot +fi + +if [[ -n "${run}" ]]; then + run_qemu +fi