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:
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 \