[PATCH 01/18] scripts: Add a script for building and booting QEMU

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Nov 13 01:49:30 CET 2024


Am 12. November 2024 14:58:54 MEZ schrieb Simon Glass <sjg at chromium.org>:
>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

Please, avoid misnomers. This script does not build QEMU.

>+
> 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

Just another misnomer. This page is not about script.sh.

>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+

This is not a valid SPDX identifier.

>+
>+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::

This downloads the QEMU source and builds it?

>+
>+    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.

The U-Boot project should remain open to all operating systems. How will this work with OpenBSD?

Use the URL of the image as argument.

>+
>+-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

"word version" is not helpful as explanation.

Look at <https://en.m.wikipedia.org/wiki/Word_(computer_architecture)> which says a word is 64 bit on a 64-bit system and 16 bit on a 16-bit system.

>+
>+.. 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+

This is not a valid SPDX identifier.

>+#
>+# 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.

Why support obsolete i386 but not riscv64?

>+
>+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 \

Ubuntu suggests 4 GiB as minimum for a desktop.

>+		-nic none \

Who wants to run without network?
Use the virtio nic.

>+		${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"

That CPU is 12 years old and not all distros are stuck on ARM v8.0. See <https://en.opensuse.org/Arm_architecture_support>.

-cpu max works fine with both tcg and kvm.

>+		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"

There is no ARM 32-bit Ubuntu desktop. And for i386 there is no image in 24.04.1.

Running a foreign architecture desktop with tcg is not enjoyable.

For testing U-Boot a server image is all it takes.

Best regards

Heinrich


>+	;;
>+"")
>+	;;
>+*)
>+	usage "Unknown OS '${os}'"
>+esac
>+
>+DIR=${ubdir}/${BOARD}
>+
>+if [[ -n "${build}" ]]; then
>+	build_u_boot
>+fi
>+
>+if [[ -n "${run}" ]]; then
>+	run_qemu
>+fi



More information about the U-Boot mailing list