mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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>
153 lines
3.9 KiB
Bash
Executable File
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
|