summaryrefslogtreecommitdiffstats
path: root/scripts/qemu.sh
blob: eeaf4dec37003a8662bb5f6ef079cb6d46e07583 (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
97
98
99
#!/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