scripts: Add a script for building and booting QEMU

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>
This commit is contained in:
Simon Glass
2024-11-12 06:58:54 -07:00
parent b557c73feb
commit cee7f69038
4 changed files with 245 additions and 0 deletions

View File

@@ -1111,6 +1111,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
ENVIRONMENT
M: Joe Hershberger <joe.hershberger@ni.com>
S: Maintained

View File

@@ -8,6 +8,7 @@ Emulation
acpi
blkdev
script
qemu-arm
qemu-mips
qemu-ppce500

View File

@@ -0,0 +1,61 @@
.. SPDX-License-Identifier: GPL-2.0+
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::
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.
-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
.. note::
Note: For now this is a shell script, but if it expands it might be better
as Python, accepting the slower startup.

175
scripts/build-qemu.sh Executable file
View File

@@ -0,0 +1,175 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# 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.
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 \
-nic none \
${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"
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"
;;
"")
;;
*)
usage "Unknown OS '${os}'"
esac
DIR=${ubdir}/${BOARD}
if [[ -n "${build}" ]]; then
build_u_boot
fi
if [[ -n "${run}" ]]; then
run_qemu
fi