- build-kernel.sh fragment assertion: survives a missing trailing newline (the read footgun, reproduced) and treats an absent symbol on a disable line as FATAL, symmetric with the enable arm. - fetch-kernel-tarball.sh checks the pin before downloading; both fetchers add --retry-connrefused. - mkimage rejects '.'/'..' state keys. - ui-shot: VM liveness checked before every QMP call, console.log preserved as evidence on every failure path, repaint deadline widened to 90s with the contended-runner rationale documented. - rs485-bridge: overflow discards back off one gap and rate-limit their log line, mirroring the accept-loop fix; clippy nit fixed. - .gitignore ignores *.elf/*.map so the untracked artifacts cannot silently return; CI shellcheck glob now covers build/ and the rootfs boot scripts (directives added for the deliberate in-guest source paths). - Docs: NPU parity row matches its sibling verification docs; line-pinned audit cross-references unpinned; CROSS_COMPILE documented in the build header; payload README lists warden-ui; ci-cd tense settled. Verified: guards negative-tested (bad state keys, no-newline fragment); boot smoke, portal scenario, ui-shot all PASS; 53 tests green; shellcheck clean across the widened glob; clippy zero. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018HUayid7W5w7jBdb9Rrj1K
44 lines
1.5 KiB
Bash
44 lines
1.5 KiB
Bash
# shellcheck shell=sh
|
|
# Shared helpers for the VM's stage-1 (/init + /etc/rc, initramfs) and stage-2
|
|
# (/sbin/init, disk rootfs) boot scripts. Present in both filesystems because
|
|
# both are staged from the same qemu/rootfs/ skeleton. ONE copy of each rule —
|
|
# the slot-validation drift between two hand-copied parsers was a real
|
|
# review finding.
|
|
|
|
# Populate /dev/block/by-name/<PARTNAME> symlinks from sysfs uevents — the
|
|
# contract flare-edge's slotctl.rs relies on. blkdevparts= gives every vda
|
|
# partition a PARTNAME.
|
|
warden_populate_by_name() {
|
|
mkdir -p /dev/block/by-name
|
|
for uev in /sys/class/block/vda*/uevent; do
|
|
[ -f "$uev" ] || continue
|
|
partname=""
|
|
devname=""
|
|
while IFS='=' read -r k v; do
|
|
case "$k" in
|
|
PARTNAME) partname="$v" ;;
|
|
DEVNAME) devname="$v" ;;
|
|
esac
|
|
done < "$uev"
|
|
[ -n "$partname" ] && [ -n "$devname" ] \
|
|
&& ln -sf "/dev/$devname" "/dev/block/by-name/$partname"
|
|
done
|
|
}
|
|
|
|
# Parse warden.slot= from the cmdline (whole-token, never substring) and
|
|
# VALIDATE it — echoes "_a" or "_b", falling back to _a with a warning.
|
|
warden_slot() {
|
|
slot="_a"
|
|
# shellcheck disable=SC2013 # cmdline TOKENS are the unit here, not lines
|
|
for tok in $(cat /proc/cmdline); do
|
|
case "$tok" in
|
|
warden.slot=*) slot="${tok#warden.slot=}" ;;
|
|
esac
|
|
done
|
|
case "$slot" in
|
|
_a|_b) ;;
|
|
*) echo "warden-lib: bad warden.slot='$slot', falling back to _a" >&2; slot="_a" ;;
|
|
esac
|
|
echo "$slot"
|
|
}
|