#!/usr/bin/env bash # ============================================================================= # tools/qemu.sh — Run raisernics in QEMU with various options # # Usage: # ./tools/qemu.sh # serial console (no graphics) # ./tools/qemu.sh --gui # graphical window # ./tools/qemu.sh --debug # GDB stub on :1234 # ./tools/qemu.sh --image foo.img # boot from raw disk image # ./tools/qemu.sh --bios /path/to.fd # custom OVMF # ./tools/qemu.sh --mem 512M # memory size # ./tools/qemu.sh --smp 2 # SMP cores # ============================================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "$SCRIPT_DIR" # Defaults GUI_FLAG="" DEBUG_FLAG="" DRIVE_ARGS=(-drive file=fat:rw:esp,format=raw) OVMF="${OVMF:-/usr/share/edk2/x64/OVMF.4m.fd}" MEM="${MEM:-256M}" SMP="${SMP:-1}" # Pre-build make all # Parse args while [ $# -gt 0 ]; do case "$1" in --gui | -g) GUI_FLAG="-vga std" shift ;; --debug | -d) DEBUG_FLAG="-s -S" shift ;; --image | -i) _img_file="$(printf -- '-drive file=%s,format=raw,if=none,id=hd' "$2")" # Explicit buses: data disk -> ide.0 (port 0), ESP -> ide.1. DRIVE_ARGS=("$_img_file" '-device' 'ide-hd,drive=hd,bus=ide.0' \ '-drive' 'file=fat:rw:esp,format=raw,if=none,id=esp' \ '-device' 'ide-hd,drive=esp,bus=ide.1') shift 2 ;; --bios | -b) OVMF="$2" shift 2 ;; --mem) MEM="$2" shift 2 ;; --smp) SMP="$2" shift 2 ;; --help | -h) head -20 "$0" | grep "^# " | sed 's/^# //' exit 0 ;; *) echo "Unknown option: $1" exit 1 ;; esac done QEMU_CMD=( qemu-system-x86_64 -bios "$OVMF" "${DRIVE_ARGS[@]}" -serial stdio -m "$MEM" -machine q35 -cpu qemu64 -no-reboot -smp "$SMP" ) [ -n "$GUI_FLAG" ] && QEMU_CMD+=("$GUI_FLAG") if [ -n "$DEBUG_FLAG" ]; then # Split the flag string safely into words read -ra dbg <<<"$DEBUG_FLAG" QEMU_CMD+=("${dbg[@]}") fi echo " OVMF : $OVMF" echo " Drive : ${DRIVE_ARGS[*]}" echo " Mem : $MEM" echo " SMP : $SMP" echo " GDB : $([ -n "$DEBUG_FLAG" ] && echo ':1234' || echo 'off')" echo " GUI : $([ -n "$GUI_FLAG" ] && echo 'yes' || echo 'no')" echo "" exec "${QEMU_CMD[@]}"