diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 1fcabe4f..f181b183 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -291,8 +291,9 @@ The vendored hosted `make` build (above) is NEVER used to validate kernel change make -f kernel/Makefile ARCH=amd64 clean qemu make -f kernel/Makefile ARCH=aarch64 clean qemu make -f kernel/Makefile ARCH=riscv64 clean qemu -# ...the PC stick loaded above 2 GiB, as a PC's firmware loads it (pc machine, 3 GiB; with -# Zuse's pair in the stick: scripts/qemu_session.py stick_zuse amd64 --target qemu-stick-high): +# ...the PC stick loaded above 2 GiB, as a PC's firmware loads it (pc machine, 3 GiB; the stick as +# built, its first boot minting its own Zuse: scripts/qemu_session.py stick_genesis amd64 +# --target qemu-stick-high): make -f kernel/Makefile ARCH=amd64 clean qemu-stick-high # ...and the 32-bit build -- v4 with 32-bit cells, the F18/Zynq (FPGA) case: its nucleus # image and every v4 test at that width (no QEMU; not a substitute for the boots above): @@ -326,14 +327,17 @@ audit artifacts — they are committed to the repo. Do not delete them. There is timestamped convention (self-documented via its own README); not a contradiction, just a second, less-structured log location. -**The disks (Captain Bob, 2026-10-26, the identity gate):** with no identity thumbdrive the system -is headless -- no prompt -- so every boot needs Zuse. `kernel/Makefile`'s `ARTDISK` and `ZUSEDISK` -default to the minted Zuse pair, `disk/zuse-scratch/artemis.img` and `zuse-thumb-ident.img` (a -pair: her genesis marker is on that Artemis disk; `disk/README.md`). Since 2026-10-28 `ZUSEDISK` -is that pair laid out as a stick (`make ... zusestick`, `build//kernel/zusestick.img`, made -fresh for every boot: identity and Artemis partitions on one USB disk, STICK.md §4); `ARTDISK` -stays the pair's Artemis file. v3 reads identity drives raw, never through a GPT, so a `system=v3` -boot needs `ZUSEDISK=disk/zuse-scratch/zuse-thumb-ident.img` (a copy) to log Zuse in. Put both back as committed (`git checkout -- disk/zuse-scratch`) +**The disks (plan 2026-10-29-stick-5, Task 3, 2026-11-08):** with no identity the system is +headless -- no prompt -- so every boot needs Zuse. A v4 `qemu` boot attaches a **fresh data stick** +(`DATASTICK`, `make ... datastick`, `build//kernel/datastick.img`: identity and Artemis +partitions, made fresh for every boot) and nothing else: its first boot mints the stick's proxy +Zuse (STICK.md §6), so **every acceptance run is a first boot** -- plug and play. `DATASTICK=` +boots v4 with no drive (headless). The minted Zuse pair (`disk/zuse-scratch/`, `disk/README.md`) +is for the tests that ask for it by name (`scripts/qemu_session.py`: `stick_zuse`, `two_sticks`, +`stick_artemis`, `raw_ident`, `v3_keys`, the hot-plug and GPT modes) and for `system=v3`, whose +defaults are unchanged: `ARTDISK` the pair's Artemis, `ZUSEDISK` the pair as a stick (v3 reads +identity drives raw, so a `system=v3` boot needs `ZUSEDISK=disk/zuse-scratch/zuse-thumb-ident.img`, +a copy, to log Zuse in). Put the pair back as committed (`git checkout -- disk/zuse-scratch`) before each architecture. The prompt is `[zuse@Hera] ok> `. Do not claim a change is accepted until all three architectures have booted, and their logs are @@ -343,7 +347,7 @@ present in `logs/`: the three; - **the PC stick loaded high** (Captain Bob, 2026-10-29, after the SER5 page-faulted in the loader -- q35 always loads the image below 2 GiB, a PC's firmware does not; `FABRIC-3.md` - §XLIV): `qemu-stick-high` to `[zuse@Hera] ok> ` with the same `PARITY:V4_POST ... fail=0` and + §XLIV): `qemu-stick-high` -- the stick as built, a first boot -- to `[zuse@Hera] ok> ` with the same `PARITY:V4_POST ... fail=0` and `POST: PASSED`. The amd64 link also refuses any 32-bit absolute or GOT relocation in the image; don't work around that check, fix the code it names; - **the 32-bit build** (Captain Bob, 2026-10-14: "the 32 bit build needs to go into the diff --git a/disk/README.md b/disk/README.md index 039c18d0..55d7ec5c 100644 --- a/disk/README.md +++ b/disk/README.md @@ -168,7 +168,14 @@ carrying timestamp noise in git history. image's bytes, each exactly its file's size), fresh before every boot, and that is `ZUSEDISK`'s default; `make boot_image TARGET=PC STICK_PAIR=disk/zuse-scratch` puts the pair in the PC stick the same way. - The files here are unchanged. Increment 5 retires the pair. + The files here are unchanged. + + **For tests and v3 only (2026-11-08, plan 2026-10-29-stick-5, Task 3):** a + v4 `qemu` boot no longer attaches the pair; it attaches a fresh data stick, + whose first boot mints its own Zuse. The pair stays for the tests that ask + for a known Zuse by name (`scripts/qemu_session.py`'s `stick_zuse`, + `two_sticks`, `stick_artemis`, `raw_ident`, `v3_keys`, the hot-plug and GPT + modes) and as the defaults of a `system=v3` boot. - **The StarshipOS stick and data stick are not here** (2026-10-27, `docs/v4.0.0/STICK.md` §4, §9): they are build output, made fresh by diff --git a/docs/v4.0.0/STICK.md b/docs/v4.0.0/STICK.md index f3edfd16..1910a967 100644 --- a/docs/v4.0.0/STICK.md +++ b/docs/v4.0.0/STICK.md @@ -352,6 +352,9 @@ first and seen to fail: `qemu` targets behind `DATASTICK=1`, off by default -- until increments 4 and 5 the kernel cannot take Artemis from it or mint Zuse onto it, so as the default it would leave every acceptance boot headless. Increment 5 turns it on and retires the scratch pair and the virtio disk. + **Done 2026-11-08** (plan `2026-10-29-stick-5`, Task 3): a v4 `qemu` boot attaches a fresh data + stick and nothing else; the scratch pair stays only for the tests that ask for it and for + `system=v3`. 4. **Artemis and Zuse from one disk:** the boot device from the loader, the partitions found and attached, virtio Artemis off the v4 path; recognition of a minted stick; entropy on the v4 path; `system=v3` refused on a stick (§4, §5). @@ -361,6 +364,8 @@ first and seen to fail: recorded) and a 4 GB one (below the minimum: not grown, said so). **Amended 2026-10-29:** the genesis is the proxy's, with the version 2 marker (§6); the fresh stick's first boot reaching `[zuse@Hera] ok>` with nothing set up is the test of plug and play. + **Done 2026-11-08** (plan `2026-10-29-stick-5`, Tasks 1-3; `FABRIC-3.md` XLVIII.8-9): growth is + capped at 256 GiB (R1); every acceptance run is now a first boot. 5a. **The real Zuse stick (2026-10-29)** (§6a): `MINT-ZUSE` and its confirmation, the GPT and identity written to the second stick, the marker's real key; recognition of the real Zuse stick; the fixed screen and its R; the old stick refused after a replacement. diff --git a/experiments/bare_metal/runs/doe-amd64-20261108-130732.csv b/experiments/bare_metal/runs/doe-amd64-20261108-130732.csv new file mode 100644 index 00000000..e69de29b diff --git a/kernel/Makefile b/kernel/Makefile index 6a6c0c0a..6ce5b28d 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -134,12 +134,17 @@ DOE_RUNS_DIR := experiments/bare_metal/runs DOE_LATEST_DIR := experiments/bare_metal/latest CAPSULES_DIR ?= capsules -# ARTDISK and ZUSEDISK default to the minted Zuse pair (disk/zuse-scratch/, +# The disks a `qemu` boot attaches (plan 2026-10-29-stick-5, Task 3; STICK.md 9). A v4 boot -- every +# boot but `system=v3` -- attaches a fresh data stick (DATASTICK, below) and nothing else: every +# acceptance run is a first boot, the proxy Zuse minted on it, the prompt with nothing set up. A +# `system=v3` boot (KERNEL_ARGS) keeps the defaults it has always had: the minted pair below. +QEMU_V3_BOOT := $(findstring system=v3,$(KERNEL_ARGS)) +# For system=v3: ARTDISK and ZUSEDISK default to the minted Zuse pair (disk/zuse-scratch/, # disk/README.md; Captain Bob, 2026-10-26, the identity gate's D4): with no # identity drive the system is headless, so a boot with the blank # disk/artemis.img and thumbdrives/zuse-thumb-ident.img never reaches a # prompt. The two are a pair: Zuse's genesis marker is on that Artemis disk. -ARTDISK ?= disk/zuse-scratch/artemis.img +ARTDISK ?= $(if $(QEMU_V3_BOOT),disk/zuse-scratch/artemis.img) # ARTDISK= (empty) attaches no virtio disk. Since 2026-10-28 the v4 boot takes Artemis only from the # stick (docs/v4.0.0/plans/2026-10-27-stick-4-one-disk.md, Task 4); ARTDISK stays for system=v3. # Precomputed for the same comma reason as ZUSEDISK_QEMU_ARGS below. @@ -190,7 +195,7 @@ XHCI_ARGS_SLOT4 := $(if $(strip $(XHCI_QEMU_ARGS)),$(XHCI_QEMU_ARGS),$(XHCI_D # fresh for every boot), identity and Artemis partitions on one disk, as STICK.md 4 has them. ZUSE_PAIR ?= disk/zuse-scratch ZUSESTICK_IMG = $(BUILD_DIR)/zusestick.img -ZUSEDISK ?= $(ZUSESTICK_IMG) +ZUSEDISK ?= $(if $(QEMU_V3_BOOT),$(ZUSESTICK_IMG)) ZUSESTICK_DEP = $(if $(filter $(ZUSESTICK_IMG),$(ZUSEDISK)),zusestick) # Precomputed (not inlined as $(if ...,...)) because the drive/device specs # below are comma-heavy and GNU make's $(if) function splits its own @@ -203,12 +208,12 @@ ZUSEDISK_QEMU_ARGS := -drive if=none,id=zusedrv,file=$(ZUSEDISK),format=raw -dev else ZUSEDISK_QEMU_ARGS := endif -# DATASTICK -- set to 1 to attach the data stick (`make ... datastick`: StarshipOS identity -# and Artemis partitions, no ESP, made fresh before the boot) over USB on port 2, beside the -# disks above (docs/v4.0.0/STICK.md 9). Off by default until the first boot of a fresh data -# stick can mint Zuse (increment 5, which turns it on and retires ARTDISK/ZUSEDISK; -# docs/v4.0.0/plans/2026-10-27-stick-3-images.md, ruled 2026-10-27). -DATASTICK ?= +# DATASTICK -- 1 attaches the data stick (`make ... datastick`: StarshipOS identity and Artemis +# partitions, no ESP, made fresh before the boot) over USB on port 2 (docs/v4.0.0/STICK.md 9). +# On by default for a v4 boot since a fresh data stick's first boot mints Zuse (plan +# 2026-10-29-stick-5, Task 3, as stick-3's ruling of 2026-10-27 set out); off for system=v3. +# DATASTICK= boots v4 with no drive at all (headless). +DATASTICK ?= $(if $(QEMU_V3_BOOT),,1) ifneq ($(strip $(DATASTICK)),) DATASTICK_QEMU_ARGS = -drive if=none,id=datadrv,file=$(DATASTICK_IMG),format=raw -device usb-storage,bus=xhci0.0,port=2,drive=datadrv DATASTICK_DEP := datastick diff --git a/logs/20261108-130732/amd64/qemu-amd64-20261108-130732.log b/logs/20261108-130732/amd64/qemu-amd64-20261108-130732.log new file mode 100644 index 00000000..02b879d1 --- /dev/null +++ b/logs/20261108-130732/amd64/qemu-amd64-20261108-130732.log @@ -0,0 +1,161 @@ +[=3h[=3h[=3hBdsDxe: loading Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0) +BdsDxe: starting Boot0001 "UEFI QEMU DVD-ROM QM00005 " from PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x2,0xFFFF,0x0) +[=3hStarKernel UEFI Loader +Loading kernel from ESP... +[CKPT 001] Entered efi_main - ConOut live +RAW SERIAL UP +[CKPT 002] Serial (COM1) initialized +Monolithic build - kernel linked directly +Collecting boot information... +CmdLine: parsed OK +[CKPT 004] Command line parsed +[CKPT 005] Kernel stack allocation decided +[CKPT 006] Boot info collected (ACPI table located) +GOP: linear framebuffer found +[CKPT 007] GOP: linear framebuffer found +[CKPT 008] About to enter ExitBootServices retry loop +EBS... +EBS OK +Calling kernel_main (monolithic)... + + + _____ _ _ __ _ + / ____| | | |/ / | | + | (___ | |_ __ _ _ __| ' / ___ _ __ _ __ ___| | + \___ \| __/ _` | '__| < / _ \ '__| '_ \ / _ \ | + ____) | || (_| | | | . \ __/ | | | | | __/ | + |_____/ \__\__,_|_| |_|\_\___|_| |_| |_|\___|_| + +LithosAnanke v4.0.0-alpha.3 amd64 +Architecture: amd64 +Build: Nov 8 2026 13:06:58 + +UEFI BootServices: EXITED +Console: serial line is a 16550 at port 0x00000000000003f8 (COM1, probed) + +=== StarKernel Boot Information === +Memory map entries: 126 +Total memory: 1023 MB +Usable memory: 967 MB +=================================== + +PMM initialized. +PMM statistics: + Total pages: 248946 + Free pages : 247419 + Used pages : 1527 + Total MB : 972 + Free MB : 966 + Used MB : 5 + +VMM initialized (mapped RAM, CR3 switched) +VMM initialized (mapped RAM, CR3 switched) +VMM self-test: mapped OK at 0xffff800000000000 +VMM self-test complete. + +IDT installed. + +APIC: init... +APIC: IA32_APIC_BASE MSR=0x00000000fee00900 +APIC: stale-ISR drain: 0 EOI(s) issued +APIC: initialized (xAPIC MMIO, TPR=0, SIVR=0x1FF, EOI-clear) +APIC: init done + +I/O APIC: init... +I/O APIC: base=0xfec00000, gsi_base=0, overrides=5 + override: source=00 gsi=2 flags=0x0000 + override: source=05 gsi=5 flags=0x000d + override: source=09 gsi=9 flags=0x000d + override: source=0a gsi=10 flags=0x000d + override: source=0b gsi=11 flags=0x000d +i8042: keyboard ACKed enable-scanning +i8042: IRQ1 enabled in controller config byte +I/O APIC: keyboard IRQ1 routed (masked) + +Timer: init... +Timer: init start +Timer: PM_TMR_BLK discovered from FADT at port 1544 +Timer: VM mode detected (hypervisor present). +Timer: HPET calibration disabled (VM-exit MMIO would poison timing). +Timer: WARNING: invariant TSC not present under hypervisor. +Timer: continuing in RELATIVE mode (no determinism guarantees). +Timer: RDTSCP not present; using RDTSC (less serialized). +Timer: CPUID frequency unavailable; trying PM Timer... +Timer: trust=1 (0=NONE,1=REL,2=ABS), TSC=2090276162 Hz +Timer: init done + +Kernel heap initialized. +Heap statistics: + Total bytes: 536870872 + Free bytes: 536870872 + Used bytes: 0 + Peak bytes: 0 + Heap base addr: 24641536 + Heap end addr: 561512448 + +Heartbeat: init... +APIC Timer: calibrating... +APIC Timer: apic_hz=1005501029, tick_hz=100, initial_count=10055010 +APIC Timer: configured (masked, ready to start) +Heartbeat: init done +Kernel initialization complete. +Boot successful! + +Boot disk: not a StarshipOS stick +System: StarForth v4 (this build's default) +StarForth v4: one host node, the F18-derived engine +V4: capsule v4:sys:map-64.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:map-64.f18 capsule_hash=0x949eb6a1e9260e49 +V4: capsule v4:sys:core.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:core.f18 capsule_hash=0xb8f167892ec18c28 +V4: capsule v4:sys:input.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:input.f18 capsule_hash=0x85d3ec486d929a79 +V4: capsule v4:sys:dict.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:dict.f18 capsule_hash=0x1379bd3b5de811dc +V4: capsule v4:sys:codegen.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:codegen.f18 capsule_hash=0x36d2ae84d2911b90 +V4: capsule v4:sys:compile.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:compile.f18 capsule_hash=0x11145c4c2ab819d8 +V4: capsule v4:sys:quit.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:quit.f18 capsule_hash=0x43cadf3b21ddbf3e +V4: capsule v4:sys:forth.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:forth.f18 capsule_hash=0x16cab4a1268b85da +V4: capsule v4:sys:numout.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:numout.f18 capsule_hash=0x85a240ad3fb2b299 +V4: capsule v4:sys:words.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:words.f18 capsule_hash=0xb1d381f927d9f14e +V4: capsule v4:sys:system.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:system.f18 capsule_hash=0xd92203664c2915bd +V4: capsule v4:sys:qmath.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:qmath.f18 capsule_hash=0xdb4140713dd857f3 +V4: capsule v4:sys:blocks.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:blocks.f18 capsule_hash=0x76307ef48678dc2a +V4: capsule v4:sys:log.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:log.f18 capsule_hash=0xfc6540e6b824a52b +V4: capsule v4:sys:acl.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:acl.f18 capsule_hash=0x6845aa048db7eb22 +V4: capsule v4:sys:end.f18 signature: missing (unsigned) +PARITY:V4_F18 name=v4:sys:end.f18 capsule_hash=0x5ef01312c07b79cc +PARITY:V4_ROM words=2372 rom_hash=0x87b23d3ae2643c8d instructions=59145258 +V4: capsule v4:forth79.4th signature: missing (unsigned) +PARITY:V4_CAPSULE name=v4:forth79.4th capsule_id=0x4055641ee17d176b capsule_hash=0x4055641ee17d176b dict_hash=0x033e1c05c09a1df8 +PARITY:V4_POST tests=538 pass=538 fail=0 +PARITY:V4_SYSTEM word_count=317 dict_hash=0xfec8c47cfc6f437f +PARITY:OK +POST: PASSED +PCI: init... +PCI: ECAM mapped (amd64) +virtio-rng: no device on PCI bus 0 +rng: backend = rdrand +entropy: ready +virtio-input: no device on PCI bus 0 +Starting heartbeat... +APIC Timer: started (LVT=0x00020020 ICR=10055010) +I/O APIC: keyboard IRQ1 unmasked +Heartbeat running. +blkio_usb: MSC device ready +Artemis: the stick's partition attached +[Hera] Zuse: identity confirmed from attached thumbdrive +[zuse@Hera] ok> 3 4 + . +[zuse@Hera] 7 ok +[zuse@Hera] ok>  \ No newline at end of file diff --git a/scripts/nightly.sh b/scripts/nightly.sh index f7bfad37..729a9534 100755 --- a/scripts/nightly.sh +++ b/scripts/nightly.sh @@ -94,7 +94,9 @@ accept) amd64) rm -rf "$OUT"; mkdir -p "$OUT"; touch "$OUT/.started" # the first stage mode=zuse; arch=amd64; extra= ;; aarch64|riscv64) mode=zuse; arch=$what; extra= ;; - stick-high) mode=stick_zuse; arch=amd64; extra="--target qemu-stick-high" ;; + # the PC stick as built, loaded high: its first boot mints its own Zuse (plan + # 2026-10-29-stick-5, Task 3 -- it was the stick with the minted pair, stick_zuse) + stick-high) mode=stick_genesis; arch=amd64; extra="--target qemu-stick-high" ;; *) usage ;; esac need "$OUT/.started" diff --git a/scripts/qemu_session.py b/scripts/qemu_session.py index 30e17700..2ed7a68c 100755 --- a/scripts/qemu_session.py +++ b/scripts/qemu_session.py @@ -4,9 +4,12 @@ scripts/qemu_session.py MODE ARCH [--label L] [--make "VAR=val ..."] [--no-zuse] Builds and boots `make ARCH= clean qemu` (one QEMU, in the foreground of -this script), with copies of the minted Zuse pair (disk/zuse-scratch/) made -under build/qemu-session/