|
1 | 1 | PROJECT_ROOT:=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
|
2 |
| -OVMF=${PROJECT_ROOT}/ovmf/bios64.bin |
3 |
| -QEMU=qemu-system-x86_64 |
4 |
| -VNC_PASSWORD=a |
5 |
| -PORT_MONITOR=2222 |
| 2 | +OVMF?=${PROJECT_ROOT}/ovmf/bios64.bin |
| 3 | +QEMU?=qemu-system-x86_64 |
| 4 | +VNC_PASSWORD?=a |
| 5 | +PORT_MONITOR?=2222 |
| 6 | +PORT_COM1?=1234 |
| 7 | +PORT_COM2?=1235 |
6 | 8 | # PORT_VNC=N => port 5900 + N
|
7 |
| -PORT_VNC=5 |
| 9 | +PORT_OFFSET_VNC?=5 |
| 10 | +PORT_GDB?=3333 |
8 | 11 |
|
9 |
| -QEMU_ARGS_COMMON_HW_CONFIG=\ |
10 |
| - -machine q35,nvdimm=on -cpu qemu64 -smp 4 \ |
| 12 | +# |
| 13 | +# Args for `make run` - will be constructed in the code below |
| 14 | +# |
| 15 | + |
| 16 | +QEMU_ARGS= |
| 17 | + |
| 18 | +# |
| 19 | +# Base machine config |
| 20 | +# |
| 21 | + |
| 22 | +QEMU_ARGS_COMMON=\ |
11 | 23 | -bios $(OVMF) \
|
12 |
| - -device qemu-xhci -device usb-mouse,id=usbmouse1 \ |
13 |
| - -netdev user,id=usbnet0 -device usb-net,netdev=usbnet0 \ |
14 |
| - -object filter-dump,id=f2,netdev=usbnet0,file=dump_usb_nic.dat \ |
| 24 | + -machine q35,nvdimm=on -cpu qemu64 -smp 4 \ |
15 | 25 | -m 2G,slots=2,maxmem=4G \
|
16 |
| - -drive format=raw,file=fat:rw:mnt -net none \ |
| 26 | + -object memory-backend-file,id=mem1,share=on,mem-path=pmem.img,size=2G \ |
| 27 | + -device nvdimm,id=nvdimm1,memdev=mem1 \ |
| 28 | + -device qemu-xhci -device usb-mouse,id=usbmouse1 \ |
| 29 | + -drive format=raw,file=fat:rw:mnt \ |
17 | 30 | -rtc base=localtime \
|
18 |
| - |
19 |
| -QEMU_ARGS_LOADER_TEST=\ |
20 |
| - $(QEMU_ARGS_COMMON_HW_CONFIG) \ |
21 | 31 | -device isa-debug-exit,iobase=0xf4,iosize=0x01 \
|
22 |
| - -chardev stdio,id=char0,mux=on \ |
23 |
| - -monitor none \ |
24 |
| - -serial chardev:char0 \ |
25 |
| - -serial chardev:char0 \ |
| 32 | + -monitor telnet:0.0.0.0:$(PORT_MONITOR),server,nowait \ |
| 33 | + |
| 34 | +QEMU_ARGS+=$(QEMU_ARGS_COMMON) |
| 35 | + |
| 36 | +# |
| 37 | +# GUI settings |
| 38 | +# |
| 39 | +QEMU_ARGS_GUI:=\ |
| 40 | + -vga std |
| 41 | + |
| 42 | +QEMU_ARGS_NOGUI:=\ |
| 43 | + -vnc 0.0.0.0:$(PORT_OFFSET_VNC),password=on \ |
26 | 44 | -nographic
|
27 | 45 |
|
28 |
| -QEMU_ARGS_COMMON=\ |
29 |
| - $(QEMU_ARGS_COMMON_HW_CONFIG) \ |
| 46 | +GUI?=y |
| 47 | +ifeq (${GUI}, y) |
| 48 | +QEMU_ARGS+=$(QEMU_ARGS_GUI) |
| 49 | +else ifeq (${GUI}, n) |
| 50 | +QEMU_ARGS+=$(QEMU_ARGS_NOGUI) |
| 51 | +else |
| 52 | +$(error Invalid value $(GUI) for GUI) |
| 53 | +endif |
| 54 | + |
| 55 | +# |
| 56 | +# stdio settings |
| 57 | +# |
| 58 | +QEMU_ARGS_STDIO_MONITOR:=\ |
30 | 59 | -monitor stdio \
|
31 |
| - -monitor telnet:0.0.0.0:$(PORT_MONITOR),server,nowait \ |
32 |
| - -serial tcp::1234,server,nowait \ |
33 |
| - -serial tcp::1235,server,nowait |
| 60 | + -serial tcp::${PORT_COM1},server,nowait \ |
| 61 | + -serial tcp::${PORT_COM2},server,nowait \ |
| 62 | + |
| 63 | +QEMU_ARGS_STDIO_SERIAL:=\ |
| 64 | + -chardev stdio,id=char0,mux=on \ |
| 65 | + -serial chardev:char0 \ |
| 66 | + -serial chardev:char0 |
| 67 | + |
| 68 | +STDIO?=monitor |
| 69 | +ifeq (${STDIO}, monitor) |
| 70 | +QEMU_ARGS+=$(QEMU_ARGS_STDIO_MONITOR) |
| 71 | +else ifeq (${STDIO}, serial) |
| 72 | +QEMU_ARGS+=$(QEMU_ARGS_STDIO_SERIAL) |
| 73 | +else |
| 74 | +$(error Invalid value $(STDIO) for STDIO) |
| 75 | +endif |
| 76 | + |
| 77 | +# |
| 78 | +# Network configs |
| 79 | +# |
| 80 | +# guest 10.0.2.1:8888 -> host 127.0.0.1:8888 |
| 81 | +# guest 10.0.2.1:8889 <- host 127.0.0.1:8889 |
34 | 82 |
|
35 |
| -QEMU_ARGS_NET_MACOS=\ |
36 |
| - -nic user,id=u1,model=virtio,hostfwd=tcp::10023-:23 \ |
| 83 | +QEMU_ARGS_NET_VIRTIO_USER:=\ |
| 84 | + -chardev udp,id=m8,host=0.0.0.0,port=8888 \ |
| 85 | + -nic user,id=u1,model=virtio,guestfwd=::8888-chardev:m8,hostfwd=udp:0.0.0.0:8889-0.0.0.0:8889 \ |
37 | 86 | -object filter-dump,id=f1,netdev=u1,file=dump.dat
|
38 | 87 |
|
39 |
| -QEMU_ARGS_NET_MACOS_RTL=\ |
| 88 | +QEMU_ARGS_NET_RTL8139:=\ |
40 | 89 | -nic user,id=u1,model=rtl8139,hostfwd=tcp::10023-:23 \
|
41 | 90 | -object filter-dump,id=f1,netdev=u1,file=dump.dat
|
42 | 91 |
|
43 |
| -QEMU_ARGS_NET_LINUX_TAP=\ |
| 92 | +QEMU_ARGS_NET_TAP:=\ |
44 | 93 | -nic tap,ifname=tap0,id=u1,model=virtio,script=no \
|
45 | 94 | -object filter-dump,id=f1,netdev=u1,file=dump.dat
|
46 | 95 |
|
47 |
| -# guest 10.0.2.1:8888 -> host 127.0.0.1:8888 |
48 |
| -# guest 10.0.2.1:8889 <- host 127.0.0.1:8889 |
| 96 | +QEMU_ARGS_NET_USB:=\ |
| 97 | + -netdev user,id=usbnet0 -device usb-net,netdev=usbnet0 \ |
| 98 | + -object filter-dump,id=f2,netdev=usbnet0,file=dump_usb_nic.dat |
49 | 99 |
|
50 |
| -QEMU_ARGS_USER_NET=\ |
51 |
| - -chardev udp,id=m8,host=0.0.0.0,port=8888 \ |
52 |
| - -nic user,id=u1,model=virtio,guestfwd=::8888-chardev:m8,hostfwd=udp:0.0.0.0:8889-0.0.0.0:8889 \ |
53 |
| - -object filter-dump,id=f1,netdev=u1,file=dump.dat |
| 100 | +NET?=virtio_user |
| 101 | +ifeq (${NET}, virtio_user) |
| 102 | +QEMU_ARGS+=${QEMU_ARGS_NET_VIRTIO_USER} |
| 103 | +else ifeq (${NET}, rtl8139) |
| 104 | +QEMU_ARGS+=${QEMU_ARGS_NET_RTL8139} |
| 105 | +else ifeq (${NET}, tap) |
| 106 | +QEMU_ARGS+=${QEMU_ARGS_NET_TAP} |
| 107 | +else ifeq (${NET}, usb) |
| 108 | +QEMU_ARGS+=${QEMU_ARGS_NET_USB} |
| 109 | +else |
| 110 | +$(error Invalid value ${NET} for NET) |
| 111 | +endif |
54 | 112 |
|
55 |
| -QEMU_ARGS=\ |
56 |
| - $(QEMU_ARGS_COMMON) \ |
57 |
| - $(QEMU_ARGS_USER_NET) |
| 113 | +# |
| 114 | +# GDB configs |
| 115 | +# |
| 116 | +GDB?=n |
| 117 | +ifeq (${GDB}, n) |
| 118 | +# Do nothing |
| 119 | +else ifeq (${GDB}, suspend_on_boot) |
| 120 | +QEMU_ARGS+= -gdb tcp::${PORT_GDB} -S |
| 121 | +else ifeq (${GDB}, nosuspend) |
| 122 | +QEMU_ARGS+= -gdb tcp::${PORT_GDB} |
| 123 | +else |
| 124 | +$(error Invalid value ${GDB} for GDB) |
| 125 | +endif |
58 | 126 |
|
59 |
| -ifdef SSH_CONNECTION |
60 |
| -QEMU_ARGS+= -vnc 0.0.0.0:$(PORT_VNC),password |
| 127 | +# |
| 128 | +# Audio configs |
| 129 | +# |
| 130 | +AUDIO?=n |
| 131 | +ifeq (${AUDIO}, n) |
| 132 | +# Do nothing |
| 133 | +else ifeq (${AUDIO}, adlib) |
| 134 | +QEMU_ARGS+= -device adlib |
| 135 | +else |
| 136 | +$(error Invalid value ${AUDIO} for AUDIO) |
61 | 137 | endif
|
62 | 138 |
|
63 |
| -QEMU_ARGS_PMEM=\ |
64 |
| - $(QEMU_ARGS) \ |
65 |
| - -object memory-backend-file,id=mem1,share=on,mem-path=pmem.img,size=2G \ |
66 |
| - -device nvdimm,id=nvdimm1,memdev=mem1 |
| 139 | +# |
| 140 | +# Utilities |
| 141 | +# |
| 142 | + |
| 143 | +pmem.img : |
| 144 | + qemu-img create $@ 2G |
| 145 | + |
| 146 | +watch_com1: |
| 147 | + while ! telnet localhost ${PORT_COM2} ; do sleep 1 ; done ; |
| 148 | + |
| 149 | +watch_com2: |
| 150 | + while ! telnet localhost ${PORT_COM2} ; do sleep 1 ; done ; |
| 151 | + |
| 152 | +# |
| 153 | +# run recipes |
| 154 | +# |
67 | 155 |
|
68 | 156 | common_run_rust :
|
69 | 157 | make -C ${PROJECT_ROOT}/loader install
|
70 | 158 | cd ${PROJECT_ROOT} && $(QEMU) $(QEMU_ARGS_PMEM)
|
71 | 159 |
|
72 |
| -watch_serial: |
73 |
| - while ! telnet localhost 1235 ; do sleep 1 ; done ; |
| 160 | +run_root : files pmem.img |
| 161 | + make run_nobuild_root |
| 162 | + |
| 163 | +run_nobuild_root : pmem.img |
| 164 | +ifeq (${GUI}, n) |
| 165 | + # Set VNC password |
| 166 | + ( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) & |
| 167 | +endif |
| 168 | + $(QEMU) $(QEMU_ARGS) |
| 169 | + |
| 170 | +internal_run_loader_test : |
| 171 | + @echo Using ${LOADER_TEST_EFI} as a loader... |
| 172 | + pwd |
| 173 | + mkdir -p mnt/ |
| 174 | + -rm -rf mnt/* |
| 175 | + mkdir -p mnt/EFI/BOOT |
| 176 | + cp ${LOADER_TEST_EFI} mnt/EFI/BOOT/BOOTX64.EFI |
| 177 | + $(QEMU) $(QEMU_ARGS_COMMON) $(QEMU_ARGS_GUI) $(QEMU_ARGS_STDIO_SERIAL) ; \ |
| 178 | + RETCODE=$$? ; \ |
| 179 | + if [ $$RETCODE -eq 3 ]; then \ |
| 180 | + echo "\nPASS" ; \ |
| 181 | + exit 0 ; \ |
| 182 | + else \ |
| 183 | + echo "\nFAIL: QEMU returned $$RETCODE" ; \ |
| 184 | + exit 1 ; \ |
| 185 | + fi |
74 | 186 |
|
| 187 | +.PHONY : run_root |
0 commit comments