[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