wip(build): acceptance boots a fresh data stick -- every run is a first boot (#92, Task 3) [skip ci]
Not yet accepted (plan 2026-10-29-stick-5, Task 3). - kernel/Makefile: a v4 `qemu` boot attaches a fresh data stick (DATASTICK=1) and nothing else; ARTDISK/ZUSEDISK keep the minted pair only for system=v3 (QEMU_V3_BOOT, from KERNEL_ARGS). - qemu_session.py: the Makefile's defaults for every mode but those that ask for the pair by name (stick_artemis, two_sticks, artemis_unsigned, raw_ident, v3_keys) or for no drive; `zuse` now expects the genesis line. - nightly.sh: accept stick-high runs stick_genesis (the stick as built). - .claude/CLAUDE.md "The disks", the stick-high line; disk/README.md (the pair: tests and v3 only); STICK.md 11, increments 3 and 5 done. Before the change: zuse on amd64 FAIL -- the pair's "identity confirmed", no genesis line (logs/20261108-130732). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
This commit is contained in:
+15
-11
@@ -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/<arch>/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/<arch>/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
|
||||
|
||||
+8
-1
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
+14
-9
@@ -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
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
[2J[01;01H[=3h[2J[01;01H[2J[01;01H[=3h[2J[01;01H[2J[01;01H[=3h[2J[01;01HBdsDxe: 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)
|
||||
[2J[01;01H[=3h[2J[01;01HStarKernel 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
|
||||
[38;2;255;165;0m[Hera][39m Zuse: identity confirmed from attached thumbdrive
|
||||
[38;2;255;165;0m[zuse@Hera][39m [38;2;85;255;255mok> [39m3 4 + .
|
||||
[38;2;255;165;0m[zuse@Hera][39m 7 ok
|
||||
[38;2;255;165;0m[zuse@Hera][39m [38;2;85;255;255mok> [39m
|
||||
+3
-1
@@ -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"
|
||||
|
||||
+21
-8
@@ -4,9 +4,12 @@
|
||||
scripts/qemu_session.py MODE ARCH [--label L] [--make "VAR=val ..."] [--no-zuse]
|
||||
|
||||
Builds and boots `make ARCH=<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/<label>/ so the committed images are never booted;
|
||||
Zuse's drive is that pair laid out as a stick (zusestick.img).
|
||||
this script). Its disks are the Makefile's defaults -- on v4, a fresh data stick
|
||||
and nothing else, so every boot is a first boot (plan 2026-10-29-stick-5,
|
||||
Task 3) -- except for the modes that ask for the minted Zuse pair
|
||||
(disk/zuse-scratch/) by name: copies of it, made under
|
||||
build/qemu-session/<label>/ so the committed images are never booted, laid out
|
||||
as a stick (zusestick.img), or her raw identity image for v3.
|
||||
It reads the serial socket continuously, drives the boot over the serial and
|
||||
QMP sockets the `qemu` goal opens, prints PASS:/FAIL: lines and
|
||||
RESULT: PASS|FAIL, and quits QEMU over QMP. The serial log is the usual
|
||||
@@ -15,7 +18,8 @@ logs/<TS>/<arch>/qemu-<arch>-<TS>.log.
|
||||
Modes (the identity gate's, plan 2026-10-26-engine-step4-identity-gate.md, and
|
||||
the stick's, plan 2026-10-26-stick-1-screen-and-keyboard.md):
|
||||
headless no Zuse drive: POST: PASSED, then no `ok> ` for 60 s
|
||||
zuse the minted pair: identity confirmed, [zuse@Hera] ok>, `3 4 + .` -> 7 ok
|
||||
zuse the default disks, a fresh data stick: the genesis line, [zuse@Hera] ok>,
|
||||
`3 4 + .` -> 7 ok (plan 2026-10-29-stick-5, Task 3: it was the minted pair)
|
||||
hotplug no drive; Zuse added over QMP -> prompt; pulled -> session ended,
|
||||
headless; added again -> prompt
|
||||
midpull pulled while a line is in hand: what is typed after does not run
|
||||
@@ -127,15 +131,23 @@ if a.mode == "artemis_unsigned":
|
||||
with open(unsigned, "r+b") as f:
|
||||
f.seek(sig_at)
|
||||
f.write(bytes(4096))
|
||||
attach_zuse = not (a.no_zuse or a.mode in NO_ZUSE_MODES)
|
||||
# the modes that ask for the minted pair by name (plan 2026-10-29-stick-5, Task 3); the others
|
||||
# boot the Makefile's defaults, or no drive at all
|
||||
PAIR_MODES = {"stick_artemis", "two_sticks", "artemis_unsigned", "raw_ident", "v3_keys"}
|
||||
|
||||
# v3 reads identity drives raw, never through a GPT (only the v4 path reads one: sk_v4_identity.c),
|
||||
# so a system=v3 boot gets Zuse's raw identity image, not her stick (plan 2026-10-27-stick-4, R2)
|
||||
zdrive = {"v3_keys": ident, "raw_ident": ident}.get(a.mode, zimg)
|
||||
if a.mode == "artemis_unsigned":
|
||||
zdrive = unsigned
|
||||
make_args = ["make", "-f", "kernel/Makefile", f"ARCH={a.arch}", "clean", a.target, f"ARTDISK={art}",
|
||||
f"ZUSEDISK={zdrive if attach_zuse else ''}"] + shlex.split(a.make)
|
||||
make_args = ["make", "-f", "kernel/Makefile", f"ARCH={a.arch}", "clean", a.target]
|
||||
if a.mode in PAIR_MODES:
|
||||
make_args += [f"ZUSEDISK={zdrive}", "DATASTICK="]
|
||||
elif a.no_zuse or a.mode in NO_ZUSE_MODES:
|
||||
make_args += ["ZUSEDISK=", "DATASTICK="] # no drive at boot
|
||||
if a.mode == "v3_keys":
|
||||
make_args.append(f"ARTDISK={art}") # v3's Artemis is the virtio disk
|
||||
make_args += shlex.split(a.make)
|
||||
if a.mode in ("v3_keys", "stick_v3"):
|
||||
make_args.append("KERNEL_ARGS=system=v3")
|
||||
if a.mode == "screen_boot":
|
||||
@@ -384,7 +396,8 @@ if m == "headless":
|
||||
elif m == "zuse":
|
||||
check("Boot disk: not a StarshipOS stick (an ISO or ESP boot)",
|
||||
re.search(r"Boot disk: not a StarshipOS stick", text()) is not None, near=r"Boot successful!")
|
||||
check("Zuse: identity confirmed", wait_for(r"Zuse: identity confirmed from attached thumbdrive", 120))
|
||||
check("Zuse: genesis minted onto attached thumbdrive (a fresh data stick)",
|
||||
wait_for(r"Zuse: genesis minted onto attached thumbdrive", 180), near=r"Artemis: |Zuse: |USB: ")
|
||||
check("[zuse@Hera] ok>", wait_for(PROMPT, 60))
|
||||
n = count(PROMPT)
|
||||
type_line("3 4 + .")
|
||||
|
||||
Reference in New Issue
Block a user