rumpk/run_aarch64.sh

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