#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" KERNEL_BIN="$ROOT/target/x86_64-lancer-none/debug/lancer-kernel" ISO_DIR="$ROOT/target/iso" ISO_FILE="$ROOT/target/lancer.iso" LIMINE_DIR="$ROOT/target/limine" OVMF_VARS="$ROOT/target/ovmf/OVMF_VARS_4M.fd" OVMF_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd" echo "Building test kernel" cargo build --manifest-path "$ROOT/Cargo.toml" -p lancer-kernel --features test-kernel echo "Creating ISO" rm -rf "$ISO_DIR" mkdir -p "$ISO_DIR/boot/limine" "$ISO_DIR/EFI/BOOT" cp "$KERNEL_BIN" "$ISO_DIR/boot/kernel" cat > "$ISO_DIR/boot/limine/limine.conf" <<'LIMINEEOF' timeout: 0 serial: yes /Lancer Test protocol: limine kernel_path: boot():/boot/kernel LIMINEEOF cp "$LIMINE_DIR/limine-bios.sys" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/limine-bios-cd.bin" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/limine-uefi-cd.bin" "$ISO_DIR/boot/limine/" cp "$LIMINE_DIR/BOOTX64.EFI" "$ISO_DIR/EFI/BOOT/" cp "$LIMINE_DIR/BOOTIA32.EFI" "$ISO_DIR/EFI/BOOT/" xorriso -as mkisofs \ -b boot/limine/limine-bios-cd.bin \ -no-emul-boot -boot-load-size 4 -boot-info-table \ --efi-boot boot/limine/limine-uefi-cd.bin \ -efi-boot-part --efi-boot-image --protective-msdos-label \ "$ISO_DIR" -o "$ISO_FILE" "$LIMINE_DIR/limine" bios-install "$ISO_FILE" mkdir -p "$(dirname "$OVMF_VARS")" cp /usr/share/OVMF/OVMF_VARS_4M.fd "$OVMF_VARS" echo "Running test kernel in QEMU" set +e timeout 60s qemu-system-x86_64 \ -M q35,accel=kvm:tcg,kernel-irqchip=split \ -cpu host \ -m 512M \ -drive if=pflash,format=raw,readonly=on,file="$OVMF_CODE" \ -drive if=pflash,format=raw,file="$OVMF_VARS" \ -cdrom "$ISO_FILE" \ -serial stdio \ -display none \ -no-reboot \ -device intel-iommu,intremap=on,caching-mode=on \ -device virtio-net-pci,netdev=net0 \ -netdev user,id=net0 \ -device isa-debug-exit,iobase=0x501,iosize=0x04 \ < /dev/null QEMU_EXIT=$? set -e case $QEMU_EXIT in 33) exit 0 ;; 35) echo "" echo "TESTS FAILED" exit 1 ;; 124|137) echo "" echo "TIMEOUT" exit 1 ;; *) echo "" echo "UNEXPECTED EXIT CODE: $QEMU_EXIT" exit 1 ;; esac