#!/usr/bin/env bash # ============================================================================= # scripts/qemu.sh — flexible QEMU launcher for rs-dos # # Usage: # ./scripts/qemu.sh # serial console (no graphics) # ./scripts/qemu.sh --gui # graphical window # ./scripts/qemu.sh --debug # GDB stub on :1234 # ./scripts/qemu.sh --chain # full boot chain (firmware → rsboot → rsnix) # ./scripts/qemu.sh --bios /path/to.fd # custom OVMF # ./scripts/qemu.sh --mem 512M # memory size # ./scripts/qemu.sh --smp 2 # SMP cores # # One image, one drive — the system image contains kernel + ESP + data. # ============================================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_DIR" # Defaults GUI_FLAG="" DEBUG_FLAG="" CHAIN_FLAG="" OVMF="${OVMF:-/usr/share/edk2/x64/OVMF.4m.fd}" MEM="${MEM:-256M}" SMP="${SMP:-1}" SYSTEM_IMG="${SYSTEM_IMG:-/tmp/system.img}" # 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 ;; --chain | -c) CHAIN_FLAG=1 SYSTEM_IMG="${SYSTEM_IMG:-rs-dos.img}" shift ;; --image | -i) SYSTEM_IMG="$2" shift 2 ;; --bios | -b) OVMF="$2" shift 2 ;; --mem) MEM="$2" shift 2 ;; --smp) SMP="$2" shift 2 ;; *) echo "unknown: $1" exit 1 ;; esac done # Stage system image if needed if [ -n "$CHAIN_FLAG" ]; then ./scripts/mksystem.sh --chain --gpt "$SYSTEM_IMG" else ./scripts/mksystem.sh "$SYSTEM_IMG" fi echo "" echo "=== Booting ===" echo " image: $SYSTEM_IMG" echo " ovmf: $OVMF" echo " mem: $MEM smp: $SMP" echo " gui: $([ -n "$GUI_FLAG" ] && echo yes || echo no)" echo " gdb: $([ -n "$DEBUG_FLAG" ] && echo ':1234' || echo off)" echo "" exec qemu-system-x86_64 \ -bios "$OVMF" \ -drive "file=$SYSTEM_IMG,format=raw,if=none,id=hd" \ -device ide-hd,drive=hd \ -serial stdio \ -m "$MEM" \ -machine q35 \ -cpu qemu64 \ -no-reboot \ -smp "$SMP" \ $GUI_FLAG $DEBUG_FLAG