Nothing to see here, move along
1#!/usr/bin/env bash
2set -euo pipefail
3
4SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
6
7TARGET_DIR="$ROOT/target/x86_64-lancer-none/debug"
8KERNEL_BIN="$TARGET_DIR/lancer-kernel"
9ISO_DIR="$ROOT/target/iso-integration"
10ISO_FILE="$ROOT/target/lancer-integration.iso"
11LIMINE_DIR="$ROOT/target/limine"
12OVMF_VARS="$ROOT/target/ovmf/OVMF_VARS_4M.fd"
13OVMF_CODE="/usr/share/OVMF/OVMF_CODE_4M.fd"
14NVME_DISK="$ROOT/target/nvme-integration.img"
15
16BOOT_MODULES=(
17 "lancer-init:init"
18 "lancer-serial-driver:serial"
19 "lancer-nvme-driver:nvme"
20 "lancer-lancerfs:lancerfs"
21 "lancer-fstest:fstest"
22)
23
24echo "=== Lancer Integration Tests ==="
25
26echo "Building workspace"
27cargo build --manifest-path "$ROOT/Cargo.toml" --workspace
28
29echo "Formatting NVMe disk image"
30rm -f "$NVME_DISK"
31cd /tmp
32cargo run --manifest-path "$ROOT/Cargo.toml" -p lancer-lancerfs --no-default-features --features host --target x86_64-unknown-linux-gnu --bin mkfs_host -- "$NVME_DISK" 64M
33cd "$ROOT"
34
35echo "Creating ISO"
36rm -rf "$ISO_DIR"
37mkdir -p "$ISO_DIR/boot/limine" "$ISO_DIR/EFI/BOOT"
38cp "$KERNEL_BIN" "$ISO_DIR/boot/kernel"
39for entry in "${BOOT_MODULES[@]}"; do
40 bin="${entry%%:*}"
41 name="${entry##*:}"
42 src="$TARGET_DIR/${bin}"
43 if [ -f "$src" ]; then
44 cp "$src" "$ISO_DIR/boot/${name}"
45 else
46 echo "WARNING: binary $src not found, skipping"
47 fi
48done
49
50cat > "$ISO_DIR/boot/limine/limine.conf" <<'LIMINEEOF'
51timeout: 0
52serial: yes
53verbose: yes
54
55/Lancer Integration Test
56 protocol: limine
57 kernel_path: boot():/boot/kernel
58 module_path: boot():/boot/init
59 module_path: boot():/boot/serial
60 module_path: boot():/boot/nvme
61 module_path: boot():/boot/lancerfs
62 module_path: boot():/boot/fstest
63LIMINEEOF
64
65cp "$LIMINE_DIR/limine-bios.sys" "$ISO_DIR/boot/limine/"
66cp "$LIMINE_DIR/limine-bios-cd.bin" "$ISO_DIR/boot/limine/"
67cp "$LIMINE_DIR/limine-uefi-cd.bin" "$ISO_DIR/boot/limine/"
68cp "$LIMINE_DIR/BOOTX64.EFI" "$ISO_DIR/EFI/BOOT/"
69cp "$LIMINE_DIR/BOOTIA32.EFI" "$ISO_DIR/EFI/BOOT/"
70xorriso -as mkisofs \
71 -b boot/limine/limine-bios-cd.bin \
72 -no-emul-boot -boot-load-size 4 -boot-info-table \
73 --efi-boot boot/limine/limine-uefi-cd.bin \
74 -efi-boot-part --efi-boot-image --protective-msdos-label \
75 "$ISO_DIR" -o "$ISO_FILE"
76"$LIMINE_DIR/limine" bios-install "$ISO_FILE"
77
78mkdir -p "$(dirname "$OVMF_VARS")"
79cp /usr/share/OVMF/OVMF_VARS_4M.fd "$OVMF_VARS"
80
81echo "Booting QEMU with NVMe + IOMMU"
82set +e
83timeout 120s qemu-system-x86_64 \
84 -M q35,accel=kvm:tcg,kernel-irqchip=split \
85 -cpu host \
86 -m 512M \
87 -drive if=pflash,format=raw,readonly=on,file="$OVMF_CODE" \
88 -drive if=pflash,format=raw,file="$OVMF_VARS" \
89 -cdrom "$ISO_FILE" \
90 -device intel-iommu,intremap=on,caching-mode=on \
91 -drive file="$NVME_DISK",if=none,id=nvm,format=raw \
92 -device nvme,serial=lancernvme,drive=nvm \
93 -serial stdio \
94 -display none \
95 -no-reboot \
96 -device isa-debug-exit,iobase=0x501,iosize=0x04 \
97 < /dev/null 2>&1
98QEMU_EXIT=$?
99set -e
100
101case $QEMU_EXIT in
102 33)
103 echo ""
104 echo "INTEGRATION TESTS PASSED"
105 exit 0
106 ;;
107 35)
108 echo ""
109 echo "INTEGRATION TESTS FAILED"
110 exit 1
111 ;;
112 124|137)
113 echo ""
114 echo "TIMEOUT"
115 exit 1
116 ;;
117 *)
118 echo ""
119 echo "UNEXPECTED EXIT CODE: $QEMU_EXIT"
120 exit 1
121 ;;
122esac