Repository navigation
Conversation
…clare, pcidev state) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
# Conflicts: # kernel/src/pcidev/mod.rs # lib/acpi/tests/resource.rs
…vers map at identity Work in progress before review; the PR body states the change. 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
…the _OSC grant Ruled for lifecycle stage 2, which arms hot-plug ports under a granting root: acpiserver negotiates each root's _OSC under the PCI host bridge UUID (PCI Firmware Specification 3.3 section 4.5) in the pass that reads its _CRS, and the kernel keeps the records and says each grant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
Stage 2 of issues/a-device-function-is-driven-from-its-arrival-to-its-end.md. - The device set (toyos_abi::devset, SYS_DEVICE_SET/SYS_DEVICE_SET_READ): a level-triggered snapshot of every PCI function the kernel hands out, minted from DEVICE with READ and WAIT only, so the supervisor alone holds it. Its header carries the time by which a slot may change with no interrupt (PCIe 6.0 §6.6.1's wait, a command's §6.7.3.2 timeout). - pcidev keeps one record per requester, published one at a time, each carrying its live arrival: a returning device is a new arrival on the same record, so its domain id is reused. A claim of an older arrival answers Gone on every call; a departed function's release asks the device nothing, and its windows, firmware BARs, parked grants and residue are retired. - Native PCIe hot-plug on a port below a host bridge whose _OSC granted native hot-plug and capability structure control. The port is the kernel's, its MSI-X entry armed through the claim path's remapped message; the handler reads and clears Slot Status, takes a lost or button-removed slot's functions out of the set, issues at most one Slot Control write and posts the set's watch. Powering a slot, the 100 ms wait and enumeration run on the set's reader. The last release behind a removed slot powers it off. - An unassigned BAR behind a bridge is placed by placement::behind_bridges and accepted when the register reads the written address back with its flag bits intact. - toyos-supervisor: a departed arrival is never started again and is forgotten once nothing runs on it; the restart budget is the address's. - The supervisor reads the set, says what joined and left, and waits on its watch and its settle time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
# Conflicts: # kernel/src/arch/aarch64/smmu/domain.rs # kernel/src/arch/x86_64/amdvi/domain.rs # kernel/src/arch/x86_64/amdvi/mod.rs # kernel/src/pcidev/mod.rs # tests/toyos.rs
…to nothing is no BAR A slot's handler posts the device set's watch, which the scheduler must exist for: the boot-time call is made after scheduler::init (a real declaration arrives from acpiserver later still). An unassigned register behind a bridge is placed only where its size probe answers a size: QEMU's edu's BAR 1 reads 0 and sizes to nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
…clared bus-mastering site Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
…ords 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
…eclaration fails every metal boot The AMD bench's root has more memory windows than the per-root bound of 8, so at 4f5142f its declaration was refused, every claim on it would have been, and no row saw it: its boot claims nothing and its row judges kernel-driven domains. The windows are now one list of 64 across every root; acpiserver says each root's count and its _CRS bytes under OWN, so the bench's next boot records them. Every metal boot now fails on the kernel's refused-declaration record, and the AMD row requires the declaration. The host bridge _OSC tests gain QEMU q35's masked shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
…ried only, the no-acpi-row loss recorded - A declaration whose records the ABI does not name (a count or run past its array, an unnamed _OSC word, a reversed bus range) or whose roots share a bus on one segment is refused through Held like any other refusal: logged, posted, and the answer (toyos_pci::aperture::records). - The root _OSC is a query alone and its offer is recorded; the hot-plug service that acts on native hot-plug control (#934) commits it, so the osc module's condition holds. - issues/an-x86-machine-with-no-acpi-row-hands-over-no-pci-claim.md. - window.rs: Addresses::map's contract stated per arm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
Owner ruling: the kernel stops driving PCI functions (step 10) before this lands, so no kernel driver needs a domain before the declaration. The window rule is the one rule again, for every domain: above the CPU where the unit has room, and otherwise clear of the declared windows, with no domain where nothing is declared. A claim passes its declaration; a kernel driver, which comes up before any declaration, passes none. 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
So #934 commits through this ABI unchanged: a root's record holds what its query offered and what a commit (Query clear) was granted, none in stage B. A commit beside no offer, or of bits not offered, is a record the ABI does not name, refused by name with the declaration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UzbDnM9m6nQWhbjGi6Lv1
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
Main's benchcase and hostedclangcase came with nvme and usbd rows and no `acpi` claim holder, so on this branch their first claim would wait out its deadline and every claim of the boot would be refused. Both start acpiserver now, and a build host test holds the rule for every config: one whose rows claim a PCI function starts a row holding the `acpi` claim, undeclaredcase alone excepted, since it is booted to judge that refusal. Issues directly affected by the loader's window reads going: - the GCD map's held MMIO descriptors: deleted, since the loader reads no GCD map any more; - the hypervisor and ACPI tracks and the BarUnrouted tooling issue name `_CRS` where they named the loader's reads; - the x86 no-acpi-row issue names the disk drivers, which main's block service split made the claimants; - new: the ACPI server's death has no readback on the T14, since its boot's first `acpi` holder is a job and no row declares before usbd's claim. Issues that named closed drafts as owners: the four scheduler findings #872's S2 and S3 were to settle are the placement track's, which owns the push, the victim choice and wake placement; the speed track's line naming #865 as the CPU cap's owner goes, since #976 sized every per-CPU table for the CPUs firmware names; the ACPI track's `_CST` line keeps its issue and drops #870. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
The merge of main left the kernel's virtio console with no domain before the declaration: main's IOVA allocator builds every domain clear of the root bridges' windows, and the console comes up before acpiserver declares them. On VT-d the console keeps the identity domain and works; on virt's SMMUv3 its stream aborts, so `cargo run -- --arch aarch64` panics in `wait_used` before userland. The issue this branch had closed stays open with that cause, owned by this track, since how a kernel driver gets a domain before any declaration is the owner's to decide. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
benchcase: main's osbench round 2 beside the ACPI server this branch starts there. 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
Stage B's reopened aarch64 issue and main's osbench round 2. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
- slot: an armed or refused slot names its root bridge's `_OSC` commit, which is what arms it now. - devset: the malformed-snapshot test's non-function record is a `Loaded` one; main retired the inventory's `Block` record. - bar: clippy's checked conversion in `placement`'s 32-bit assert. - iommu: a stray blank line goes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
`unclaimable` refused every function the IORT does not route through the unit, which pre-empted the message refusal `virt_claim_lpi` judges for an e1000e the IORT routes straight to the ITS. It now refuses only a function that arrived after the unit was programmed, whose route was never read: the unit keeps the functions enumerated then. `a_function_arrives_and_leaves` requires the kernel's line that the plugged `edu`'s BAR 0 was assigned inside the port's window, and reads the holder's end as the supervisor now words it (`ended, code=0`). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
Kernel clippy's type-complexity and argument-count lints. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
The deferred-callback issue they pointed at went with the kernel's xHCI; the owner is the lifecycle track again, and the exit is its own. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
…ng port The orchestrator's ruling, holding the owner's "refuse external": until a claim behind an external port is refused in code, no such port's slot is armed. The `_OSC` commit is the root's, so a root with a port whose `_DSD` carries Microsoft's `ExternalFacingPort` property (the Kernel DMA Protection one Thunderbolt root ports carry), or whose port's `_DSD` cannot be read, is queried and not committed, and the kernel arms no slot below it. A firmware that marks no port reads as all-internal; the track records that and the exit. Host-tested: the `_DSD` reading (external, not, other UUIDs, malformed packages refused) and a root's commit with an external port, an internal one and an unreadable one. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
… its ports internal The orchestrator's ruling under root CLAUDE.md: unknown isolation is an error, and the owner's "refuse external" stands. No firmware signal says a port is internal. ACPI 6.5 defines none, and Microsoft's `ExternalFacingPort` `_DSD` property marks only the external ports, so a port without it is unknown. acpiserver therefore commits a root's native hot-plug only where its image passes `--hot-plug-ports-internal`. Even then it does not commit a root with a port marked external, or one whose `_DSD` it cannot read. Without a commit the kernel arms no slot. Only the QEMU hot-plug test's image declares it, for QEMU's own root port, and a build host test holds that. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
Its job must make the boot's first acpi claim, so no row declares the root bridges' memory, and usbd's stick claim, which carries the log, waits out the deadline. The T14 boot at 4e32df6 ran the job and stopped cleanly, and its kernel.log came back empty. A row that cannot produce a readback is a defective registration, so it goes with its judge and the helper only it used. No QEMU row takes its place: QEMU's firmware hands over in ACPI mode, so the release has no legacy mode to return to. `acpi_release` stays, run by nothing. The issue's exit is the row registered again on a boot that has a log, and the issues and the ACPI track that read the row point there. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
- KernelArgs: main's boot images (#994) without the loader's root bridge windows; 504 bytes, root_image at 184. - loader: main's payload module, no rootbridge. - supervisor: start_service takes main's spawn (the image's source, the boot images) and skips SYSTEM, which starts before the manifest. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
The device set moves past main's numbers and every open PR's: object kind 16 (main's Notice is 15), and SYS_DEVICE_SET 139 and SYS_DEVICE_SET_READ 140 (main's SYS_PROCESS_QUIT is 135, and an open memory PR claims 136 to 138). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
Review of #934 (lifecycle stage 2): pushed
|
- iommu::DeviceSpace::create's doc and the virtio console's comment say what the code does today: a driver in this kernel comes up before the declaration and keeps the machine's addresses. The owner's decision on that changes the code later. - acpi_release goes with its row and judge. Nothing ran it, and the issue's exit restores all three. - The aarch64 issue says the console loses the domain main gives it. - The two new issues are owned by the ACPI track. The PR they were named after closes on landing. - Docs: MAX_WINDOWS states the AMD bench's measured 16, `Osc::Offered` names no stage, and the config test says which claims it does not see. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
#935's review round 2. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
…he claim's borrow - arm records an armed port in `kernel_driven`. The device set lists it as the kernel's, not as held by a process that does not exist, and a claim on it answers `KernelDriven`. Its armed line says so, and the hot-plug row waits for that line. - Slots arm from `sys_acpi` once the declaration has answered, outside `claim.isa`'s borrow, whose closure must not wait. Arming claims a message from the units and writes each port's configuration. - Docs: a departed function's only configuration access is `note_fault` clearing its bus mastering; `REFRESHING` says what a second reader waits out. - The track records two gaps: a slot whose link never comes up stalls unsaid, and Readiness Notifications are not read. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
…r it is listed Since #994, SYSTEM is the first service in the list, started before the manifest was read. The holder count taken from the list's front therefore found none, the disk drivers' claims were made before acpiserver ran, and they waited out the declaration's deadline. `the_log_lands_on_the_boot_stick` went red on it after the merge of main. The declaring rows are now partitioned out of the whole list and started first, and the session home step makes every declarer's home. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
The supervisor starts every acpi holder before the disk drivers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
SYS_DEVICE_SET_READ is 140, so the bins are 142: one for every number up to it, and SYSCALL_PROFILE_OTHER after them. 141 failed the const assertion that holds that. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
Main's `watched_readable` (#995) matches every object kind, and the device set's arm was missing after the merge. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q
|
Round 1 at
Suggestions:
|
Review of #934, round 2, at
|
Status: draft, stacked on #935. Head
17e7277dc, built onwt/toyos-aperture-batf9e44e0fb(maind7f269dbcmerged). Until #935 lands this diff carries #935's too. Review round 1's items are answered (round-1 comment). Host CI, both image builds and four QEMU rows are green at the head. Metal at330a75662: T14 4 passed, AMD 1 passed.Stage 2 of
issues/a-device-function-is-driven-from-its-arrival-to-its-end.md, "Functions arrive and leave". The architecture was ruled on this branch's design round: the kernel owns the slot's interrupt, arrival work runs on the device set's reader, the button means remove, one record per requester, and the_OSCgrant rides stage B's declaration. Since #947, "nothing moves a BAR": main's track asked forplace_unassignedto become one assignment inside the port's window with no probe, which this round does.What changes
toyos_abi::devset, object kind 16,SYS_DEVICE_SET139,SYS_DEVICE_SET_READ140,toyos::devset; 136 to 138 are left to the open memory PR, and the profile has 142 bins): a level-triggered snapshot of every PCI function the kernel hands out. It is a header (generation, settle time) followed by inventoryPcirecords in rising arrival order. It is minted from aSysCapcarryingDEVICE, withREADandWAITonly, so the supervisor alone holds it.devset::decoderefuses by name: no header, a wrong count, a non-PCI record, arrival 0, or a duplicate or out-of-order arrival.kernel/src/pcidev): up to 512 records, each written once and read lock-free, each carrying its live arrival. A returning device is a new arrival on the same record and reuses its emptied domain. Every call a claim of an older arrival makes answersGone. A departed function's release asks the device nothing (tear_down_departed), and its retirement drops its BARs fromMachine::decoded, its reset entry, parked grants and residue.kernel/src/pcidev/slot.rs,toyos_pci::hotplug):pcidev::declare, once stage B's declaration is held, below a root whose_OSCcommit was granted native hot-plug and capability structure control (bits 0 and 4, PCI Firmware 3.3 §4.5.1). Every port says why its slot is or is not armed.osc::negotiate_root) and declares the grant; q35's default 0x1E mask gets no commit.ExternalFacingPort_DSDproperty ("Kernel DMA Protection") marks only external ports. So acpiserver commits a root's native hot-plug only where its image passes--hot-plug-ports-internal. Even then it does not commit a root with a port marked external, or one whose_DSDit cannot read. Only the QEMU hot-plug test's image declares it, and a build host test holds that. Without a commit the kernel arms no slot, so no metal slot is armed until claims behind external ports are refused in code (the track's exit).KernelDriven.sys_acpionce the declaration has answered, outside theacpiclaim's borrow.place_unassignedandbehind_bridges):hotplug::Windows,hotplug::assign, host-tested), whole 4 KiB pages, a 32-bit BAR below 4 GiB.Machine::decoded, sobars()andpages::of_bartreat them like firmware's.unclaimablerefuses only a function that arrived after the unit was programmed, whose IORT route was never read.drive_wherenow reads the set, says what joined and left, and decides over the rows asked for.Deleted:
pcidev::FUNCTIONSandarrival_of, VT-dbind's "every function was enumerated" assertion, and the supervisor's PCI reading from the inventory.The guest row and why it needs QEMU
a_function_arrives_and_leavesruns onProfile::HeadlessHotplugPort: q35, an emptypcie-root-port, andacpi-pci-hotplug-with-bridge-support=off, whose_OSCoffers 0x1F.eduover QMP. The test requires the kernel's line that its BAR 0 was assigned inside the port's window, then apciholder.device_delpresses the button: the claim answersGoneon its interrupt read, config read, BAR map and DMA grant; the holder ends with 0; the supervisor says the arrival left.No bench has a hot-plug port the owner lets a driver claim behind, so physical arrival is QEMU-only. The slot's, the assignment's and the supervisor's decisions are host-tested.
Checks and evidence
ToyOSOrg/evidence
pr-934at01fa36f6afor the rows throughaddf8e97b; that commit was published through the GitHub API after the clone was refused, which the owner is deciding on. Logs from47dc0138fon are kept locally and not published.cargo run -- --ci host17e7277dc--build-only, x86-64 and aarch6417e7277dca_function_arrives_and_leaves,a_drives_row_holds_one_process_per_function,virt_claim_lpi,the_log_lands_on_the_boot_stick17e7277dcaddf8e97bc5f97d961,47dc0138f,330a75662330a75662acpi_tables_loaded,claim_reuses_its_remapping_entry,usbd_serves_the_boot_stick,usbd_drives_the_type_c_controllerpassed; its root readshot-plug ports are not declared internal, so native hot-plug is not committedand no port arms. AMD:amdvi_translates_the_stick_controllerpassed. The QEMU rows above agree since, and the changes after it are ABI numbering, an armed port's bookkeeping, where arming runs, and main's merge, none of which a slot-less metal boot reaches; no re-boot is needed.Evidence through
addf8e97bis ToyOSOrg/evidencepr-934at01fa36f6a, published through the GitHub API after the clone was refused, which the owner is deciding on; later logs are kept locally.Round 1's
stand-in-grant.patchevidence is superseded: the row now runs on stage B's real commit.Risks and open points
acpi_tables_loadedboot should shownot declared internalfor its root.cargo run -- --arch aarch64panics on its console.🤖 Generated with Claude Code
https://claude.ai/code/session_01PXEk8BBMDT8tXu4AnENB9Q