summaryrefslogtreecommitdiffstats
path: root/tools/qemu.sh
blob: 428954fbd137f7c122d76f3bdddde87c7dde1ac5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/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")"
		DRIVE_ARGS=("$_img_file" '-device' 'ide-hd,drive=hd')
		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[@]}"