[PATCH v3 01/22] RFC: scripts: Add a script for running QEMU
Simon Glass
sjg at chromium.org
Thu Apr 17 20:15:43 CEST 2025
This is present in my tree. Provide it as a patch to simplify testing
this series with QEMU.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
(no changes since v1)
scripts/build-qemu.sh | 222 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 222 insertions(+)
create mode 100755 scripts/build-qemu.sh
diff --git a/scripts/build-qemu.sh b/scripts/build-qemu.sh
new file mode 100755
index 00000000000..678116d1cc7
--- /dev/null
+++ b/scripts/build-qemu.sh
@@ -0,0 +1,222 @@
+#!/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 <arch> - Select architecture (arm, x86)"
+ echo " -B - Don't build; assume a build exists"
+ echo " -e - Run UEFI Self-Certification Test (SCT)"
+ echo " -k - Use kvm (kernel-based Virtual Machine)"
+ echo " -o <name> - Run Operating System ('ubuntu' only for now)"
+ echo " -r - Run QEMU with the image"
+ echo " -R <os> - Select OS release (e.g. 24.04)"
+ echo " -s - Use serial only (no display)"
+ echo " -S <seq> - Select SCT sequence-file"
+ echo " -x - Run SPL (xPL) image"
+ echo " -w - Use word version (32-bit)" ) >&2
+ exit 1
+}
+
+# Directory tree for OS images
+imagedir=${imagedir-/vid/software/linux}
+
+# Directory for UEFI Self-Certification Test (SCT)
+sctdir=${sctdir-/vid/software/devel/uefi/sct}
+
+# Mount point for use when writing to disk images
+mnt=${mnt-/mnt}
+
+# 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=
+
+xpl=
+
+# 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:Beko:rR:sS:wx" opt; do
+ case "${opt}" in
+ a)
+ arch=$OPTARG
+ ;;
+ B)
+ build=
+ ;;
+ e)
+ extra+=" -m 4G -smp 4"
+ extra+=" -display none"
+ extra+=" -device virtio-gpu-pci"
+ extra+=" -device qemu-xhci"
+ extra+=" -device usb-kbd"
+ extra+=" -drive file=${sctdir}/sct.img,format=raw,if=none,id=vda"
+ extra+=" -device virtio-blk-device,drive=vda,bootindex=1"
+ extra+=" -device virtio-net-device,netdev=net0"
+ extra+=" -netdev user,id=net0"
+ ;;
+ 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
+ ;;
+ S)
+ seq=$OPTARG
+ ;;
+ w)
+ bitness=32
+ ;;
+ x)
+ xpl=1
+ ;;
+ *)
+ usage
+ ;;
+ esac
+done
+
+# Build U-Boot for the selected board
+build_u_boot() {
+ buildman -w -o $DIR --board $BOARD -I || exit $?
+}
+
+# Write the SCT test-sequence file into the SCT image
+update_sct_seq() {
+ if [[ -z "${seq}" ]]; then
+ return
+ fi
+ LOOP=$(sudo losetup --show -f -P "${sctdir}/sct.img")
+ PART="${LOOP}p1"
+ sudo mount -o loop ${PART} ${mnt} -o uid=$(id -u),gid=$(id -g)
+ cp "${seq}" "${mnt}/."
+ sudo umount ${mnt}
+ sudo losetup -d ${LOOP}
+}
+
+# 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)
+ if [ -n "${xpl}" ]; then
+ BIOS="image.bin"
+ BOARD="qemu_arm_spl"
+ else
+ BOARD="qemu_arm"
+ BIOS="u-boot.bin"
+ fi
+ qemu=qemu-system-arm
+ extra+=" -machine virt -accel tcg"
+ 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
+ update_sct_seq
+fi
+
+if [[ -n "${run}" ]]; then
+ run_qemu
+fi
--
2.43.0
More information about the U-Boot
mailing list