87 lines
2.5 KiB
Bash
Executable File
87 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ============================================================================
|
|
# Rumpk ARM64 QEMU Runner
|
|
# ============================================================================
|
|
# Usage:
|
|
# ./run_aarch64.sh # Interactive boot
|
|
# ./run_aarch64.sh test # Automated boot test
|
|
# ============================================================================
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")"
|
|
|
|
KERNEL="zig-out/bin/rumpk.elf"
|
|
DISK="build/disk_aarch64.img"
|
|
|
|
if [ ! -f "$KERNEL" ]; then
|
|
echo "ERROR: $KERNEL not found. Run: zig build -Darch=aarch64"
|
|
exit 1
|
|
fi
|
|
|
|
# Create disk image if missing (16MB for LittleFS)
|
|
if [ ! -f "$DISK" ]; then
|
|
mkdir -p build
|
|
dd if=/dev/zero of="$DISK" bs=1M count=16 2>/dev/null
|
|
echo "Created $DISK (16MB)"
|
|
fi
|
|
|
|
MODE="${1:-interactive}"
|
|
|
|
# VirtIO MMIO devices for aarch64 virt
|
|
VIRTIO_NET="-device virtio-net-device,netdev=net0 -netdev user,id=net0"
|
|
VIRTIO_BLK="-device virtio-blk-device,drive=hd0 -drive if=none,id=hd0,format=raw,file=$DISK"
|
|
|
|
if [ "$MODE" = "test" ]; then
|
|
echo "=== Rumpk ARM64 Boot Test ==="
|
|
TIMEOUT=20
|
|
|
|
LOGFILE=$(mktemp /tmp/rumpk-aarch64-XXXXXX.log)
|
|
timeout "$TIMEOUT" qemu-system-aarch64 \
|
|
-M virt -cpu cortex-a72 -m 512M \
|
|
-nographic -serial mon:stdio \
|
|
-kernel "$KERNEL" \
|
|
$VIRTIO_NET $VIRTIO_BLK \
|
|
-no-reboot >"$LOGFILE" 2>&1 || true
|
|
|
|
cat "$LOGFILE"
|
|
echo ""
|
|
echo "=== Boot Checks ==="
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
|
|
check() {
|
|
local label="$1"
|
|
local pattern="$2"
|
|
if grep -qa "$pattern" "$LOGFILE"; then
|
|
echo " [PASS] $label"
|
|
PASS=$((PASS + 1))
|
|
else
|
|
echo " [FAIL] $label"
|
|
FAIL=$((FAIL + 1))
|
|
fi
|
|
}
|
|
|
|
check "UART loopback" "Loopback Test: PASS"
|
|
check "aarch64_init reached" "aarch64_init reached"
|
|
check "GICv2 initialized" "GICv2 initialized"
|
|
check "Timer initialized" "Timer initialized"
|
|
check "Vectors installed" "vectors installed"
|
|
check "Nim handoff" "Handing off to Nim"
|
|
check "VirtIO-Net found" "VirtIO-Net"
|
|
check "VirtIO-Blk found" "VirtIO-Block\|VirtIO-Blk\|Storage initialized"
|
|
check "VirtIO init complete" "Initialization Complete"
|
|
|
|
TOTAL=$((PASS + FAIL))
|
|
echo ""
|
|
echo "=== Result: $PASS/$TOTAL ==="
|
|
if [ "$FAIL" -gt 0 ]; then
|
|
exit 1
|
|
fi
|
|
else
|
|
exec qemu-system-aarch64 \
|
|
-M virt -cpu cortex-a72 -m 512M \
|
|
-nographic -serial mon:stdio \
|
|
-kernel "$KERNEL" \
|
|
$VIRTIO_NET $VIRTIO_BLK
|
|
fi
|