WIP checkpoint: quiet default log level, QEMU_DISPLAY control, tee'd serial log

Default log level dropped from info to warn so the per-word ECW dispatch
trace doesn't flood REPL output after POST (--log-level=info/debug still
re-enables it). qemu target gains QEMU_DISPLAY (default gtk) so the
framebuffer window shows by default; serial log is tee'd live via
`tail -f` instead of dumped with `cat` at the end. Includes regenerated
BLOCK_MAP.md/amd64.csv/artemis.img and this morning's boot logs/DoE runs
from the sessions that produced this WIP.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-12 12:55:08 -04:00
co-authored by Claude Sonnet 5
parent 64a3ff58cc
commit a02e14915f
16 changed files with 66551 additions and 53 deletions
+34 -15
View File
@@ -709,6 +709,10 @@ $(KERNEL_ELF): $(KERNEL_OBJS) $(KERNEL_LINKER_SCRIPT) | $(BUILD_DIR)
OVMF_CODE := /usr/share/OVMF/OVMF_CODE_4M.fd
OVMF_VARS_RO := /usr/share/OVMF/OVMF_VARS_4M.fd
# QEMU_DISPLAY — window backend for the framebuffer console (gtk/sdl/none/...).
# Usage: make -f Makefile.starkernel qemu QEMU_DISPLAY=none # headless/CI
QEMU_DISPLAY ?= gtk
qemu: all
ifeq ($(ARCH),amd64)
@echo "=== Building ISO (amd64) ==="
@@ -738,10 +742,13 @@ ifeq ($(ARCH),amd64)
echo " Serial log: $$LOG"; \
echo " (exits when EXEC-DOE completes)"; \
echo ""; \
touch $$LOG; \
tail -n +1 -f $$LOG & TAILPID=$$!; \
qemu-system-x86_64 \
-machine q35,accel=tcg \
-cpu qemu64 \
-m 1024 \
-vga std \
-drive if=pflash,format=raw,readonly=on,file=$(OVMF_CODE) \
-drive if=pflash,format=raw,file=$(BUILD_DIR)/OVMF_VARS.fd \
-cdrom $(QEMU_ISO) -boot d \
@@ -749,7 +756,7 @@ ifeq ($(ARCH),amd64)
-device virtio-blk-pci,drive=artdisk \
-chardev socket,id=cserial,path=$$SERIAL_SOCK,server=on,wait=off,logfile=$$LOG \
-serial chardev:cserial \
-display none \
-display $(QEMU_DISPLAY) \
-no-reboot & QPID=$$!; \
DEADLINE=$$(( $$(date +%s) + 43200 )); \
echo " Waiting for ok> / zuse)ok> prompt..."; \
@@ -773,11 +780,10 @@ ifeq ($(ARCH),amd64)
fi; \
fi; \
kill $$QPID 2>/dev/null; wait $$QPID 2>/dev/null || true; \
kill $$TAILPID 2>/dev/null; wait $$TAILPID 2>/dev/null || true; \
rm -f $$SERIAL_SOCK; \
echo ""; \
echo "=== Serial log: $$LOG ==="; \
cat $$LOG; \
echo ""; \
echo "=== Extracting DOE CSV ==="; \
bash scripts/extract_doe.sh $$LOG $$CSV || true; \
cp $$CSV $(DOE_LATEST_DIR)/amd64.csv 2>/dev/null || true
@@ -820,6 +826,8 @@ else ifeq ($(ARCH),aarch64)
echo " Serial log: $$LOG"; \
echo " (exits when EXEC-DOE completes)"; \
echo ""; \
touch $$LOG; \
tail -n +1 -f $$LOG & TAILPID=$$!; \
qemu-system-aarch64 \
-machine virt \
-cpu cortex-a57 \
@@ -831,7 +839,7 @@ else ifeq ($(ARCH),aarch64)
-device ramfb \
-chardev socket,id=cserial,path=$$SERIAL_SOCK,server=on,wait=off,logfile=$$LOG \
-serial chardev:cserial \
-display none \
-display $(QEMU_DISPLAY) \
-m 2048 \
-no-reboot \
-d guest_errors & QPID=$$!; \
@@ -857,11 +865,10 @@ else ifeq ($(ARCH),aarch64)
fi; \
fi; \
kill $$QPID 2>/dev/null; wait $$QPID 2>/dev/null || true; \
kill $$TAILPID 2>/dev/null; wait $$TAILPID 2>/dev/null || true; \
rm -f $$SERIAL_SOCK; \
echo ""; \
echo "=== Serial log: $$LOG ==="; \
cat $$LOG; \
echo ""; \
echo "=== Extracting DOE CSV ==="; \
bash scripts/extract_doe.sh $$LOG $$CSV || true; \
cp $$CSV $(DOE_LATEST_DIR)/aarch64.csv 2>/dev/null || true
@@ -918,6 +925,8 @@ else ifeq ($(ARCH),riscv64)
echo " Serial log: $$LOG"; \
echo " (exits when EXEC-DOE completes)"; \
echo ""; \
touch $$LOG; \
tail -n +1 -f $$LOG & TAILPID=$$!; \
qemu-system-riscv64 \
-machine virt \
-cpu rv64 \
@@ -932,7 +941,7 @@ else ifeq ($(ARCH),riscv64)
-device ramfb \
-chardev socket,id=cserial,path=$$SERIAL_SOCK,server=on,wait=off,logfile=$$LOG \
-serial chardev:cserial \
-display none \
-display $(QEMU_DISPLAY) \
-no-reboot \
-d guest_errors & QPID=$$!; \
DEADLINE=$$(( $$(date +%s) + 43200 )); \
@@ -957,37 +966,43 @@ else ifeq ($(ARCH),riscv64)
fi; \
fi; \
kill $$QPID 2>/dev/null; wait $$QPID 2>/dev/null || true; \
kill $$TAILPID 2>/dev/null; wait $$TAILPID 2>/dev/null || true; \
rm -f $$SERIAL_SOCK; \
echo ""; \
echo "=== Serial log: $$LOG ==="; \
cat $$LOG; \
echo ""; \
echo "=== Extracting DOE CSV ==="; \
bash scripts/extract_doe.sh $$LOG $$CSV || true; \
cp $$CSV $(DOE_LATEST_DIR)/riscv64.csv 2>/dev/null || true
endif
# qemu-esp — quick iteration: boot from FAT directory (no disk image rebuild)
# amd64/aarch64: serial → stdio; riscv64: uses proper GPT (esp dir not supported)
qemu-esp: $(LOADER_EFI) $(KERNEL_ELF)
# qemu-esp — interactive dev boot from FAT directory (no disk image rebuild,
# no auto-kill/timeout/DOE-injection logic — stays up until you quit it
# yourself with Ctrl-A X or by closing the window).
# amd64/aarch64: serial → stdio (bidirectional, you can type into the REPL);
# riscv64: uses proper GPT (esp dir not supported)
qemu-esp: include/version.h $(LOADER_EFI) $(KERNEL_ELF)
ifeq ($(ARCH),amd64)
@rm -rf $(BUILD_DIR)/esp
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
@cp $(LOADER_EFI) $(BUILD_DIR)/esp/EFI/BOOT/BOOTX64.EFI
@cp $(KERNEL_ELF) $(BUILD_DIR)/esp/kernel.elf
@printf "FS0:\\EFI\\BOOT\\BOOTX64.EFI\r\n" > $(BUILD_DIR)/esp/startup.nsh
$(if $(KERNEL_ARGS),@printf '$(KERNEL_ARGS)\n' > $(BUILD_DIR)/esp/starforth.cfg,)
@OVMF_CODE=$(OVMF_CODE); \
if [ ! -f $$OVMF_CODE ]; then echo "Error: $$OVMF_CODE not found"; exit 1; fi; \
cp $(OVMF_VARS_RO) $(BUILD_DIR)/OVMF_VARS.fd; \
qemu-system-x86_64 \
-nodefaults -display none \
-nodefaults -display $(QEMU_DISPLAY) -vga std \
-machine q35,accel=tcg \
-cpu qemu64 \
-m 1024 \
-chardev stdio,id=ser0,signal=off \
-device isa-serial,chardev=ser0,iobase=0x3f8 \
-drive if=pflash,format=raw,readonly=on,file=$$OVMF_CODE \
-drive if=pflash,format=raw,file=$(BUILD_DIR)/OVMF_VARS.fd \
-drive format=raw,file=fat:rw:$(BUILD_DIR)/esp \
-drive id=artdisk,file=$(ARTDISK),format=raw,if=none \
-device virtio-blk-pci,drive=artdisk \
-no-reboot
else ifeq ($(ARCH),aarch64)
@@ -1021,7 +1036,7 @@ else ifeq ($(ARCH),riscv64)
endif
# qemu-gdb — launch QEMU with GDB stub on port 1234
qemu-gdb: $(LOADER_EFI) $(KERNEL_ELF)
qemu-gdb: include/version.h $(LOADER_EFI) $(KERNEL_ELF)
ifeq ($(ARCH),amd64)
@mkdir -p $(BUILD_DIR)/esp/EFI/BOOT
@cp $(LOADER_EFI) $(BUILD_DIR)/esp/EFI/BOOT/BOOTX64.EFI
@@ -1089,10 +1104,14 @@ help:
@echo " clean-kernel — remove build/*/kernel for all arches"
@echo ""
@echo "QEMU goals:"
@echo " qemu — clean boot, serial logs/<session>/<arch>/ + DOE CSV → doe/ (all arches)"
@echo " qemu — clean boot, serial tee'd live + logs/<session>/<arch>/ + DOE CSV → doe/ (all arches)"
@echo " qemu-esp — quick boot from FAT directory (amd64, aarch64)"
@echo " qemu-gdb — boot with GDB stub on :1234"
@echo ""
@echo "QEMU display:"
@echo " QEMU_DISPLAY=gtk — framebuffer window backend for 'qemu' goal (default: gtk)"
@echo " QEMU_DISPLAY=none — headless (no window), e.g. for CI"
@echo ""
@echo "Info goals:"
@echo " info — show build configuration"
@echo " help — show this message"