Am 12. November 2024 14:58:54 MEZ schrieb Simon Glass <[email protected]>: >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 <[email protected]> >--- > > 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 <[email protected]> >+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 <[email protected]> > 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

