Every guest boots the UEFI firmware the host's QEMU declares; ovmf/ and aavmf/ go - #572
Conversation
…nd aavmf/ go The tree carried its own firmware: ovmf/ (two images of unknown version and recipe, plus DEBUGX64_OVMF.fd, which nothing referenced) and aavmf/ (byte-identical to Homebrew QEMU 11.1.1's edk2-aarch64-code.fd and edk2-arm-vars.fd, sha256 47765fe3... and b3b855c5...). The owner ruled that firmware comes from the QEMU installation, inside "Rust and QEMU", and PR #563 made the kernel boot on QEMU's stock edk2. src/firmware.rs finds it the way QEMU's interop spec (docs/interop/firmware.json) tells management software to: every data directory `qemu-system-* -L help` names, `firmware/*.json` under each, taken in file-name order with an earlier directory's name hiding a later one's, and the first descriptor that declares UEFI flash firmware for the machine (pc-q35-<major.minor> or virt-<major.minor>, from `--version`) as a raw code image beside a raw variable-store template, without secure-boot or requires-smm. Nothing fits, and the boot is refused naming every descriptor read and every directory searched. Measured against Homebrew QEMU 11.1.1's eight descriptors (a checked patch, reverted): x86_64 resolves to 60-edk2-x86_64.json (edk2-x86_64-code.fd, edk2-i386-vars.fd), aarch64 to 60-edk2-aarch64.json (edk2-aarch64-code.fd, edk2-arm-vars.fd), and the binary's compiled-in paths (`strings`) are the two directories that probe read. Every boot gets a writable copy of the template of its own: the harness's beside the boot's other scratch in its lane (vars-<seq>.fd, deleted when the instance drops, as its own boot image is), `cargo run`'s at target/firmware-vars.fd, remade each launch. The update rig keeps its own copy across boots as before, now copied from the declared template. The x86 store was read-only and the aarch64 one a discarded snapshot; both are now one writable file per boot. On Debian the descriptors are the `ovmf` package's (Debian's edk2 build), a Recommends of qemu-system-x86 that the guest containers' apt line now names outright. CI's instrument line prints the firmware and descriptor each guest job ran on, and fails when none is declared. `qemu_version` is the one place that asks QEMU its version. Deleted with the files: their NOTICE sections, the five COMMITTED_FILES rows, the two licence texts only they cited, the README clause and the NOTICE sentence naming ovmf/, the fixture note's claim that the fixture's firmware is what every guest boots, and two issues whose premise was the committed firmware: ovmf-s-licence-record-names-no-openssl (the record goes with the files) and no-harness-test-boots-qemus-own-edk2 (every harness boot on a Homebrew host now does). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
|
CI never ran at head NOT READY FOR REVIEW |
|
Review of #572 at Measured here without booting anything:
BLOCKER
NOTE
REMOVE
SEND BACK |
…-L help, tighten the glob to a trailing-*, and give Arch the one q35/virt declaration The selection skipped $XDG_CONFIG_HOME|$HOME/.config/qemu/firmware and /etc/qemu/firmware, so a sysadmin's or user's override, or an emptied distro descriptor, was silently ignored even though the module header and the PR claimed to follow docs/interop/firmware.json's three-location search. Fixed, with a test that reds when either directory drops out of the list. Also: the three refused-descriptor cases (qcow2, requires-smm-only, mode "combined") are exercised in the selection test, each turning it red under the matching loosened filter; the machine glob is a trailing-* prefix match instead of a general fnmatch reader, since every descriptor measured uses at most one; Arch::machine gives x86_64/aarch64's q35/virt once, read by firmware.rs, qemu.rs and the harness; a copied variable-store template is made owner-writable regardless of the template's own mode, covered by a 0444-template test; CI's apt line and the sourcegate row name ovmf-generic, the package that actually carries the chosen descriptor. The no-harness-test-boots-qemus-own-edk2 issue stays open: nothing in this tree has run the guest boot its exit condition names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
|
Review of #572 at Net ( Earlier findings
BLOCKER
NOTE
REMOVE
SEND BACK |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
…and a loader line off the 16550
QEMU's own edk2 drives the virtio-serial port as a UEFI console. Firmware
and the loader write there before the kernel does: about 42 lines, the
loader's last one cut off at the handoff and fused onto the kernel's first
record. Every stdio reader took those lines as the kernel's console.
root_named_twice_on_the_boot_disk counted one loader read twice, and
c_capture_ignores_daemon_lines read the firmware's lines as userland's.
- src/kernelconsole.rs: `KernelConsole::pass` withholds a console's bytes
until the first `[kernel ` head, found anywhere in the stream (the fused
line) and across chunk boundaries, and passes everything after it. `HEAD`
is that head's one declaration, and `is_kernel_line` reads it. Three unit
tests: the fused line at every one-cut split and byte by byte, a port the
firmware left alone, and firmware alone. Each of three mutations reds them:
the split removed, the split only at a line start, and no tail held across
chunks.
- tests/common/qemu.rs: the reader thread passes a virtio profile's stdio
through it before `ConsoleStream`, the line channel and `boot_log`. A
16550 on stdio has no other file, so it is read whole.
- root_named_twice_on_the_boot_disk reads the loader's line from the 16550
alone.
Deleted:
- issues/build/no-harness-test-boots-qemus-own-edk2.md, whose exit is met;
- `Firmware::descriptor` and the instrument line's "as {} declares it";
- `each_arch_names_its_own_qemu_machine`;
- `Arch::machine`'s clause restating `machine_type`;
- the Drop comment's claim that firmware writes the 16550 and nowhere else.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
…ess issue to kind: tooling with a status that agrees with its owner, and reuse the Disconnected arm's uart_log read instead of adding a second one The ftruncate-flush-race issue named a rate and a refutation but nothing owed: it now names the actuator's owner and an exit a machine can check (the capture starts holding when set_len entered the kernel relative to the stall's start). Its two misleading sentences about #572 and about the redlist disable are deleted rather than reworded. The boot-timeout-verdict issue is the development machine, not the OS, so it moves to kind: tooling per issues/README.md, and its status moves to assigned to agree with its "held by the orchestrator" owner line. Its false claim that wait_for_ready reads uart_log only inside the Timeout arm is deleted (the Disconnected arm reads it too), and the paragraph that quotes a source comment verbatim and gives a verdict example the evidence run contradicts is deleted. Its exit condition now points at the Disconnected arm's existing fs::read_to_string(uart_log) read rather than asking for a second reader. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
…tick's hang is filed On QEMU 11.1.1's own edk2, the USB stick's read of the EIO sector did not return. With the harness's deadline lifted to 150 s and each 16550 line stamped, the last byte is `Slot A: signed header ... verifies` at 3.0 s, the step before the chunked read of ROOT. Nothing follows it for the next 147 s, not even a reset from the 60 s firmware watchdog the loader armed at 2.0 s. This firmware cannot answer that stimulus at all. The same EIO, through the same `blkdebug` drive, now sits under the `InternalDisk` profile's NVMe boot disk. The loader's path is the same `BlockIO` read, so the claim is unchanged: a ROOT chunk the disk will not read refuses the boot, naming the chunk and the firmware's `DEVICE_ERROR`. The ready-marker comment went, because its reason was the stick's silence after the failed read. The USB case is now uncovered, and issues/boot-media/an-unreadable-sector-on-a-usb-boot-stick-hangs-the-loader-past-the-firmware-watchdog.md records it with the measurement and an exit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Review, round 4, at 9082d6bCI
Net lines ( Earlier BLOCKERs
BLOCKER NOTE
REMOVE
LAND AFTER NAMED CHANGES |
…ole split's held tail is asserted, and its reset gap is filed root_chunk_refused's body now serves two tests. root_chunk_refused keeps the InternalDisk profile's NVMe boot disk. root_chunk_refused_on_a_usb_stick runs the same body on the Headless profile's stick, where stock edk2's read of the EIO sector does not return, and src/redlist.rs disables it behind issues/boot-media/an-unreadable-sector-on-a-usb-boot-stick-hangs-the-loader-past-the-firmware-watchdog.md. That issue is now expected-red, and its exit is that test green and its row lifted. It gains the evidence the ready-marker comment this branch deleted carried: on the former ovmf/ image the read returned, and then the stick answered the loader's next write to loader.log with nothing, so the stick went silent after the EIO under both firmwares. It also says a real machine is unmeasured, and the line implying ovmf/ handled the stick cleanly is gone. BootOptions::stick_read_error is boot_read_error: it fails reads of the boot disk on whichever bus the profile puts it. tests/common/update.rs's loader_said and tests/common/serial.rs's interleaved read kernelconsole::HEAD (the first through is_kernel_line) instead of spelling "[kernel ". nothing_before_the_kernel_passes asserts that a firmware-only pass leaves fewer than HEAD.len() bytes held. With the held.drain(..) line deleted, it reds on "362 bytes withheld, more than could begin the head" (exit 101); before, that mutation left all three tests green. The split does not re-arm across a guest reset inside one QEMU process. No capture shows what stock edk2 writes on the virtio port after such a reset, so there is no measured signal to re-arm on: issues/build/the-kernel-console-split-does-not-re-arm-across-a-guest-reset.md records it, and KernelConsole's doc points there. issues/build/ftruncate-flush-race-reds-intermittently-and-nothing-says-why.md gains the orchestrator's five solo runs at 9082d6b: runs 1 and 3 red, 2, 4 and 5 green. In each red run all 10 attempts missed: ten STALLED WINDOW HELD lines about 410 ms apart, each followed by its flusher's exit, then the panic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Review, round 5, at 4f65191CI Net lines ( Earlier BLOCKERs: round 4 had none. Round 4's items:
BLOCKER NOTE
REMOVE
LAND AFTER NAMED CHANGES |
… cause claim, and the glob comment's provenance sentence, gone The ftruncate row for stock edk2 read as the firmware being implicated with no control beside it; the orchestrator's five solo runs against the committed ovmf/ at cd2e630 are that control. The USB-hang issue named usb-storage as the factor common to both firmwares while the next paragraph says the measurement does not show which side is at fault; the sentence is gone. The glob comment's Homebrew/Debian provenance belongs in the commit that measured it, not in src/firmware.rs; the refusal it led into stands on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
#564 (the measured schedule) moved the root_* boot-image group's tiers (root_candidate_malformed, root_named_but_absent, root_named_twice to Weekly; root_chunk_refused, root_candidate_overlaps, root_named_twice_on_the_boot_disk to Nightly; log_partition_identity to Weekly) while this branch changed root_chunk_refused's profile and added root_chunk_refused_on_a_usb_stick at Fast, redlisted. Kept #564's tiers for the rows it moved and this branch's Fast registration for the new row, which #564's measured buckets and PR-body exceptions do not cover (it did not exist when that report was measured). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
#572 deletes ovmf/ and aavmf/ so every guest boots the host QEMU's own edk2 firmware; this branch already deleted ftruncate_flush_race and its kernel actuator/vfs code as part of retargeting the nightly storage suite onto fsd (193600c). The two touch the same issue file: #572 appended a firmware-comparison row (stock edk2 vs. the committed ovmf/, both still flaky) to a table whose subject — the test binary and the VFS lock path it raced on — no longer exists on this branch (`rg ftruncate_flush_race` finds nothing under kernel/, tests/, or src/). The evidence adds nothing a surviving issue or test needs, so the deletion stands; no other file cites the issue by path or bare name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Brings in #572 (host QEMU's edk2), #580 and #579 (disabled reds), #549 (a kill never waits on its victim) and #566 (metaltalk redial). - src/redlist.rs: one row each for user_copy_races_munmap and quiesce_leaves_the_volume_whole, which both sides added. main's new rows stay (netd_refused_accept, quiesce_wakes_on_the_last_teardown, root_chunk_refused_on_a_usb_stick, syscall_window_nmi). The rows for tests or issues this branch deleted go (hda_tone, doom_sound_flood, latency_wake, sched_check_build), and so does lan_swap, whose issue main deleted with swap_netd's and swap_crash_rolls_back's rows. - The two issue files both sides added take main's text. - tests/common/power.rs: main's woken_by_the_held_thread, shared by the new quiesce_wakes_on_the_last_teardown, without the two clock verdicts this branch took off QEMU (stopped_the_machine in stopped_boot, and woken_by_its_threads). - tests/common/qemu.rs: qemu_command takes main's firmware_vars and has no audio_wav, so profile_argv passes six paths. The too_many_arguments allow goes, because seven parameters do not trigger it. - kill_while_blocked.rs: main's text. After #549 a kill does not park in retire_task, so this branch's doc for arm 4 was false. main's arm also has no clock. - tests/toyos.rs check_rust_result: this branch's single-print form, which already carries the stdout main added. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j
Guests now boot whatever UEFI firmware the host's QEMU installation declares. The tree no longer carries firmware:
ovmf/andaavmf/are deleted, 140,509,184 bytes in total.ovmf/held two images of unknown version and recipe, plusDEBUGX64_OVMF.fd, which nothing referenced.aavmf/was byte-identical to Homebrew QEMU 11.1.1'sedk2-aarch64-code.fdandedk2-arm-vars.fd. The owner ruled that firmware QEMU installs is inside "Rust and QEMU" and a committed firmware binary is not. #563 made the kernel boot on QEMU's stock edk2.What changed
src/firmware.rsfinds the firmware. It follows QEMU's interop spec,docs/interop/firmware.json:firmware/*.jsonfiles under, in order, the user's override ($XDG_CONFIG_HOME, else$HOME/.config,/qemu/firmware), the system's (/etc/qemu/firmware), then every data directoryqemu-system-* -L helpprints.secure-bootnorrequires-smm. No guest here sets up either. The selection test carries a qcow2, a requires-smm-only and amode: combineddescriptor ahead of the fitting one, each refused by exactly the rule named for it.pc-q35-<major.minor>orvirt-<major.minor>, the type theq35andvirtaliases resolve to, with the version from--version.Arch::machineis the one placeq35/virtis declared;src/qemu.rsand the harness (tests/common/qemu.rs) both read it.*prefix match; anything else — a non-trailing*, or another fnmatch metacharacter — is refused by name.std::fs::copycarries the template's permissions, and a read-only template (a 0444 store, as on Nix) would otherwise leave the boot's own copy, and every boot after it, unwritable.vars-<seq>.fdand deletes it when the instance drops, the same way it handles the boot's own image.BootOptions::firmware_varsis still the test's own file. The update rig keeps its copy across boots as before, now copied from the declared template.cargo runwritestarget/firmware-vars.fdfresh on every launch.ovmf/did not. Firmware and the loader write there before the kernel does: 42 lines in the 572r2 nightly, with the loader's last line cut off at the handoff and fused onto the kernel's first record (Loader log: the kernel handoff begins, so [kernel 0.000 cpu0 boot] black box: …).src/kernelconsole.rs'sKernelConsole::passwithholds a console's bytes until the first[kernelhead and passes everything from it on. It finds the head anywhere in the stream, so the fused line splits, and across chunk boundaries.root_named_twice_on_the_boot_diskcounted one loader read twice, andc_capture_ignores_daemon_linesread the firmware's lines as userland's.tests/common/qemu.rs's reader thread passes a virtio profile's stdio through it beforeConsoleStream, the line channel andboot_log. A 16550 on stdio has no other file, so it is read whole.HEADis the[kernelhead's one declaration. The harness'sis_kernel_line,Serial::interleavedand the update rig'sloader_saidread it.root_named_twice_on_the_boot_diskreads the loader's line from the 16550 alone.HEAD.len() - 1bytes before the kernel begins, andnothing_before_the_kernel_passesasserts that.issues/build/the-kernel-console-split-does-not-re-arm-across-a-guest-reset.mdrecords this, andKernelConsole's doc points there.Arch::firmwareandArch::pflashare deleted.Firmware::drivesbuilds the two-drivevalues instead.guest,tcg,audio) andsrc/sourcegate.rs's matchingCI_PACKAGESrow nameovmf-generic, the package that carries the chosen descriptor, rather than theovmfmetapackage whose amdsev/inteltdx siblings contribute only memory-mapped descriptors this reader skips. No CI job boots AArch64, soqemu-efi-aarch64is not installed anywhere.ci::qemu_versionis now the one place that asks QEMU its version.NOTICEsections and the fiveCOMMITTED_FILESrows;licenses/BSD-2-Clause-Patent-EDK2.txtandlicenses/Apache-2.0-OpenSSL.txt, which only those sections cited;NOTICEsentence and the README clause namingovmf/;toyos-acpi/fixtures/ovmf-pure-efi/SOURCEthat its firmware is what every guest boots and thatNOTICEnames it;issues/build/ovmf-s-licence-record-names-no-openssl.md, whose record went with the files;issues/build/no-harness-test-boots-qemus-own-edk2.md. Its exit is met:lan_dhcp_leaseandshipped_config_boots, which waits forcompositor: readyandnetd: ready, pass on QEMU's own edk2 (the87629411runs below).root_chunk_refusedputs its EIO under an NVMe boot disk (theInternalDiskprofile) instead of the USB stick. On QEMU's own edk2 the stick's read of that sector did not return, and the 60 s firmware watchdog did not reset the machine (the 572r3 measurement below). Theblkdebugdrive and the loader'sBlockIOread are both unchanged, so the test still makes the same claim: a ROOT chunk the disk will not read refuses the boot, naming the chunk andDEVICE_ERROR.root_chunk_refused_on_a_usb_stickis the same body on the Headless profile's stick.src/redlist.rsdisables it behindissues/boot-media/an-unreadable-sector-on-a-usb-boot-stick-hangs-the-loader-past-the-firmware-watchdog.md, which isstatus: expected-red. The issue's exit is that test green and its row lifted. The issue also carries the formerovmf/evidence: there the read returned, and then the stick went silent on the loader's next write. Real hardware is unmeasured.BootOptions::stick_read_erroris nowboot_read_error, because it fails reads of the boot disk on whichever bus the profile puts it.issues/build/ftruncate-flush-race-reds-intermittently-and-nothing-says-why.mdgains the orchestrator's five solo runs at9082d6b4. Runs 1 and 3 were red, and in each all 10 attempts missed.Net lines against
ec06384eat this head (git diff --numstat origin/main...HEAD):src/arch.rs,src/ci.rs,src/firmware.rsandsrc/kernelconsole.rsless their test modules,src/lib.rs,src/licence.rs,src/qemu.rs,src/redlist.rs,src/sourcegate.rs): +320/−73;src/firmware.rs's 137 andsrc/kernelconsole.rs's 60 test-module lines,tests/common/qemu.rs,tests/common/serial.rs,tests/common/update.rs,tests/common/volumes.rs,tests/toyos.rs): +291/−46;NOTICE, README, fixture note, workflow, licence texts and issues: +113/−340, plus the 140,509,184 bytes of binariesgit diff --numstatcannot line-count.CI's firmware is not the Mac's
edk2-stable202408-prebuilt.qemu.org). The kernel boots on QEMU's stock edk2, network included: the direct map ends at the last memory, every kernel root slot exists before the first user space, and a BAR's free run is a gap inside its width's space #563 was proven on this one.ovmf-genericpackage, from Debian'sedk2source, in the sid index of 2026-09-17. Debian'sqemu-system-x86 1:11.1.1+ds-1is a repacked source whose Recommends nameovmf, and nothing in this tree has measured it shipping QEMU's ownedk2-*.fd, nor whether its build writes to the virtio port.The next nightly shows which firmware CI booted, on every guest job's instrument line.
Gates
At
4f65191d(logs in the job scratchpad's572r5/):cargo test --workspace --exclude toyos-buildtest result: oklines, noFAILED)cargo test -p toyos-build --libcargo test --test toyos-build -- --listroot_chunk_refused_on_a_usb_stickand reports it disabled behind its issue)cargo run -- --clippy,cargo run -- --ci hostandcargo run -- --build-onlylast ran at9082d6b4, each exit 0. They were not rerun at this head.Measured against the real installation, without running QEMU (Homebrew QEMU 11.1.1):
qemu-system-x86_64 -L help/qemu-system-aarch64 -L help: both print.../share/qemu-firmware(does not exist) then.../share/qemu(eight descriptors). x86_64 resolves to60-edk2-x86_64.json, aarch64 to60-edk2-aarch64.json./etc/qemu/firmwarenor$HOME/.config/qemu/firmwareexists on this Mac, so the earlier-precedence entries contribute nothing here; both directories are still read (search_dirs's own test).The console split, host-tested.
kernelconsole::testsfeeds the 572r2 boot's firmware prefix and fused line cut at every byte, byte by byte, alone, and a port the firmware left alone. Each of four checked mutations built and turned them red (exit 101 each, reverted, file byte-identical):passreturns its chunk): the fused-line and firmware-alone tests red, the firmware's bytes passed;[kernel, and the untouched-port test red;held.drain(..)line deleted, at4f65191d:nothing_before_the_kernel_passesred on "362 bytes withheld, more than could begin the head".Guest runs, by the orchestrator
At
87629411(the branch before the console split), on Homebrew QEMU 11.1.1's own edk2:lan_dhcp_leaseexit 0.shipped_config_bootsandinspect_reads_its_ownerspassed in the Fast tier.At
09804e8d(logs572r3-*in the job scratchpad'sorch-runs/):root_named_twice_on_the_boot_disk: exit 0.--nightly c_capture_ignores_daemon_lines: exit 0.c_captureexit 1, on "42 line(s) that no name … accounts for".--nightly: 515 passed, 1 failed. The red in both isroot_chunk_refused, "Boot timed out waiting for Slot A: ROOT: the read of".root_chunk_refused, with the deadline lifted to 150 s and each 16550 line stamped (572r3-root-chunk-measure.log): exit 1,Boot timed outat 150 s.Firmware watchdog: 60 scame at 2.0 s, andSlot A: signed header … verifiesat 3.0 s.target/red-run-serial/toyos-tmp-4233-0/lane-0/uart-0.log) ends on thatverifiesline, and no other byte followed it.-no-reboot, a watchdog reset would have ended QEMU and the harness would have saidQEMU died before. It did not. So the read did not return and the watchdog did not fire.At
9082d6b4(logs572r4-*):root_chunk_refusedonInternalDisk: exit 0, with[root] bad sector 219143: Slot A: ROOT: the read of 2048 blocks at LBA 219136 failed: DEVICE_ERROR, after 3145728 of 6291456 bytes read.ftruncate_flush_racealone, five runs, its redlist row lifted by an uncommitted local patch: runs 1 and 3 exit 1, runs 2, 4 and 5 exit 0.At
4f65191d(logs572r5-*):root_chunk_refused: exit 0.--nightly update_boots_the_new_kernel,update_refusals_boot_the_other_slotandupdate_falls_back_from_a_dying_kernel: exit 0 each.High-risk: boot path and devices
Negative control, run by the orchestrator. The patch is #563's whole change reverted onto this branch: every file #563 touched except its tracker entries (
revert-563.patchin the job scratchpad'sfirmware/). Run on the Mac, where the x86 guest is TCGqemu64, an AMD vCPU:cargo test --test toyos-build -- lan_dhcp_lease.09804e8d: exit 1, boot timeout (572r3-control-revert563.log). The kept 16550 (target/red-run-serial/toyos-tmp-24237-0/lane-0/uart-0.log) carriespmm: the firmware map calls 4288393216 bytes usable in 116 entries, and right after itEARLY PANIC: panicked at library/alloc/src/alloc.rs:659:9: memory allocation of 4096 bytes failed.ovmf/never named.Independent oracle: the stock edk2 firmware itself, third-party and unmodified, as QEMU's installation ships it. For the selection rule, QEMU's own descriptors are read by the rule QEMU's interop spec gives. For the console split, the byte stream that firmware put on the virtio port in the 572r2 nightly.
Unsure
BootNext. The reset tests (update_*,blackbox_*_chain,usb_reset_*) are where that shows. They passed in the 572r2 and 572r3 nightlies.🤖 Generated with Claude Code
https://claude.ai/code/session_01W6rME2DoqwjcYFStYHHY4j