boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

commit dcd943c71dc2e62e286ab77c062d55083b6921ff
parent 169712546ddf9aaaa6d2e1e0c71d9299cef534d3
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Tue,  5 May 2026 12:03:12 -0700

boot{0,1,2} + seed-accept: switch seed driver to virtio-blk extract

Mirrors the kernel-side transport change: pad cpio to 512 bytes, hand
QEMU two virtio-blk-device disks (hd0 ro inputs, hd1 SEEDFS output),
recover artefacts via extract-blk.sh instead of grepping the UART
transcript for DUMP-BEGIN/END.

Diffstat:
Mscripts/boot0.sh | 2+-
Mscripts/boot1.sh | 2+-
Mscripts/boot2.sh | 2+-
Mscripts/lib-pipeline.sh | 32+++++++++++++++++++++-----------
Mscripts/seed-accept.sh | 30+++++++++++++++++++-----------
5 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/scripts/boot0.sh b/scripts/boot0.sh @@ -49,7 +49,7 @@ case "$DRIVER" in seed) [ "$ARCH" = "aarch64" ] || { echo "[boot0] DRIVER=seed: aarch64 only" >&2; exit 2; } KERNEL_IMAGE=$ROOT/seed-kernel/build/Image - EXTRACT=$ROOT/seed-kernel/scripts/extract-dump.sh + EXTRACT=$ROOT/seed-kernel/scripts/extract-blk.sh [ -f "$KERNEL_IMAGE" ] || { echo "[boot0] missing $KERNEL_IMAGE — make in seed-kernel/" >&2; exit 1; } export KERNEL_IMAGE EXTRACT ;; *) echo "[boot0] unknown DRIVER=$DRIVER" >&2; exit 2 ;; diff --git a/scripts/boot1.sh b/scripts/boot1.sh @@ -59,7 +59,7 @@ case "$DRIVER" in seed) [ "$ARCH" = "aarch64" ] || { echo "[boot1] DRIVER=seed: aarch64 only" >&2; exit 2; } KERNEL_IMAGE=$ROOT/seed-kernel/build/Image - EXTRACT=$ROOT/seed-kernel/scripts/extract-dump.sh + EXTRACT=$ROOT/seed-kernel/scripts/extract-blk.sh [ -f "$KERNEL_IMAGE" ] || { echo "[boot1] missing $KERNEL_IMAGE — make in seed-kernel/" >&2; exit 1; } export KERNEL_IMAGE EXTRACT ;; *) echo "[boot1] unknown DRIVER=$DRIVER" >&2; exit 2 ;; diff --git a/scripts/boot2.sh b/scripts/boot2.sh @@ -67,7 +67,7 @@ case "$DRIVER" in seed) [ "$ARCH" = "aarch64" ] || { echo "[boot2] DRIVER=seed: aarch64 only" >&2; exit 2; } KERNEL_IMAGE=$ROOT/seed-kernel/build/Image - EXTRACT=$ROOT/seed-kernel/scripts/extract-dump.sh + EXTRACT=$ROOT/seed-kernel/scripts/extract-blk.sh [ -f "$KERNEL_IMAGE" ] || { echo "[boot2] missing $KERNEL_IMAGE — make in seed-kernel/" >&2; exit 1; } export KERNEL_IMAGE EXTRACT ;; *) echo "[boot2] unknown DRIVER=$DRIVER" >&2; exit 2 ;; diff --git a/scripts/lib-pipeline.sh b/scripts/lib-pipeline.sh @@ -7,8 +7,9 @@ # podman — accumulate stages into one /work/run.sh, run once in a # container against $IMAGE / $PLATFORM (env-set by caller). # seed — run each stage as one qemu boot of seed-kernel via -# tier1-gate.sh's pattern (cpio /init + inputs, dump tmpfs -# over UART, extract). aarch64 only. +# tier1-gate.sh's pattern (cpio /init + inputs on virtio-blk +# hd0, output dumped to virtio-blk hd1 as SEEDFS, extract). +# aarch64 only. # # DSL (source as `. scripts/lib-pipeline.sh`): # @@ -116,16 +117,27 @@ _stage_seed() { NAMES="$NAMES $inp" done - INITRAMFS=$cpio_dir/initramfs.cpio - ( cd "$cpio_dir/cpio" && printf '%s\n' "$NAMES" | cpio -o -H newc 2>/dev/null ) > "$INITRAMFS" + ( cd "$cpio_dir/cpio" && printf '%s\n' "$NAMES" | cpio -o -H newc 2>/dev/null ) > "$cpio_dir/initramfs.cpio" + sz=$(wc -c < "$cpio_dir/initramfs.cpio") + pad=$(( (512 - sz % 512) % 512 )) + if [ "$pad" -gt 0 ]; then + head -c "$pad" /dev/zero >> "$cpio_dir/initramfs.cpio" + fi + mv "$cpio_dir/initramfs.cpio" "$cpio_dir/in.img" + truncate -s 256M "$cpio_dir/out.img" - APPEND="$bin$P_HEAD dumpfs" + APPEND="$bin$P_HEAD" TRANSCRIPT=$cpio_dir/transcript.txt echo "[lib-pipeline:seed] stage $P_IDX:$P_HEAD (bin=$bin)" >&2 qemu-system-aarch64 \ -machine virt,gic-version=3,accel=hvf -cpu host -m 2048M \ -nographic -no-reboot \ - -kernel "$KERNEL_IMAGE" -initrd "$INITRAMFS" \ + -global virtio-mmio.force-legacy=false \ + -kernel "$KERNEL_IMAGE" \ + -drive file="$cpio_dir/in.img",if=none,format=raw,id=hd0,readonly=on \ + -device virtio-blk-device,drive=hd0 \ + -drive file="$cpio_dir/out.img",if=none,format=raw,id=hd1 \ + -device virtio-blk-device,drive=hd1 \ -append "$APPEND" \ > "$TRANSCRIPT" 2>&1 & QPID=$! @@ -134,15 +146,13 @@ $inp" wait $QPID 2>/dev/null || true kill $WATCHER 2>/dev/null || true - if ! grep -q '=== DUMP-END ===' "$TRANSCRIPT"; then - echo "[lib-pipeline:seed] FAIL stage $P_IDX (bin=$bin): no DUMP-END" >&2 + mkdir -p "$cpio_dir/dump" + if ! "$EXTRACT" "$cpio_dir/dump" "$cpio_dir/out.img" >/dev/null 2>&1; then + echo "[lib-pipeline:seed] FAIL stage $P_IDX (bin=$bin): extract-blk failed" >&2 tail -40 "$TRANSCRIPT" >&2 exit 3 fi - mkdir -p "$cpio_dir/dump" - "$EXTRACT" "$cpio_dir/dump" "$TRANSCRIPT" >/dev/null 2>&1 || true - for o in $P_OUT; do if [ ! -f "$cpio_dir/dump/$o" ]; then echo "[lib-pipeline:seed] FAIL stage $P_IDX: missing output '$o'" >&2 diff --git a/scripts/seed-accept.sh b/scripts/seed-accept.sh @@ -24,7 +24,7 @@ ROOT=$(cd "$(dirname "$0")/.." && pwd) cd "$ROOT" KERNEL=seed-kernel/build/Image -EXTRACT=seed-kernel/scripts/extract-dump.sh +EXTRACT=seed-kernel/scripts/extract-blk.sh SCHEME1=build/$ARCH/boot2/scheme1 CATM=build/$ARCH/boot2/catm PRELUDE=scheme1/prelude.scm @@ -93,16 +93,27 @@ combined.scm A B' -INITRAMFS=$STAGE/initramfs.cpio -( cd "$STAGE/cpio" && printf '%s\n' "$NAMES" | cpio -o -H newc 2>/dev/null ) > "$INITRAMFS" +( cd "$STAGE/cpio" && printf '%s\n' "$NAMES" | cpio -o -H newc 2>/dev/null ) > "$STAGE/initramfs.cpio" +sz=$(wc -c < "$STAGE/initramfs.cpio") +pad=$(( (512 - sz % 512) % 512 )) +if [ "$pad" -gt 0 ]; then + head -c "$pad" /dev/zero >> "$STAGE/initramfs.cpio" +fi +mv "$STAGE/initramfs.cpio" "$STAGE/in.img" +truncate -s 256M "$STAGE/out.img" TRANSCRIPT=$OUTDIR/transcript.txt echo "[seed-accept] booting scheme1 + driver.scm on seed-kernel" qemu-system-aarch64 \ -machine virt,gic-version=3,accel=hvf -cpu host -m 2048M \ -nographic -no-reboot \ - -kernel "$KERNEL" -initrd "$INITRAMFS" \ - -append "init combined.scm dumpfs" \ + -global virtio-mmio.force-legacy=false \ + -kernel "$KERNEL" \ + -drive file="$STAGE/in.img",if=none,format=raw,id=hd0,readonly=on \ + -device virtio-blk-device,drive=hd0 \ + -drive file="$STAGE/out.img",if=none,format=raw,id=hd1 \ + -device virtio-blk-device,drive=hd1 \ + -append "init combined.scm" \ > "$TRANSCRIPT" 2>&1 & QPID=$! ( sleep 240; kill -9 $QPID 2>/dev/null ) </dev/null >/dev/null 2>&1 & @@ -110,16 +121,13 @@ WATCHER=$! wait $QPID 2>/dev/null || true kill $WATCHER 2>/dev/null || true -if ! grep -q '=== DUMP-END ===' "$TRANSCRIPT"; then - echo "[seed-accept] FAIL: no DUMP-END in transcript" >&2 +# Extract files (we want C from the tmpfs). +if ! "$EXTRACT" "$OUTDIR" "$STAGE/out.img" >/dev/null 2>&1; then + echo "[seed-accept] FAIL: extract-blk failed (kernel didn't reach exit?)" >&2 tail -60 "$TRANSCRIPT" >&2 exit 3 fi -# Extract files (we want C from the tmpfs). -"$EXTRACT" "$OUTDIR" "$TRANSCRIPT" >/dev/null 2>&1 || \ - "$EXTRACT" "$OUTDIR" "$TRANSCRIPT" >&2 - # ─── Verify ─────────────────────────────────────────────────────────── fail=0 for needle in \