run-qemu.sh
1 #!/bin/bash 2 set -e 3 4 # QEMU runner script for libp2p-efi 5 # Usage: ./scripts/run-qemu.sh [path-to-efi-binary] 6 7 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 8 PROJECT_DIR="$(dirname "$SCRIPT_DIR")" 9 EFI_BINARY="${1:-$PROJECT_DIR/target/x86_64-unknown-uefi/debug/libp2p-efi.efi}" 10 11 # OVMF firmware paths (check common locations) 12 OVMF_PATHS=( 13 "/usr/share/edk2/x64/OVMF.4m.fd" 14 "/usr/share/ovmf/x64/OVMF.fd" 15 "/usr/share/ovmf/OVMF.fd" 16 "/usr/share/edk2-ovmf/x64/OVMF.fd" 17 "/usr/share/OVMF/OVMF_CODE.fd" 18 "/usr/share/qemu/OVMF.fd" 19 ) 20 21 OVMF="" 22 for path in "${OVMF_PATHS[@]}"; do 23 if [[ -f "$path" ]]; then 24 OVMF="$path" 25 break 26 fi 27 done 28 29 if [[ -z "$OVMF" ]]; then 30 echo "Error: OVMF firmware not found. Install ovmf package." 31 echo " Arch: pacman -S edk2-ovmf" 32 echo " Ubuntu/Debian: apt install ovmf" 33 echo " Fedora: dnf install edk2-ovmf" 34 exit 1 35 fi 36 37 if [[ ! -f "$EFI_BINARY" ]]; then 38 echo "Error: EFI binary not found: $EFI_BINARY" 39 echo "Run 'cargo build' first." 40 exit 1 41 fi 42 43 # Create ESP (EFI System Partition) structure 44 ESP_DIR=$(mktemp -d) 45 mkdir -p "$ESP_DIR/EFI/BOOT" 46 cp "$EFI_BINARY" "$ESP_DIR/EFI/BOOT/BOOTX64.EFI" 47 48 cleanup() { 49 rm -rf "$ESP_DIR" 50 } 51 trap cleanup EXIT 52 53 echo "Starting QEMU with UEFI firmware..." 54 echo " OVMF: $OVMF" 55 echo " Binary: $EFI_BINARY" 56 echo "" 57 58 qemu-system-x86_64 \ 59 -bios "$OVMF" \ 60 -drive format=raw,file=fat:rw:"$ESP_DIR" \ 61 -device virtio-net-pci,netdev=net0 \ 62 -netdev user,id=net0,hostfwd=udp::9999-:9999 \ 63 -nographic \ 64 -serial mon:stdio