Conversation
…lds the MDIO interface
Run 36 left two explanations for `userdev=0` standing unseparated — the link is
down, or interrupt delivery is broken — and a PHY bring-up built on the first
assumption hung the bench twice. These are the two boots that separate them,
each an actuator armed by a boot config of its own and by nothing else.
`tests/lanicscase` is `tests/lancase` with netd's `--provoke-message`: after the
mask is armed, `I219::provoke_message` writes §10.2.4.4's `ICS` once with `LSC`,
so the first message the claim takes is one netd asked for. The kernel's own
`pcidev: slot N took its first message` record then says whether the delivery
path works whatever the link did. The shipping config beside it arms none of it,
so its record still means the card spoke on its own.
`tests/lanmngcase` is the same boot with `--read-manageability`: one read of
§10.2.2.15, no write, and no PHY register touched at all. A bit of §4.5.2's
arbitration standing before anything asked for it implicates the semaphore
semantics; the manageability agent's own request standing implicates
reachability. `EXTCNF_CTRL` and its three ownership bits are the offsets this
tree already carries, cited to the same datasheet as every other offset in
`regs.rs`.
**The reading crosses as an exit code, because on the T14 it has no other
channel.** `issues/diagnostics/the-cable-judge-reads-three-netd-records-that-cannot-arrive-on-the-t14.md`
measured it: run 36's readback carries exactly one line with `netd` in it, the
kernel's own `spawn:` record, because a userland write reaches `Backend::None`
and `/log` carries kernel records. So `Manageability::exit_code` encodes the
reading and `from_exit_code` decodes it, both in `toyos-i219` beside the read
rather than spelled once in netd and again in the judge; netd exits on it and
the kernel's `exit: netd ... code=N` record is what the stick carries. A code
with no marker bit decodes as no reading at all, so a netd that ended some other
way cannot be read as one.
`FWSM` is not in this tree — not at this base and not on any branch of it — so
neither boot reads it. Adding an offset no file here carries would mean taking
it from a source outside the tree, which the brief for this work refuses; what
`EXTCNF_CTRL` does carry is the manageability agent's own request bit, which is
the half of that question about who holds the PHY.
Both arms hang off the `lan_dhcp_lease` registration because a metal-only test
name has no registration and `check_metal_registration` refuses one. Neither new
arm names a PCI function: their judges read kernel records and ask the cable
nothing, so the loop is not asked for four `ssh` round trips it would refuse
them for.
Fence: this touches `tests/` and `src/build.rs` beyond `toyos-i219/` and
`userland/netd/`, because an actuator has to be named by a boot config, a boot
config has to be staged by an arm and priced by a profile row, and the host
judge has to decode what netd encoded. No kernel change, no ABI change, no new
syscall, and no PHY access in either boot.
Gates, each the command's own exit status:
cargo test -p toyos-i219 EXIT=0 35 passed; 0 failed
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…ine down on are filed
Run 57 is what this branch was for: `tests/lanicscase` booted the T14 with netd's
`--provoke-message` armed and the kernel recorded `pcidev: slot 0 took its first
message on vector 0x28`. Delivery works. That arm and its judge stay exactly as
they are.
The other arm did not survive its own experiment. `tests/lanmngcase` was flashed
twice, as runs 58 and 62, and both times the machine was found powered off — not
frozen, no black box, and a persisted kernel log that ends at the first `logd`
batch, 192 lines, around 0.6 s, before netd ran at all. Every other image booted
clean off the same stick that round, run 57 included. The cause is not known and
nothing on the stick says what it was, so it is filed as
`issues/hardware/both-boots-of-the-manageability-read-image-found-the-t14-powered-off.md`
rather than guessed at here.
So the arm goes whole, and the question it asked is now asked through the PHY
probe's exit code on another branch:
- netd's `--read-manageability` flag, `Card::manageability`, `Nic::manageability`
and the exit that carried the reading;
- `tests/lanmngcase`, its row in `check_metal_registration`'s list, its arm in
`LANCASE`, its judge `lan::manageability_on_metal` and the `MNG_*` names, and
its four rows in `tests/metal-profile.toml`;
- `toyos_i219::Manageability` with its exit-code round trip, `I219::manageability`,
`regs::EXTCNF_CTRL` and `regs::extcnf`, `stub::Nic::manageability_holds_the_mdio`
and the two unit tests over them.
The workspace dependency on `toyos-i219` goes with them: `tests/common/lan.rs`
was the only thing in the build crate that decoded a reading, so the build no
longer names the driver crate at all. netd still does, being its only other
caller.
Gates, each the command's own exit status:
cargo test -p toyos-i219 EXIT=0 33 passed; 0 failed
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
`tests/metal-profile.toml` conflicted because both sides append: this branch prices `lanicscase`, and the base adds the panel's two numbers for every boot. Both blocks are kept, and the base's per-boot rule is applied to this branch's new boot — `tests/common/metal.rs` judges `panel_max_us` and `panel_us` on every readback and `Profile::judge` refuses an unpriced name, so `lanicscase` gets the same two rows `lancase` has, at the same ceilings and citing the same derivation. Without them the merged suite would red on the boot this branch adds rather than on anything it measures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
… a branch Run 57 recorded `pcidev: slot 0 took its first message on vector 0x28` on a message netd provoked, so MSI from the T14's I219 reaches a CPU and the "raises no interrupt" half of the issue is answered. What remains is the PHY: nothing in toyos-i219 brings it up, and run 36's silence is a part with no cause to raise. The file is renamed to that, marked assigned to PR #453 (i219-phy), given an exit condition, and loses its citation of a Linux driver's source. The boot-deadline issue called this branch unmerged; landing it makes that false, so it now names the branch and its PR. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
|
Review of #461 at CI on Measurements:
BLOCKER
NOTE
REMOVE
SEND BACK |
…own records Review of #461 at 510b692, answered. - `lan_message_delivery` is a metal row of its own over `tests/lanicscase`, no longer hung off `lan_dhcp_lease`: the two verdicts are reported side by side, so a delivery regression is printed by name while lancase is red. `check_metal_registration` could not express a name with no QEMU arm, so it gains `METAL_ONLY`: each metal-only name with why no QEMU arm answers for it, exactly one of registered or metal-only, and every metal-only name run by a `METAL` row. - The judge (`toyos_build::lan::delivered`) finds the kernel's `[8086:15fc] handed over on slot N, vector V` record and accepts only the whole kernel message `pcidev: slot N took its first message on vector V` after it. Run 57's log, verbatim, and the review's four edits of it are unit tests; the two records' spellings are held to kernel/src/pcidev/mod.rs. - `a_cause_written_to_ics_raises_a_message_the_claim_takes` pins one message and the exact cause set (LSC and its OTHER summary); `ICS`<-`u32::MAX` and `ICS`<-`LSC` twice are now red. - netd refuses `--provoke-message` on a virtio card with a panic naming it. - Deleted: the ordering claim in tests/lanicscase, netd's say! line and `provoke_message`'s doc; the judge's "netd wrote one cause to ICS"; and the two unsupported sentences in the power-off issue. - Filed: the lancase metal judge owes netd records no T14 boot persists. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
|
Round 2 review of #461 at CI on Round 1 BLOCKERs
Panel rows: BLOCKER
NOTE
REMOVE
SEND BACK |
…and the delivery judge ends at the slot's next hand-over
- `METAL_ONLY` names are now refused when the shared registry (Rust or C)
or a shared metal member carries them, on both the ordinary path and the
`--metal` path. Before this, a metal row and its `METAL_ONLY` entry renamed
to a discovered shared test (the reviewer's G5, `abuse_connect_flood`)
passed the gate and put two verdicts under one name.
- `check_metal_registration`'s rule is now a pure function over three
tables. It is held to fixtures that show each refusal it names firing
(G6, a catch-all arm ahead of the match, now reds), and the shared-name
gate is held to fixtures too.
- `lan::delivered` stops its search for the first-message record at the
slot's next hand-over. A hand-over clears the slot's record, so a record
after one answers that claim and not the I219's (K7).
- The spelling test now reads the kernel's hand-over format literal whole,
with line continuations joined, so changing `vector {:#x}` reds it.
- A fixture where a non-kernel line carries the hand-over words holds the
`pcidev: PCI ` prefix check.
- netd refuses `--provoke-message` on a virtio card before `open` touches
the card. The Intel opener provokes once the card is up.
- REMOVE: the `say!` clause in tests/common/lan.rs, the "only job list"
clause at `lan_hold`, and netd's "would read as the instrument's" clause.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
…xity Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK
One boot answered the question this branch was opened for: whether a message the T14's I219 raises reaches a CPU. The arm that asked the next question is retired.
What the branch carries
tests/lanicscase: netd's--provoke-message, and its own metal row. The boot istests/lancasewith one argument added to netd's manifest row. After the mask isarmed,
I219::provoke_messagewrites §10.2.4.4'sICSonce withLSC. The shippingconfig beside it arms none of this, so its own first-message record still means
the card spoke on its own. netd armed with
--provoke-messageon a card with nosuch actuator (virtio) panics naming it, and it does so before
VirtioNet::opentouches the card. Each opener in
CARDStakes the flag. The Intel opener provokesonce the card is up.
The judge is
lan_message_delivery, a metal row of its own overLANICSCASE, besidelan_dhcp_leaseoverLANCASE. Each is reported with its ownPASS/FAILline, so a delivery regression is printed by name while lancase is red(which it is on every T14 boot until the PHY is brought up). The row carries its
exit condition: it is folded into the lancase judge when the PHY lands (#453),
because lancase's own first-message record then carries the same fact.
The gate changed so it can say this.
check_metal_registrationrefused everymetal row whose name no QEMU registration holds, and no QEMU arm can answer for this
one: it asks about the T14's I219 behind that machine's interrupt remapping. So the
gate gains
METAL_ONLYintests/toyos.rs, a table of(name, why no QEMU arm answers for it). The gate asserts that everyMETALname is exactly one ofregistered or metal-only; that every metal-only name is run by a
METALRunsrow;and that each has a non-empty reason and appears once. That rule is now
metal_rows_are_registered, a function over the three tables.the_metal_gates_refuse_what_they_nameruns it on fixtures before it runs on thereal tables: one accepted table for each accepting arm, and one refused table for
each refusal, matched by its words.
A
METAL_ONLYname the shared boot answers under is refused(
metal_only_is_unshared, fixture-tested the same way). The shared names areevery discovered Rust test, every C case, and every name a shared metal boot's
members are recorded under, taken unfiltered. The check runs on the ordinary path
beside
check_no_collisionsand on the--metalpath before anything is staged.The judge reads the function's own records (
toyos_build::lan::delivered,pure, in
src/lan.rs). It finds the kernel'spcidev: PCI … [8086:15fc] handed over on slot N, vector Vrecord and accepts only a line whose whole message is thekernel's
pcidev: slot N took its first message on vector V, for that N and V,after the hand-over and before that slot's next hand-over. A hand-over clears the
slot's record, so a record after the next one answers that claim. A refusal names what was missing or mismatched: no hand-over
(quoting the kernel's
NOT HANDED OVERline if there is one); no matching record;and, on separate lines, each other claim's record, each line not in the kernel's
spelling, a matching record that came before the hand-over, and the slot's next
hand-over with a matching record after it. Run 57's log, verbatim from the
hand-over to the record, is a unit-test fixture. The review's K2, K4, K5, K6 and K7
are unit tests built as edits of it. So is a hand-over line written by another
writer, which holds the
pcidev: PCIprefix check. Another test reads bothformat literals out of
kernel/src/pcidev/mod.rswhole, joining line continuationsthe way the compiler does, and compares each with the spelling this judge parses.
Host-side:
toyos_i219::I219::provoke_message, netd'sPROVOKE_MESSAGE, and twounit tests.
a_cause_written_to_ics_raises_a_message_the_claim_takesassertsexactly one message and exactly the cause set
LSC | OTHER(OTHERis§10.2.4.1's summary bit, set with
LSC),INT_ASSERTEDaside. Its negative controlis
a_pass_with_no_provoked_cause_takes_no_message.tests/metal-profile.tomlpriceslanicscase, including the per-bootpanel_max_usandpanel_usrows, atlancase's ceilings.The hardware measurement, and the two checks
Independent oracle: real hardware, two runs of the same
lanicscaseimage at4d604c86. Metal run 57 recordedpcidev: slot 0 took its first message on vector 0x28(userdev=1), after the I219's hand-over on slot 0, vector 0x28. Run 54did not come back within 420 s and left no kernel log in its readback, so it says
nothing either way. From run 57: MSI delivery from that function works on that
machine, so the
userdev=0of run 36 is a part that raised nothing, not a messagethat reached no CPU. Nothing in the judge's records says the message run 57 took was
the provoked one rather than one of
open's own causes. What it establishes isdelivery from this function, not which cause was delivered.
Negative controls, each a checked patch applied and restored in one script, the
mutated tree shown to build, and the tree clean after:
The review's no-op,
RXT0,ICR,IMSand read-and-ack mutants were already red.Round 3's mutations, run the same way (
git apply --check, apply, build, run,git apply -R;git status --shortempty after):The judge on the review's readbacks (
cargo test --test toyos-build -- --metal --metal-readback <dir> lan_message_delivery):K8 was not run: the review ruled its refusal a false red, not a false pass, and
this round leaves it.
Every one of those invocations exits 1, K1 included. The reason is the per-boot rows:
boot.lanicscase.panel_max_usandpanel_usare priced, and run 57 recorded nopanel census. The review's own runs show the same two
FAILlines. The run overK1 with the filter
lanreports both rows independently:FAIL lan_dhcp_lease(no cable on that readback) andPASS lan_message_delivery.The retired arm, and why
--read-manageability(tests/lanmngcase) was the second experiment: one readof
EXTCNF_CTRL(§10.2.2.15), no write, no PHY register touched, thenexitwith the reading encoded in the code.
Both of its boots found the machine off. In runs 58 and 62 the machine was
found off, not frozen, with no black box. On both runs the persisted kernel log
ends at the same first
logdbatch: 192 lines, around 0.6 s. The cause is notknown and nothing on the stick says what it was.
So the arm is removed whole, and the question it asked is asked through the PHY
probe's exit code on PR #453. Nothing of it remains in the net diff against
main: no flag, no boot, noManageabilitytype, noEXTCNF_CTRLregister, noprofile rows, and no change to
Cargo.tomlorCargo.lock. What happened isfiled as
issues/hardware/both-boots-of-the-manageability-read-image-found-the-t14-powered-off.md,with no speculation about the cause.
Tracker
issues/hardware/the-i219s-phy-is-never-brought-up-and-the-part-raises-no-interrupt.mdis now
issues/hardware/the-i219s-phy-is-never-brought-up.md,status: assignedto PR The I219 PHY bring-up is judged under both readings of the MDIO arbitration, and its outcome crosses the T14 as netd's exit code #453, with an exit condition and its citation of a Linux driver's source removed.
issues/kernel/a-120000-ms-boot-deadline-fired-132859-ms-late-on-the-t14.mdnames this branch and this PR.
issues/hardware/the-t14-lan-judge-owes-netd-records-the-stick-never-carries.md.A console-object write goes to the serial backend and not into the record ring
logdpersists, and run 57's log carries nonetd:line at all. Solan_dhcp_lease's metal judge owes records no T14 boot can carry.The merges
origin/mainat909f34b4is merged in.git merge origin/mainat the start ofround 3 was already up to date. Never rebased.
Gates on
092b7192, each the command's own exit statusThe toyos-i219, lib and workspace runs were on
4e763793.092b7192changes onlytests/toyos.rs, which none of those three builds. Clippy, the fast tier, K1, G5 andG6 were run again on
092b7192.Unsure
--provoke-messagepath (argument,Card,Nic, driver) runs in no CIboot; only a T14 boot reaches it. No T14 run is requested this round. What the
image does to the part is unchanged: the Intel opener writes the same
ICSonce,now inside
Card::intelright afteropen, wheremainused to write it. Thevirtio refusal moved ahead of
open, andtests/lanicscasecannot reach itbecause it claims only
pci:8086:15fc.message, not by origin: a record carries no writer tag a userland line could
not also spell. On this machine no userland write reaches the ring
logdpersists (see the filed issue), so no userland line can reach the file the
judge reads.
because the judge reads the first 15fc hand-over. That is a false red, not a
false pass. The kernel cannot produce it while one claim holds the function.
🤖 Generated with Claude Code
https://claude.ai/code/session_014iqcj4jDKpaiDX8B7CMvmK