Repository navigation
A claim hands each BAR over where firmware put it, in 4 KiB pages (Wi-Fi P1) - #947
Conversation
…-Fi P1) A claim used to move every BAR it handed over onto a 2 MiB slot of its own, because 2 MiB pages were the only ones this kernel mapped into a process. That move is why the AMD bench's xHCI 03:00.4 (behind 00:08.1, whose window bus 3 fills) and the AX210 behind its root port could not be claimed, and it is what pcidev's placement machinery existed for. User mappings now take any run of 4 KiB-aligned pages: a 2 MiB leaf wherever a whole aligned frame lands on a 2 MiB boundary, a table of 4 KiB leaves for the rest (toyos_userbound::leaves, host-tested, shared by both architectures). Unmapping a slot of 4 KiB leaves frees its table: on x86-64 after a user-half shootdown, since a sibling's paging-structure cache may still name it (SDM Vol. 3A 4.10.3); on AArch64 after the broadcast TLBI by ASID that already completes on every CPU. x86-64's 4 KiB leaves carry their own PAT encoding (bit 7), and the AddressSpace's never-written `pages` map is gone. pcidev records every memory BAR at publish and hands a BAR over at that address, in the pages it covers, only where no other function decodes inside them and the pages lie in the root bridges' declared memory (toyos_pci::pages, host-tested); otherwise the BAR is withheld by name and the function still handed over. The register must still hold firmware's address (BarMoved). Every BAR is chosen before anything on the function changes, and the interrupt is armed last, so no refusal follows an armed message and bring_up's undo path is gone. publish logs how many memory BARs share a 4 KiB page with another function: the bench measurement. Deleted: toyos_pci::placement (free runs, reservation, behind_bridges), toyos_pci::probe (the "answers its own value" reference dword), toyos_pci::bridge (the bridge walk), bar::placement, PciDevice::bridge and ::forwarded, and in pcidev place_bar(s), Source, Candidate, give_back, cut_already, was_cut, cut, alone_in_its_page, probe_dword, the 2 MiB slot runs and their records, and the refusals only they raised. MSI-X arming answers its table's address, which is where tear_down masks it. No BAR firmware left unassigned is assigned: main had no path that did (place_bar refused BarUnassigned), and the hot-plugged endpoint that needs one arrives with lifecycle stage 2, which brings its own assignment inside the port's window. Tests: bar_map_behind_a_bridge asserts the NIC's BAR is handed over at the address enumeration read; msix_in_place reads the MSI-X entry the kernel armed back through the holder's mapping of the table's page, in bar_map_again's boot and as the msix_table_read_in_place metal row (the T14's AX210 and NVMe, the AMD bench's AX200); amdvi_usbd_drives_its_own_entry and its judge return from c648c14. The NVMe guests drop msix-exclusive-bar=on and drive QEMU's default controller through its table in BAR 0. Issues: closes a-bar-behind-a-bridge-with-no-free-2-mib-... and no-boot-reaches-the-retry-that-undoes-a-placement-nothing-answered; restates P1 of there-is-no-wifi, the survey and refusal-reach issues and the process-memory track, whose ledger, counts and straddle segments device windows did not need. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
…on a 2 MiB boundary in the leaf test build/kernelkeys.rs declared the x86-64 AddressSpace's `pages` map, which the P1 commit deleted. The leaf test claimed the AX210's 0xbc300000 is a 2 MiB boundary; it is 1 MiB off one, so the T14 NVMe's 16 KiB at 0xbce00000 is the case a whole 2 MiB leaf would hand its neighbours over in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
…he common-config BAR tests/common/qemu.rs still gave the guest NVMe msix-exclusive-bar=on, so the guests drive its table in BAR 0 now as build/qemu.rs does. bar_map_again took the virtio NIC's first nonzero BAR, which was BAR 4 only while the deleted probe withheld BAR 1 (the MSI-X table reads zero at the probe's dword); it names BAR 4 now. bar_map_behind_a_bridge judges every BAR handed over. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the AMD bench both 1022:1639 controllers are on the machine, so the by-id lookup refused two matches (amdvi_usbd_drives_its_own_entry, 5f4418f). The job now takes the one spare function the kernel does not drive, as usbd_spare does, and claims it by arrival every round. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #947 at
|
… comments and records x86 unmap issued its own user-half shootdown per slot of 4 KiB leaves, under the address-space lock, before the caller's Unmapped issued another. unmap now answers the table it unlinked as paging::Detached, which every free_and_unmap caller drops inside its existing shootdown (Unmapped, or the pipe and dlopen paths' explicit one). AArch64 answers the same type; its tlbi already reached every CPU. Comments: Tables' ownership (freed with the space or by an unmap), survey counts what it withholds, its unrouted line says no claim is handed it, a const out of the use block, from_bits' argument. bar_map_behind_a_bridge drops a comparison bars() makes true by construction; the job's register read through the BAR behind the port is the claim. iommu.rs no longer names an unrun mutation. Issues: P1's T14 NVMe exit is an Identify Controller completing through the in-place entry; P1's rows need no metal-row naming first; lifecycle stage 2 records the place_unassigned rewrite and Machine::decoded; the aarch64 claim issue says what windows are checked, not placed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The refused hand-over that called it is gone (P1's bring-up arms last), and #950 moved the HDA driver that was its other caller to userland. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the AMD bench (33adc6b) the holder's rewritten MSI-X entry was refused and recorded by the unit (access=none IO_PAGE_FAULT against 03:00.4), which puts the claim in refusal as iommu/fault.rs states, so usbd's next interrupt read answered Io and usbd ended by name. The arm expected usbd to settle, an outcome never measured: 03:00.4 was unclaimable before P1. It now reads every line usbd says until it ends, asserts no No-Op was announced and that usbd failed; the judge reads that line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AMD bench's 03:00.1 HDMI audio, reachable since P1, drops the high bits of its domain's addresses although it advertises 64OK. The domain layout choice is the owner's; this records the evidence and why amdvi_translates_the_stick_controller stays red there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #947 at
|
| Area | Added | Removed |
|---|---|---|
| kernel/lib/sdk/build | +592 | −1836 |
| tests | +331 | −94 |
| issues | +115 | −190 |
The PR body's "40 files, +914 −2032" is stale.
Previous blockers
Both are resolved.
kernel/src/arch/aarch64/paging.rs:170-171now says tables are freed with the space or by an unmap (Detached). That is true.kernel/src/pcidev/mod.rssurvey: the doc now says it counts what it withholds. The unrouted line now reads "no claim is handed it". Both are accurate.
Checked and correct
Detached ownership, x86. Every free_and_unmap caller drops it only after a user-half shootdown that runs with no address-space lock held:
MappedPages::unmap_fromandrelease: the guard is a temporary of thelet.release_thread_mappings→Vec<Unmapped<…>>.SharedMemObject::unmap_fromandzero_handles.sys_mmapreplace, insideUnmapped, dropped after the closure.sys_munmap.revoke_pipe_maps: shootdown, thendrop(detached).- The dlopen rollback: shootdown, then drop.
Unmapped::drop shoots down before ManuallyDrop::drop, so the table outlives the flush (SDM 3A §4.10.4.1 for paging-structure caches). swap_remove with expect replaces retain, so a table this space doesn't own now fails loudly.
end_returns_claims.
- The job now selects by inventory and claims by
Arrivalevery round. This fixes the two-match refusal on the AMD bench. - Round 7's
amdvi_usbd_drives_its_own_entryPASS reads it (bench/round7/amd/judge-p17a.log).
The issue record a-function-that-truncates-its-dma-addresses-faults-in-its-domain.md.
- Frontmatter is
question/owner, whichissues/README.mdallows. - The cited evidence (
b0148546c, an ancestor of47584ef78) is byte-identical to round 6'stestcases/kernel.log. - Lines 337–345 are what it says. The GCAP is
0x4001. Domain 4 maps0x13200000..at0x400010000000. The faults are at0x10000000,0x10000400and0x10000410. Domain 5 (03:00.6) maps at the same0x400010000000and works. system/hda/driver/src/controller.rs:373-378writes both halves and refuses a high grant only without 64OK, as the record says.kernel/src/iommu/window.rs:11,29is the quarter-width rule.- "Bits dropped" is labelled as what the addresses show, not as a measured width. That is fine.
Independence of the red amdvi_translates_the_stick_controller. Established.
- P1 touches nothing in
kernel/src/iommu/orsystem/hda/. - The faulting addresses are the domain's IOVA with bit 46 gone.
- A second function at the same IOVA base in the same boot works.
P1 only makes 03:00.1 claimable. Landing it turns that AMD nightly row red until the owner chooses a layout. The PR body says so, and the decision belongs to the owner, as the record states.
Findings
BLOCKER
-
kernel/src/arch/x86_64/paging.rs:859-861(and the AArch64must_usetext ataarch64/paging.rs:612). The comment is false. It says the tables are "dropped only insidemm::Unmapped, after its shootdown".revoke_pipe_maps(process.rs:653-666) and the dlopen rollback (syscall/vm.rs:316-320) dropDetachedoutside anyUnmapped, after their own explicit shootdown. That is correct, but this comment states the safety contract, and a reader checking those paths against it will think they are wrong. Fix: state the actual rule, e.g. "dropped only after a user-half shootdown". Do the same for the AArch64must_usemessage, or delete that message, since on AArch64 dropping anywhere is safe. Comment-only; no rerun needed. -
tests/guest/rust-tests/src/usbd_spare.rs:296-297withtests/toyos.rs:4345. The arm tolerates the refusal rather than asserting it.- What the job asserts: usbd ended non-zero within 30 s and printed no No-Op line.
- What it prints regardless: "usbd ended on the claim's refusal". The judge then accepts that print as the evidence.
- What slips through: a usbd that panics for any other reason after the unit's record. That covers a claim refused with the wrong error, or any of usbd's other eight panic/expect sites. Such a run passes while printing a false cause.
- What the evidence already holds: usbd's own refusal line, on its stderr, so in the boot log and not in the job's pipe. It is at
bench/round7/amd/testcases-amd-xhci-leave/kernel.log:1625:usbd: the claim refused its interrupt record (Io); nothing drives it from here. No other usbd in this boot can say it: the drive arm's usbd is killed, and the fault arm runs none. - Cheapest fix: in
amdvi_usbd, addlog.must_say("usbd: the claim refused its interrupt record (Io)"). Reword the job's print to what the job itself established ("usbd ended {status:?} and was never told of its No-Op"). The published round-7 readback already contains the line. Re-judging that readback, or a direct reading of the published log, is sufficient; no new boot is needed for a judge-only tightening.
SUGGESTION
tests/guest/rust-tests/src/bin/end_returns_claims.rs:55-71.spare()is a verbatim copy ofusbd_spare::claim's selection, and its doc says it must choose "asusbd_sparechooses it".SPARESis copied too. Its comment (line 23-24, already stale on main) still lists two controllers for three entries. Includingusbd_spare.rsby#[path], asusbd_spare_vector.rsdoes, would leave one rule and one list:- split out a
spare(cap) -> (PciId, Arrival)thatclaimcalls; - delete the copy and the stale comment.
- split out a
usbd_spare.rs:140:until_endedtakes&mut selfbut needs only&self.- Unrelated discovery, for the orchestrator to record rather than fix here:
tests/common/metal.rs:494hardcodes "exited {code} on the T14". Round 6's AMD judge therefore reported the AMD failure as "on the T14" (bench/round6/amd/judge-p16a.log:483).
PR description and evidence (orchestrator)
- Required. "Bench rounds 6 and 7 (33adc6b, e004248): T14 3/3 PASS" has no published readback.
47584ef78holds T14 bench results only underp1/bench/t14, at5f4418f37.round6/stage-t14.logis staging only (exit 2, untouched), andbench/round6/contains onlyamd/.- Why it matters:
ecab33411changed how every x86 user unmap frees its leaf tables, which is the PR's named metal risk. - Why it is not a coverage gap: AMD rounds 6 and 7 do exercise that code on x86 metal.
- Fix: publish the T14 round-6 readback and judge, or relabel T14 3/3 as measured at
5f4418f37, beforeecab33411, with AMD as the post-change x86 metal reading.
- Why it matters:
- "40 files, +914 −2032 overall; kernel/lib/sdk/build +538 −1784" is stale. Current figures are in the table above.
Verdict
SEND BACK for two small blockers:
- the false
Detachedsafety comment; - the vector arm's judge, which must read usbd's own refusal line rather than the job's assertion of it.
Neither needs a new metal boot; the existing round-7 readback carries the line. Separately, the orchestrator should correct the T14 rounds-6/7 claim. Everything else in this round checks out. That includes the independence of the red amdvi_translates_the_stick_controller row, which the new issue records accurately.
…fusal The x86 Detached doc said it is dropped only inside mm::Unmapped; the pipe and dlopen paths drop it after their own shootdown, so it says a user-half shootdown. AArch64's must_use names no caller it does not have. amdvi_usbd now requires usbd's own "the claim refused its interrupt record (Io)" line, and the job prints what it established: usbd exited and never said its No-Op completed. The round-7 AMD readback re-judged against it: PASS. The spare selection is one file (src/spare.rs) both jobs include, and until_ended takes &self. Records that a metal job's failure names the T14 on every bench. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review of c6e5de7 addressed at 77ed37a:
Checks at 77ed37a: build-only x86-64/aarch64 exit 0; usbd_drives_the_spare, both usbd_refused_*, bar_map_again exit 0; |
|
Orchestrator: the focused review's required items are resolved at 77ed37a (checked the diff c6e5de7..77ed37a): |
Conflicts resolved against main's changes since 3b77b9b: - #947 deleted kernel/pci/src/placement.rs and issues/no-boot-reaches-the-retry-that-undoes-a-placement-nothing-answered.md; the branch's hunks there (a doc comment and an import, and the issue's exit) were about the placement that no longer exists, so both stay deleted. issues/an-aarch64-cargo-run-boot-hands-over-no-pci-claim.md stays deleted: main's one-line edit restated how its windows are read, which this branch replaces. - K1's IOVA allocator (6cb27ce): a domain's allowed addresses are still the unit's range less every reserved range, but the root bridges' windows now come per domain from the declaration (`Domains::prepare`), beside the backend's own reserved ranges (RMRRs, IVMDs, the interrupt range, AMD-Vi's special range, the ITS doorbell), which `avoid` keeps. No declaration, no domain. `OwnSpace::create` takes the declared windows; the IOMMU selftests, which run before any declaration on QEMU's root bus, pass none. - pcidev: main's `publish` without the loader's list, and the declaration, its wait and its refusals as on the branch. - KernelArgs: main's `slot_volume_guid` follows `microcode_len` at 456; 472 bytes. - The supervisor (27b75c3): the `acpi` claim's holder starts before the disk drivers, whose claims wait for its declaration. - acpicase: main's nvme and usbd rows claim PCI functions on a boot whose only `acpi` holder is a job, so it keeps no storage rows; the probe's held-function arm takes the console function the kernel drives, the only function a kernel driver still holds. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
…2d60) into wt/toyos-lifecycle-2 Lifecycle stage 2 rebuilt on main and stage B. - pcidev: stage B's module is the base. The per-requester records, the device set's generation and snapshot, `Gone` on an older arrival's claim, the departed release and retirement, and the slot's interrupt are this branch's, over main's BAR records (`Decoded`); `Machine::windows` and the placement state are gone with #947. - An arrived function's BARs: `place_unassigned` and `behind_bridges` are gone. Each BAR the device leaves unassigned is given, before the function is listed, the lowest address inside its port's windows that no other function decodes in and that the declared root bridges' memory holds (`toyos_pci::hotplug::{Windows, assign}`, host-tested), written once and kept where the register reads it back, with no probe through it. Its BARs enter `Machine::decoded` and leave it on retirement. `bar::placement` stays for that one write, refusing only an I/O BAR and asserting the caller's own choice. - The slots are armed by stage B's declaration, from `pcidev::declare`, below a root whose `_OSC` commit was granted native hot-plug and the capability structure. acpiserver commits both where its query offered both (`osc::negotiate_root`); the declaration carries the grant. The boot-time arm with no bridges is gone. - A slot's port reads its own bus numbers and windows: main deleted `toyos_pci::bridge` and `PciDevice::bridge`. `PciDevice::header_type` tells a bridge below a slot. - Two readers of the set never enumerate one arrival twice (`REFRESHING`). - ABI: the device set's object kind is 15 and its syscalls 135 and 136, past main's; the static `IrqWatch` poll returns for its watch. - supervisor: main's `drive_where` reads the device set, says what joined and left, and decides over the rows asked for. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
P1 of
issues/there-is-no-wifi.md, with its prerequisite, 4 KiB user leaves for device windows.Problem
A claim moved every BAR it handed over onto a 2 MiB slot of its own, because 2 MiB pages were the only ones the kernel mapped into a process. That move is why the AMD bench's xHCI
03:00.4(behind00:08.1, whose window bus 3 fills) and the AX210 behind its root port could not be claimed, and it was what pcidev's placement machinery existed for.Resulting behaviour
map_range, both arches): a 2 MiB leaf wherever a whole aligned frame lands on a 2 MiB boundary, a table of 4 KiB leaves for the rest. The choice is one pure function,toyos_userbound::leaves, host-tested. Unmapping a slot of 4 KiB leaves answers the table it unlinked (paging::Detached), which the caller drops inside its existing shootdown, since a sibling's paging-structure cache may still name it (SDM 3A §4.10.3); no extra shootdown is issued. x86-64 4 KiB leaves carry their own PAT bit (bit 7). Page-table ownership and the IOMMU domain layout are unchanged.publishrecords every memory BAR; a claim hands one over only where no other function decodes inside its pages and they lie in the declared root-bridge memory (toyos_pci::pages, host-tested). Otherwise the BAR is withheld by name (BarPages,BarUnrouted) and the function still handed over. The MSI-X table's page goes with its BAR; the kernel's remapping-entry rule (AMD-Vi stage 6: interrupt remapping, and claims only where every unit filters SMIs #921) is untouched, and tear-down masks the entry at the table address arming read.pcidev: N memory BAR(s), M of them sharing a 4096-byte page with another function or starting inside one. q35: 11 to 14 BARs by machine shape, 0 sharing (boots). Metal at 5f4418f: T14 21 BARs, AMD 14, 0 sharing (T14, AMD).msix-exclusive-bar=onis gone frombuild/qemu.rsandtests/common/qemu.rs: the NVMe guests drive QEMU's default controller through its table in BAR 0 (nvme_disk_bootsand the diskserver boots green).Deleted (measured)
48 files, +1074 −2134 against the merge base with main; kernel/lib/sdk/build +591 −1836, tests +349 −108, issues +134 −190. Gone:
toyos_pci::placement(545 lines: free runs, reservations,behind_bridges),toyos_pci::probe(the "answers its own value" proof),toyos_pci::bridge(the bridge walk, 291),bar::placement,PciDevice::bridge/forwarded, and in pcidevplace_bar(s),Source/Candidate,give_back,cut_already/was_cut/cut,alone_in_its_page,probe_dword, the 2 MiB runs and slot records (pcidev −620 +164), and the refusals only they raised; the x86AddressSpace::pagesmap nothing wrote (#940 deletes it too, merged with main c0b1547).Decisions
place_barrefusedBarUnassigned), and the hot-plugged endpoint that needs one is lifecycle stage 2's (wt/toyos-lifecycle-2), whoseplace_unassignedwill need rewriting onto this: a small assignment inside the port's window, no probe.OWNEDledger or per-process count is needed, and a BAR's pages are in physical order, so a typed value straddling two of them is still one run (object_run's one-segment store andwindow_split's bound hold). What remains of stage 3 — the ledger, demand-zero stacks, 4 KiB TLS, straddle segments, the T14 floor — is restated in the issue.What temporarily stops working
Nothing measured.
Bench round 1 (5f4418f, run by the orchestrator)
T14 3/3 PASS. AMD 2/3:
amdvi_translates_the_stick_controllerandmsix_table_read_in_placePASS, and the first claim behind a bridge on metal handed03:00.4's BAR 0 over in place (0xd0100000..0xd0200000) and usbd drove it.amdvi_usbd_drives_its_own_entrywas red inend_returns_claims, which chose 1022:1639 by id on a bench that has two; it now chooses the spare asusbd_sparedoes and claims it by arrival (dc18514). Readbacks, judges and manifests: bench.Review round 1
Fixed the two comment blockers (AArch64
Tables' ownership,survey's doc and unrouted line), took the shootdown suggestion above, droppedbar_map_behind_a_bridge's by-construction address comparison (the job's register read through the BAR behind the port is the claim), recorded P1's T14 NVMe exit as an Identify Controller completing through the in-place entry, recorded that P1's rows need no metal-row naming first, added theplace_unassignedrewrite andMachine::decodedto lifecycle stage 2, and the nits. Declined: keepingPagesinBound(one rounding helper, no defect), and refusing a claim whose MSI-X table BAR is unrouted (pre-existing; recorded nowhere new). All four bench images re-staged, since the unmap change is in every kernel.Tests and evidence (ToyOSOrg/evidence
pr-947, README)cargo run -- --ci host, exit 0, 86 steps, at ecab334 (log); earlier at 3ef1e64 (log). New host tests:toyos_pci::pages(in place, sub-page BAR, page sharing refused, off-page, wrap) andtoyos_userbound::leaves(device windows on and off a 2 MiB boundary, whole frames, misaligned runs); segment test notes the straddle-in-one-run case.--build-onlyx86-64 and aarch64, exit 0 at ecab334 (x86, a64) and at 3ef1e64 (x86, a64).usbd_refused_without_smi_filterandusbd_refused_without_amdvi_remapping. At 3ef1e64, 9/9 exit 0 (log):usbd_drives_the_spare,bar_map_again(now also runsmsix_in_place: the NIC's armed MSI-X entry read back through its holder's mapping of BAR 1's table page equals what the kernel logged writing),bar_map_behind_a_bridge(rewritten: was "BAR placed inside the port's window"; now the NIC behind the port is handed a BAR in place and the job reads its register through it),lent_device_memory_refused,a_drives_row_holds_one_process_per_function,the_compositor_drives_the_virtio_gpu,iommu_virtio_platform,virt_claim_lpi,nvme_disk_boots. No row deleted. An earlier red run (log) foundbar_map_againreading the NIC's first BAR, which is now BAR 1 (the table, withheld before because it read zero at the probe dword); the job names BAR 4.a_page_another_function_decodes_in_is_refused_by_name; a short 2 MiB-aligned window mapped as a 2 MiB leaf reds two leaf tests; both restored green. The "ledger" control the brief named has no subject: no ledger was built (above).usbd_drives_the_type_c_controller,claim_reuses_its_remapping_entry, newmsix_table_read_in_place(AX210 and NVMe entries at BAR 0 + 0x2000 read through their holders' mappings); AMDamdvi_usbd_drives_its_own_entry(restored with its judge from c648c14),amdvi_translates_the_stick_controller,msix_table_read_in_place(the AX200 behind 00:02.2).Round 5 (head 4c72cf3, main 0e6716f merged)
PciDevice::disable_msixandMsix::disableddeleted: their last callers were the refused-hand-over undo this PR removes and the HDA driver #950 moved to userland. Build-only both arches exit 0, the 11 QEMU claim rows exit 0, the AMDtestcases-amd-xhci-leaveimage re-staged (round 5).--ci hostexit 1 on one step unrelated to this branch:build/llvm.rs's environment test runs git under a fakeSDKROOT, which on this host's Xcode now fails (log); the branch touches neitherbuild/llvm.rsnorbuild/sysroot.rs, and the step was green at round 4.Round 6 (head 33adc6b, main ffd8bb9 with #953 merged)
--ci hostexit 0 (86 green); build-only both arches exit 0; 12 QEMU rows exit 0, #953'shda_plays_to_the_controller_that_reaches_an_outputamong them (round 6). All four bench images staged at this head; the AMDtestcasesboot addshda_tone,hda_tone_resampledandhda_volume_step, whose controllers 03:00.1 and 03:00.6 sit behind the bus-3 bridge that P1 makes reachable. The round-5 macOS llvm red is #952.Bench rounds 6 and 7 (33adc6b, e004248)
T14 3/3 PASS (readback), the first T14 boots of the leaf-table change. AMD:
hda_tone,hda_tone_resampled,hda_volume_stepPASS (the first AMD audio, through controllers behind the bus-3 bridge that P1 hands over in place),msix_table_read_in_placePASS, andamdvi_usbd_drives_its_own_entryPASS after e004248: the vector arm had expected usbd to settle, but the unit's refusal of the rewritten message puts the claim in refusal by design, so usbd ends on it; the arm now asserts that and the judge requires usbd's ownthe claim refused its interrupt record (Io)line, against which the round-7 readback was judged again: PASS (re-judge) (round 6, round 7).amdvi_translates_the_stick_controllerstays red on the AMD bench, for a recorded reason independent of this PR:03:00.1(the GPU's HDMI audio, reachable since P1) drops the high bits of its domain's addresses although it advertises 64OK, so its accesses fault and the row refuses any fault. Recorded asissues/a-function-that-truncates-its-dma-addresses-faults-in-its-domain.md; the domain-layout choice is with the owner.Review round 2 (77ed37a)
Detached's doc says what holds (dropped only after a user-half shootdown); AArch64'smust_usetext names no caller. The vector arm asserts the refusal (above); the spare selection is one file both jobs include;until_endedtakes&self. Build-only both arches, four QEMU rows and--ci host(86 green) exit 0 (round 8). Recorded: a metal job's failure names the T14 on every bench.Issues
Filed:
a-metal-jobs-failure-names-the-t14-on-every-bench(finding),a-function-that-truncates-its-dma-addresses-faults-in-its-domain(owner question). Closed:a-bar-behind-a-bridge-with-no-free-2-mib-of-its-windows-is-not-handed-over,no-boot-reaches-the-retry-that-undoes-a-placement-nothing-answered. Rewritten: P1 inthere-is-no-wifi(built; bench exits owed; the T14 NVMe driven through its table stays owed, the disk being another system's),nothing-reds-when-the-bar-survey-drops-an-assigned-bar,no-boot-reaches-the-refusal-that-keeps-a-bar-read-inside-a-declared-window,process-memory-is-2-mib-pages...(device windows done, stage 3 remains), and citations in four others.Risks
🤖 Generated with Claude Code