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