[PATCH 01/18] scripts: Add a script for building and booting QEMU
Simon Glass
sjg at chromium.org
Tue Nov 12 14:58:54 CET 2024
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 at 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 at 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 at 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
--
2.34.1
More information about the U-Boot
mailing list