Skip to content

Commit 0995c00

Browse files
committed
Cleanup qemu.mk
1 parent 58cbf84 commit 0995c00

File tree

9 files changed

+171
-110
lines changed

9 files changed

+171
-110
lines changed

Makefile

-58
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ tools : .FORCE
1717
prebuilt : .FORCE
1818
./scripts/deploy_prebuilt.sh
1919

20-
pmem.img :
21-
qemu-img create $@ 2G
22-
2320
apps : .FORCE
2421
-git submodule update --init --recursive
2522
make -C app/
@@ -40,68 +37,13 @@ files : src/BOOTX64.EFI src/LIUMOS.ELF .FORCE
4037

4138
.PHONY : internal_run_loader_test
4239

43-
internal_run_loader_test :
44-
@echo Using ${LOADER_TEST_EFI} as a loader...
45-
mkdir -p mnt/
46-
-rm -rf mnt/*
47-
mkdir -p mnt/EFI/BOOT
48-
cp ${LOADER_TEST_EFI} mnt/EFI/BOOT/BOOTX64.EFI
49-
$(QEMU) $(QEMU_ARGS_LOADER_TEST) ; \
50-
RETCODE=$$? ; \
51-
if [ $$RETCODE -eq 3 ]; then \
52-
echo "\nPASS" ; \
53-
exit 0 ; \
54-
else \
55-
echo "\nFAIL: QEMU returned $$RETCODE" ; \
56-
exit 1 ; \
57-
fi
58-
59-
run_nopmem : files .FORCE
60-
$(QEMU) $(QEMU_ARGS)
61-
6240
LLDB_ARGS = -o 'settings set interpreter.prompt-on-quit false' \
6341
-o 'process launch' \
6442
-o 'process handle -s false SIGUSR1 SIGUSR2'
6543

66-
run_root : files pmem.img .FORCE
67-
$(QEMU) $(QEMU_ARGS_PMEM) -vga std
68-
69-
run_rtl : files pmem.img .FORCE
70-
$(QEMU) $(QEMU_ARGS_COMMON) $(QEMU_ARGS_NET_MACOS_RTL)
71-
72-
run_adlib : files pmem.img .FORCE
73-
$(QEMU) $(QEMU_ARGS_COMMON) -soundhw adlib
74-
75-
run_user : files pmem.img .FORCE
76-
$(QEMU) $(QEMU_ARGS_COMMON) $(QEMU_ARGS_USER_NET)
77-
78-
run_for_e2e_test : files pmem.img .FORCE
79-
( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) &
80-
$(QEMU) $(QEMU_ARGS) -nographic
81-
82-
run_user_headless : files pmem.img .FORCE
83-
( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) &
84-
$(QEMU) $(QEMU_ARGS_COMMON) $(QEMU_ARGS_USER_NET) -vnc 0.0.0.0:$(PORT_VNC),password
85-
86-
run_user_headless_gdb : files pmem.img .FORCE
87-
( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) &
88-
$(QEMU) $(QEMU_ARGS_COMMON) $(QEMU_ARGS_USER_NET) -vnc 0.0.0.0:$(PORT_VNC),password -gdb tcp::1192 -S
89-
90-
run_gdb_root : files pmem.img .FORCE
91-
$(QEMU) $(QEMU_ARGS_PMEM) -gdb tcp::1192 -S || reset
92-
93-
run_gdb_nogui_root : files pmem.img .FORCE
94-
( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) &
95-
$(QEMU) $(QEMU_ARGS_PMEM) -gdb tcp::1192 -S -vnc :0,password || reset
96-
97-
run_vnc : files pmem.img .FORCE
98-
( echo 'change vnc password $(VNC_PASSWORD)' | while ! nc localhost $(PORT_MONITOR) ; do sleep 1 ; done ) &
99-
$(QEMU) $(QEMU_ARGS_PMEM) -vnc :0,password || reset
100-
10144
gdb_root : .FORCE
10245
gdb -ex 'target remote localhost:1192' src/LIUMOS.ELF
10346

104-
10547
install : files .FORCE
10648
@read -p "Write LIUMOS to /Volumes/LIUMOS. Are you sure? [Enter to proceed, or Ctrl-C to abort] " && \
10749
cp -r mnt/* /Volumes/LIUMOS/ && diskutil eject /Volumes/LIUMOS/ && echo "install done."

common.mk

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ commit :
2424
run :
2525
make -C $(THIS_DIR) run_root
2626

27+
run_nobuild :
28+
make -C $(THIS_DIR) run_nobuild_root
29+
2730
run_rust :
2831
make -C $(THIS_DIR) common_run_rust
2932

@@ -33,9 +36,6 @@ run_docker :
3336
stop_docker :
3437
make -C $(THIS_DIR) stop_docker_root
3538

36-
run_gdb :
37-
make -C $(THIS_DIR) run_gdb_root
38-
3939
gdb :
4040
make -C $(THIS_DIR) gdb_root
4141

e2etest/src/main.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ fn get_liumos_root_path(exec_path_str: &Path) -> String {
3131
}
3232

3333
fn launch_liumos(liumos_root_dir: &str) -> PtySession {
34-
let cmd = format!("make -C {} run_for_e2e_test", liumos_root_dir);
34+
let cmd = format!("make -C {} run GUI=n", liumos_root_dir);
35+
println!("Launching liumOS with cmdline: {}", cmd);
3536
let result = retry_with_index(Fixed::from_millis(1000).take(3), |current_try| {
3637
let result = spawn(&cmd, Some(TIMEOUT_MILLISECONDS))
3738
.and_then(|mut p| p.exp_regex("\\(qemu\\)").map(|_| p))
@@ -55,10 +56,12 @@ fn launch_liumos(liumos_root_dir: &str) -> PtySession {
5556
if result.is_err() {
5657
panic!("Failed to launch liumOS");
5758
}
59+
println!("QEMU started");
5860
result.unwrap()
5961
}
6062

6163
fn launch_liumos_on_docker(liumos_root_dir: &str) -> PtySession {
64+
println!("Launching liumOS on Docker...");
6265
let cmd = format!("make -C {} run_docker", liumos_root_dir);
6366
let mut p = spawn(&cmd, Some(TIMEOUT_MILLISECONDS))
6467
.unwrap_or_else(|e| panic!("Failed to launch QEMU in Docker: {}", e));

e2etest/test_util.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
print('liumOS root is at: ', liumos_root_path, file=sys.stderr, flush=True)
1111

1212
def launch_liumos():
13-
p = pexpect.spawn("make -C {} run_for_e2e_test".format(liumos_root_path))
13+
p = pexpect.spawn("make -C {} run GUI=n".format(liumos_root_path))
1414
i = 1
1515
while (i != 0):
1616
try:

qemu.mk

+157-44
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,187 @@
11
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
68
# PORT_VNC=N => port 5900 + N
7-
PORT_VNC=5
9+
PORT_OFFSET_VNC?=5
10+
PORT_GDB?=3333
811

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=\
1123
-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 \
1525
-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 \
1730
-rtc base=localtime \
18-
19-
QEMU_ARGS_LOADER_TEST=\
20-
$(QEMU_ARGS_COMMON_HW_CONFIG) \
2131
-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 \
2644
-nographic
2745

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:=\
3059
-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
3482

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 \
3786
-object filter-dump,id=f1,netdev=u1,file=dump.dat
3887

39-
QEMU_ARGS_NET_MACOS_RTL=\
88+
QEMU_ARGS_NET_RTL8139:=\
4089
-nic user,id=u1,model=rtl8139,hostfwd=tcp::10023-:23 \
4190
-object filter-dump,id=f1,netdev=u1,file=dump.dat
4291

43-
QEMU_ARGS_NET_LINUX_TAP=\
92+
QEMU_ARGS_NET_TAP:=\
4493
-nic tap,ifname=tap0,id=u1,model=virtio,script=no \
4594
-object filter-dump,id=f1,netdev=u1,file=dump.dat
4695

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
4999

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
54112

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
58126

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)
61137
endif
62138

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+
#
67155

68156
common_run_rust :
69157
make -C ${PROJECT_ROOT}/loader install
70158
cd ${PROJECT_ROOT} && $(QEMU) $(QEMU_ARGS_PMEM)
71159

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
74186

187+
.PHONY : run_root

scripts/for_docker/run.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ make prebuilt
2222
echo "Start building..."
2323
cd /liumos # move to the mounted host src dir
2424
make clean
25-
make run_user_headless
25+
make run GUI=n

scripts/make_run_with_docker.sh

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
docker kill liumos-builder0 && echo "Killed previous container" || true
33
cd "$(dirname "$0")"
44
cd ..
5+
echo "Starting a docker container..."
56
docker run --rm -ti -v `echo $PWD`:/liumos_host \
67
-p 0.0.0.0:2222:2222/tcp \
78
-p 0.0.0.0:5905:5905/tcp \

src/elf.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ static void LoadAndMap(TAllocator& allocator,
151151
should_clflush);
152152
}
153153

154-
Process& LoadELFAndCreateEphemeralProcess(EFIFile& file, const char* const name) {
154+
Process& LoadELFAndCreateEphemeralProcess(EFIFile& file,
155+
const char* const name) {
155156
ExecutionContext& ctx =
156157
*liumos->kernel_heap_allocator->Alloc<ExecutionContext>();
157158
ProcessMappingInfo& map_info = ctx.GetProcessMappingInfo();

src/elf.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class PersistentMemoryManager;
1111

1212
const Elf64_Shdr* FindSectionHeader(EFIFile& file, const char* name);
1313

14-
Process& LoadELFAndCreateEphemeralProcess(EFIFile& file, const char* const name);
14+
Process& LoadELFAndCreateEphemeralProcess(EFIFile& file,
15+
const char* const name);
1516
Process& LoadELFAndCreatePersistentProcess(EFIFile& file,
1617
PersistentMemoryManager& pmem);
1718
void LoadKernelELF(EFIFile& liumos_elf, LoaderInfo&);

0 commit comments

Comments
 (0)