Files
xen/automation/scripts/qemu-smoke-dom0less-arm32.sh
T
Stefano Stabellini c36efb7fce automation: use expect to run QEMU
Use expect to invoke QEMU so that we can terminate the test as soon as
we get the right string in the output instead of waiting until the
final timeout.

For timeout, instead of an hardcoding the value, use a Gitlab CI
variable "QEMU_TIMEOUT" that can be changed depending on the latest
status of the Gitlab CI runners.

Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
Reviewed-by: Michal Orzel <michal.orzel@amd.com>
2024-08-13 16:05:05 -07:00

153 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
set -ex
test_variant=$1
# Prompt to grep for to check if dom0 booted successfully
dom0_prompt="/ #"
serial_log="$(pwd)/smoke.serial"
cd binaries
# Use the kernel from Debian
curl --fail --silent --show-error --location --output vmlinuz https://deb.debian.org/debian/dists/bullseye/main/installer-armhf/current/images/netboot/vmlinuz
# Use a tiny initrd based on busybox from Alpine Linux
curl --fail --silent --show-error --location --output initrd.tar.gz https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/armhf/alpine-minirootfs-3.15.1-armhf.tar.gz
if [ -z "${test_variant}" ]; then
passed="generic test passed"
domU_check="
echo \"${passed}\"
"
fi
if [[ "${test_variant}" == "static-mem" ]]; then
# Memory range that is statically allocated to domU1
domu_base="0x50000000"
domu_size="0x20000000"
passed="${test_variant} test passed"
domU_check="
mem_range=$(printf \"%08x-%08x\" ${domu_base} $(( ${domu_base} + ${domu_size} - 1 )))
if grep -q -x \"\${mem_range} : System RAM\" /proc/iomem; then
echo \"${passed}\"
fi
"
fi
if [[ "${test_variant}" == "gzip" ]]; then
# Compress kernel image with gzip (keep unmodified one for dom0)
gzip -k vmlinuz
passed="${test_variant} test passed"
domU_check="
echo \"${passed}\"
"
fi
if [[ "${test_variant}" == "without-dom0" ]]; then
# Clear dom0 prompt
dom0_prompt=""
passed="${test_variant} test passed"
domU_check="
echo \"${passed}\"
"
fi
if [[ "${test_variant}" == "earlyprintk" ]]; then
# Clear dom0 prompt
dom0_prompt=""
# Last early printk message before entering C world
passed="\- Ready \-"
fi
# dom0/domU rootfs
# We are using the same rootfs for dom0 and domU. The only difference is
# that for the former, we set explictly rdinit to /bin/sh, whereas for the
# latter we rely on using custom /init script with test case inside.
mkdir rootfs
cd rootfs
tar xvzf ../initrd.tar.gz
echo "#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
${domU_check}
/bin/sh" > init
chmod +x init
find . | cpio -H newc -o | gzip > ../initrd.gz
cd ..
# XXX QEMU looks for "efi-virtio.rom" even if it is unneeded
curl -fsSLO https://github.com/qemu/qemu/raw/v5.2.0/pc-bios/efi-virtio.rom
./qemu-system-arm \
-machine virt \
-machine virtualization=true \
-smp 4 \
-m 2048 \
-serial stdio \
-monitor none \
-display none \
-machine dumpdtb=virt.dtb
# ImageBuilder
echo 'MEMORY_START="0x40000000"
MEMORY_END="0xC0000000"
DEVICE_TREE="virt.dtb"
XEN="xen"
XEN_CMD="console=dtuart dom0_mem=512M bootscrub=0 console_timestamps=boot"
DOM0_KERNEL="vmlinuz"
DOM0_RAMDISK="initrd.gz"
DOM0_CMD="console=hvc0 earlyprintk clk_ignore_unused root=/dev/ram0 rdinit=/bin/sh"
DOMU_KERNEL[0]="vmlinuz"
DOMU_RAMDISK[0]="initrd.gz"
DOMU_MEM[0]="512"
NUM_DOMUS=1
LOAD_CMD="tftpb"
BOOT_CMD="bootz"
UBOOT_SOURCE="boot.source"
UBOOT_SCRIPT="boot.scr"' > config
if [[ "${test_variant}" == "static-mem" ]]; then
echo -e "\nDOMU_STATIC_MEM[0]=\"${domu_base} ${domu_size}\"" >> config
fi
if [[ "${test_variant}" == "gzip" ]]; then
sed -i 's/DOMU_KERNEL\[0\]=.*/DOMU_KERNEL\[0\]="vmlinuz.gz"/' config
fi
if [[ "${test_variant}" == "without-dom0" ]]; then
sed -i '/^DOM0/d' config
fi
rm -rf imagebuilder
git clone --depth 1 https://gitlab.com/xen-project/imagebuilder.git
bash imagebuilder/scripts/uboot-script-gen -t tftp -d . -c config
# Run the test
rm -f ${serial_log}
set +e
export QEMU_CMD="./qemu-system-arm \
-machine virt \
-machine virtualization=true \
-smp 4 \
-m 2048 \
-serial stdio \
-monitor none \
-display none \
-no-reboot \
-device virtio-net-pci,netdev=n0 \
-netdev user,id=n0,tftp=./ \
-bios /usr/lib/u-boot/qemu_arm/u-boot.bin"
export UBOOT_CMD="virtio scan; dhcp; tftpb 0x40000000 boot.scr; source 0x40000000"
export QEMU_LOG="${serial_log}"
export LOG_MSG="${dom0_prompt}"
export PASSED="${passed}"
../automation/scripts/qemu-key.exp