From bd266942ce24a4463dc6ad0b987199b0966fe526 Mon Sep 17 00:00:00 2001 From: Robert Allan James Date: Sat, 29 Aug 2026 10:12:43 -0400 Subject: [PATCH] v2.0.1: generic GPT/FAT32 UEFI bootable thumbdrive image (thumbdrive goal) New `make -f Makefile.starkernel thumbdrive` goal builds a generic UEFI-bootable GPT disk image (disk image -> GPT + one FAT32 "STARKERNEL" EFI System partition with EFI/BOOT/BOOT.EFI + startup.nsh) that can be written directly to a USB thumbdrive with dd and boots on any real amd64 UEFI firmware (Beelink SER5 path) as well as under QEMU. The monolithic loader embeds the whole kernel, so the ESP needs only the UEFI fallback boot path. Verified under QEMU by attaching the image as a USB mass-storage device (not cdrom): OVMF BDS auto-selected "UEFI QEMU QEMU USB HARDDRIVE" (Boot0002), then kernel booted normally -- LithosAnanke v2.0.0, POST 1012/0/0 + ok>, rng: backend = virtio-rng + entropy: ready, Artemis ready, and the USB BOT/ xHCI storage path enumerated (READ CAPACITY10 -> MSC device ready -> READ10 CSW PASS). This mirrors the real-hardware SER5 flow: firmware boots the USB thumbdrive's ESP, and the OS's own storage rides the same USB BOT/xHCI path. Works for all three arches via the arch-mapped EFI boot name. --- Makefile.starkernel | 40 ++++++++++++++++++++++++++++++++++++++-- capsules/BLOCK_MAP.md | 2 +- disk/artemis.img | Bin 31457280 -> 31457280 bytes 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/Makefile.starkernel b/Makefile.starkernel index e38cddc..8faac39 100644 --- a/Makefile.starkernel +++ b/Makefile.starkernel @@ -556,6 +556,7 @@ KERNEL_OBJS := \ .PHONY: all clean clean-kernel kernel kernel-all .PHONY: qemu qemu-esp qemu-gdb +.PHONY: thumbdrive .PHONY: info help # ============================================================================== @@ -1001,8 +1002,42 @@ else ifeq ($(ARCH),riscv64) echo "=== Serial log: $$LOG ==="; \ echo "=== Extracting DOE CSV ==="; \ bash scripts/extract_doe.sh $$LOG $$CSV || true; \ - cp $$CSV $(DOE_LATEST_DIR)/riscv64.csv 2>/dev/null || true -endif + cp $$CSV $(DOE_LATEST_DIR)/riscv64.csv 2>/dev/null || true + endif + +# thumbdrive — build a generic UEFI-bootable GPT/FAT32 disk image that can be +# written directly to a USB thumbdrive (dd) and boots on real amd64 UEFI +# hardware (e.g. Beelink SER5) as well as under QEMU. This is the "generic +# thumbdrive bootable OS" image for the v2.5.0/SER5 bare-metal path: the +# monolithic loader embeds the whole kernel, so the ESP needs only the UEFI +# fallback boot path EFI/BOOT/BOOT.EFI. Storage on real hardware is the +# USB BOT/xHCI path (already live), not virtio. +thumbdrive: all + @mkdir -p $(BUILD_DIR) + @if ! which sgdisk >/dev/null 2>&1; then echo "Error: sgdisk not found. Install gdisk (apt-get install gdisk)."; exit 1; fi + @if ! which mkfs.fat >/dev/null 2>&1; then echo "Error: mkfs.fat not found. Install dosfstools (apt-get install dosfstools)."; exit 1; fi + @case "$(ARCH)" in \ + amd64) BOOTNAME="BOOTX64.EFI" ;; \ + aarch64) BOOTNAME="BOOTAA64.EFI" ;; \ + riscv64) BOOTNAME="BOOTRISCV64.EFI" ;; \ + *) echo "Error: no thumbdrive EFI boot name for ARCH=$(ARCH)"; exit 1 ;; \ + esac; \ + DISK=$(BUILD_DIR)/starkernel-thumbdrive.img; \ + rm -f $$DISK $(BUILD_DIR)/thumbdrive-esp.img; \ + dd if=/dev/zero of=$(BUILD_DIR)/thumbdrive-esp.img bs=512 count=131072 2>/dev/null; \ + mkfs.fat -F 32 -n "STARKERNEL" $(BUILD_DIR)/thumbdrive-esp.img >/dev/null 2>&1; \ + mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI; \ + mmd -i $(BUILD_DIR)/thumbdrive-esp.img ::/EFI/BOOT; \ + mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(LOADER_EFI) ::/EFI/BOOT/$$BOOTNAME; \ + printf 'FS0:\\EFI\\BOOT\\%s\r\n' "$$BOOTNAME" > $(BUILD_DIR)/thumbdrive-startup.nsh; \ + mcopy -i $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh ::/startup.nsh; \ + dd if=/dev/zero of=$$DISK bs=1M count=64 2>/dev/null; \ + sgdisk -n 1:2048:0 -t 1:ef00 -c 1:"EFI System" $$DISK >/dev/null 2>&1; \ + dd if=$(BUILD_DIR)/thumbdrive-esp.img of=$$DISK bs=512 seek=2048 conv=notrunc 2>/dev/null; \ + rm -f $(BUILD_DIR)/thumbdrive-esp.img $(BUILD_DIR)/thumbdrive-startup.nsh; \ + echo "Thumbdrive image: $$DISK"; \ + echo "Write to a USB stick with: dd if=$$DISK of=/dev/sdX bs=4M status=progress" + # 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 @@ -1136,6 +1171,7 @@ help: @echo " qemu — clean boot, serial tee'd live + logs/// + 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 " thumbdrive — build generic GPT/FAT32 UEFI disk image (write to a USB stick with dd; real-hardware/SER5 path)" @echo "" @echo "QEMU display:" @echo " QEMU_DISPLAY=gtk — framebuffer window backend for 'qemu' goal (default: gtk)" diff --git a/capsules/BLOCK_MAP.md b/capsules/BLOCK_MAP.md index 1d5369c..9e28d25 100644 --- a/capsules/BLOCK_MAP.md +++ b/capsules/BLOCK_MAP.md @@ -1,5 +1,5 @@ # Capsule Block Manifest — Auto-generated - + diff --git a/disk/artemis.img b/disk/artemis.img index f5306e85667db98f3813af953aab4fb49405cbb0..ef9308134f83b4c3d25d5e09a9c451e0b39698b9 100644 GIT binary patch delta 5185 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 N=QOY8(Jhtj{{W;UG_3#t