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

Tom Rini trini at konsulko.com
Fri Nov 15 16:14:03 CET 2024


On Fri, Nov 15, 2024 at 07:21:47AM -0700, Simon Glass wrote:
> Hi Tom,
> 
> On Tue, 12 Nov 2024 at 17:54, Tom Rini <trini at konsulko.com> wrote:
> >
> > On Wed, Nov 13, 2024 at 01:49:30AM +0100, Heinrich Schuchardt wrote:
> > > 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.
> >
> > And _all_ of this is why I don't want to add a useful personal script
> > as an additional tool we support. I've seen how much work goes in to the
> > OpenEmbedded runqemu script, we don't have the spare cycles for
> > something like that. Doubly so when ultimately I believe we would be
> > well served by having a document that says (in much more words) to look
> > at u-boot-test-hooks for how to invoke QEMU for a large number of
> > architectures and platforms and to then further leverage general QEMU
> > tips and guides on how to run an OS of your choice with that.
> 
> I'm not sure it matters that much. Everyone is going to have their
> preference as to how this script should look, but no one else has
> taken the time to write one...
> 
> People are free to send patches to enhance it. But I believe it is
> helpful, e.g. for repeating problems caused by recent lmb patches.
> 
> Re the test hooks, I just get tired of looking them up and trying to
> figure out what to do. Every board name and arch is slightly
> different. Just a hassle that I don't need.
> 
> We can put it in scripts/contrib if you like.

It's handy to point people to scripts, yes. I frequently point people at
my wrappers around buildman for example for "how do I find code bloat?"
and similar. But no, I don't think this rises to the level of
"scripts/contrib".

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20241115/6e36c013/attachment.sig>


More information about the U-Boot mailing list