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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
# shellcheck shell=sh disable=SC2046,SC2091,SC2086,SC2155
# NOTE: $(VAR) in this file is MAKE syntax, not shell substitution.
export TARGET=x86_64-unknown-uefi
export PROFILE=debug
export OUT_DIR=target/$(TARGET)/$(PROFILE)
export ESP_DIR=esp
export KERNEL=$(OUT_DIR)/rsdos.efi
export BZIMAGE=$(ESP_DIR)/bzImage
export INITRD=$(ESP_DIR)/initramfs.cpio.gz
export BOOTLOADER=rsboot/rsboot.efi
export OVMF=/usr/share/edk2/x64/OVMF.4m.fd
export BOOT_EFI=$(ESP_DIR)/EFI/BOOT/BOOTX64.EFI
# Attach a raw disk image as the SATA drive (disk.img -> ide.0, ESP -> ide.1).
# Create one with: make disk (or: ./scripts/mkdisk.sh)
export DISK_IMG ?= /tmp/disk.img
.PHONY: all run run-gui clean image debug release fmt bootloader boot-image disk disk-fresh inspect test-disk
# ---- Build ---------------------------------------------------------------
all: $(BZIMAGE) $(INITRD)
release: PROFILE=release
release: export PROFILE=release
release: export OUT_DIR=target/$(TARGET)/release
release: CARGO_FLAGS=--release
release: all
# shellcheck disable=SC2034
CARGO_FLAGS=
$(OUT_DIR)/rsdos.efi: $(shell find rsnix shell rsdos -name '*.rs') Cargo.toml rsnix/Cargo.toml shell/Cargo.toml rsdos/Cargo.toml
cargo build --package rsdos --target $(TARGET) $(CARGO_FLAGS)
$(BZIMAGE): $(KERNEL) | $(ESP_DIR)
cp "$<" "$@"
$(ESP_DIR):
mkdir -p $(ESP_DIR)
$(INITRD): | $(ESP_DIR)
printf '' | gzip > "$@"
# ---- QEMU runners --------------------------------------------------------
run: all disk
qemu-system-x86_64 \
-bios $(OVMF) \
-drive file=$(DISK_IMG),format=raw,if=none,id=disk \
-device ide-hd,drive=disk,bus=ide.0 \
-drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
-device ide-hd,drive=esp,bus=ide.1 \
-serial stdio \
-m 256M \
-machine q35 \
-cpu qemu64 \
-no-reboot \
-display none
run-gui: all disk
qemu-system-x86_64 \
-bios $(OVMF) \
-drive file=$(DISK_IMG),format=raw,if=none,id=disk \
-device ide-hd,drive=disk,bus=ide.0 \
-drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
-device ide-hd,drive=esp,bus=ide.1 \
-serial stdio \
-m 256M \
-machine q35 \
-cpu qemu64 \
-no-reboot \
-vga std
# GDB stub on :1234
debug: all disk
qemu-system-x86_64 \
-bios $(OVMF) \
-drive file=$(DISK_IMG),format=raw,if=none,id=disk \
-device ide-hd,drive=disk,bus=ide.0 \
-drive file=fat:rw:$(ESP_DIR),format=raw,if=none,id=esp \
-device ide-hd,drive=esp,bus=ide.1 \
-serial stdio \
-m 256M \
-machine q35 \
-cpu qemu64 \
-no-reboot \
-display none \
-s -S
# Boot from a raw disk image (delegates to boot-image.sh which builds the
# full chain if the image doesn't exist yet)
run-image: all
./scripts/boot-image.sh rs-dos.img
# ---- Data disk -----------------------------------------------------------
# Create the FAT32 data disk if it doesn't exist. Uses mkfs.fat -C (the
# flag that actually creates the file) and seeds it from seed/.
disk:
./scripts/mkdisk.sh "$(DISK_IMG)"
# Re-format the data disk from scratch (wipes it, then re-seeds).
disk-fresh:
./scripts/mkdisk.sh --fresh "$(DISK_IMG)"
# List the data disk contents with mtools (requires mtools).
inspect:
@command -v mdir >/dev/null 2>&1 || (echo "inspect needs mtools: sudo apt install mtools"; exit 1)
@mdir -i "$(DISK_IMG)"
# Full automated round trip: build -> boot -> shell commands -> poweroff
# -> fsck + mtools verification.
test-disk:
./scripts/test-disk.sh
# ---- Full boot chain -----------------------------------------------------
# Build bootloader only (rsboot submodule)
bootloader:
./scripts/build-bootloader.sh
# Build the full boot chain disk image (kernel + bootloader)
image: all
./scripts/build-image.sh rs-dos.img
# Boot the full chain disk image (builds it first if needed)
boot-image: all
./scripts/boot-image.sh rs-dos.img
# ---- Utilities -----------------------------------------------------------
fmt:
cargo fmt
clean:
cargo clean
rm -rf $(ESP_DIR) rs-dos.img
help:
@echo "rs-dos — Make targets"
@echo ""
@echo " make build kernel + ESP (default)"
@echo " make release build with --release (smaller binary)"
@echo " make bootloader build rsboot from source"
@echo " make image build full chain disk image (bootloader + kernel)"
@echo " make boot-image build + boot full chain via QEMU"
@echo " make run QEMU serial console (direct boot, no bootloader)"
@echo " make run-gui QEMU with graphical window (GOP/PS2)"
@echo " make debug QEMU + GDB stub on :1234"
@echo " make disk create the data disk if missing (default /tmp/disk.img)"
@echo " make disk-fresh re-format the data disk (wipes it)"
@echo " make inspect list data disk contents (mtools)"
@echo " make test-disk automated disk round trip (build->boot->fsck)"
@echo " make clean remove build artifacts"
@echo " make fmt format Rust source"
@echo ""
@echo "Scripts:"
@echo " ./scripts/boot.sh quick direct boot (dev loop)"
@echo " ./scripts/mkdisk.sh create/re-format the data disk"
@echo " ./scripts/test-disk.sh automated disk round trip"
@echo " ./scripts/sendkeys.py type into QEMU via the monitor"
@echo " ./scripts/boot-image.sh boot full chain (builds if needed)"
@echo " ./scripts/build-image.sh build full chain disk image"
@echo " ./scripts/build-bootloader.sh build rsboot from source"
@echo " ./scripts/qemu.sh flexible QEMU launcher"
@echo " ./scripts/debug-kernel.py GDB plugin (attach after 'make debug')"
|