From 545684c8069682e095631dfac0c2bb2673b2d21c Mon Sep 17 00:00:00 2001 From: Pedro Henrique Penna Date: Thu, 29 Oct 2026 14:32:38 -0700 Subject: [PATCH 1/2] openvmm: name every CPUID difference in CPU-surface errors Pin microsoft/openvmm#4804 at e4c741e1860de1e2149b3dd5d41863468705b02c, four commits on c32c57d12, the previous pin, which is the head of feature/microvm/dev. CPU-profile verification is to report every violation together, naming the leaf, subleaf, register, and bit, as section 2.2.1.3 of the architecture guide states. OpenVMM's E_CPU_SURFACE errors instead named at most 16 differences and dropped the rest, though they counted them all: both the restore's comparison of the recomputed effective CPUID with the snapshot's record and the comparison of VP 0's CPUID with the effective CPUID before any VP runs. The VM worker also ran its CPU checks in turn and stopped at the first that failed. The first commit names, for each entry that both the recomputed effective CPUID and the snapshot's record hold, every register in which they differ, with its value and mask on each side, on one line, rather than all four results and masks of each side as pretty-printed arrays of 24 lines. The second names every difference. The lists stay bounded: the effective CPUID of each pinned profile has between 64 and 94 entries, and a snapshot's record at most 1024, which the manifest decoder enforces. The third names the non-zero CPUID entries outside the profile's tables that VP 0 reads on a pass-through backend together with the results that VP 0 does not observe, rather than only once those match, as the support check names such entries after what a backend lacks. A report whose only violations are such entries still fails with E_CPU_UNLISTED. The fourth runs every CPU check of a partition, even after one fails: the restore's comparison with the snapshot's record, the check of VP 0's CPUID, and the check that the backend supports the profile. It reports their failures together, leading with the first failure, and so with the code that OpenVMM reported before. A failure alone is reported as before. The line with which OpenVMM exits on these errors keeps its code, from which nvx-rs attributes a clone's failure to an incompatible host. The error's detail follows that line in OpenVMM's log. For the largest pinned profile, whose effective CPUID has 94 entries, an error in which every register of every entry differs in both comparisons and the backend supports nothing takes 61,717 bytes, within the 64 KiB at the end of the log that nvx-rs searches for the line. The protocol vectors and built-in CPU profiles that nvx-rs copies are unchanged. Refs #568 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- openvmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openvmm b/openvmm index c32c57d12..e4c741e18 160000 --- a/openvmm +++ b/openvmm @@ -1 +1 @@ -Subproject commit c32c57d129a36fc8c82308d6659f8d7ab5955474 +Subproject commit e4c741e1860de1e2149b3dd5d41863468705b02c From f5f4c67bf07358920be8428a774db3bc8f4b0e89 Mon Sep 17 00:00:00 2001 From: Pedro Henrique Penna Date: Thu, 29 Oct 2026 14:33:44 -0700 Subject: [PATCH 2/2] doc: map the CPU-surface error reporting in the OpenVMM roadmap Record the four commits that the previous commit pins as positions 362-365 of the microVM chain, and move the NVX pin to e4c741e18. Positions 362-365 make the E_CPU_SURFACE errors of the microVM's CPU checks name every CPUID difference rather than the first 16, each entry of a snapshot's effective CPUID record on one line with the registers in which it differs, and name the non-zero CPUID entries outside the profile's tables that VP 0 reads together with the results that VP 0 does not observe. The VM worker then runs every CPU check of a partition, even after one fails, and reports their failures together. They change only the CPU checks of the VM worker's time ABI, which the time ABI work at positions 159-269 added, and the snapshot guide's description of them; say so in the table's remarks. The pin is now 208 commits past the mapped tip. Positions 360 and 361 are no longer only a proposal: microsoft/openvmm#4807 merged them, so position 361, c32c57d12, is the head of feature/microvm/dev. Say so in the scope, and name microsoft/openvmm#4804 as the proposal of positions 362-365. Refs #568 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- doc/openvmm-upstream-roadmap.md | 38 ++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/doc/openvmm-upstream-roadmap.md b/doc/openvmm-upstream-roadmap.md index 2afc782fe..76a7314e3 100644 --- a/doc/openvmm-upstream-roadmap.md +++ b/doc/openvmm-upstream-roadmap.md @@ -9,23 +9,24 @@ - Mapped fork tip: `a0556d7d85ce1fff89f5b45a98f15c5c79cbb6fb`, position 157. The graph, PR summary, and commit mapping below cover positions 001-157 and the fixups at positions 334-340, 344, and 345. -- NVX's pinned OpenVMM revision: `c32c57d129a36fc8c82308d6659f8d7ab5955474`, position 361. - Positions 360 and 361, which microsoft/openvmm#4807 proposes for `feature/microvm/dev`, are - two commits on position 359, `bd2b27a2e`, the head of `feature/microvm/dev` since - microsoft/openvmm#4794 merged positions 355-359. Those are five commits on position 354, - `832d5bb48`, which microsoft/openvmm#4775 merged with position 353. Positions 353 and 354 - are two commits on position 352, `b92daa350`, which microsoft/openvmm#4773 merged with - positions 350 and 351. Positions 350-352 are three commits on position 349, `d2338ea22`, - which microsoft/openvmm#4769 merged with position 348. Positions 348 and 349 are two commits - on position 347, `57d0a18b3`, which microsoft/openvmm#4767 merged with position 346. - Positions 346 and 347 are two commits on position 345, `e68871cc6`, which +- NVX's pinned OpenVMM revision: `e4c741e1860de1e2149b3dd5d41863468705b02c`, position 365. + Positions 362-365, which microsoft/openvmm#4804 proposes for `feature/microvm/dev`, are + four commits on position 361, `c32c57d12`, the head of `feature/microvm/dev` since + microsoft/openvmm#4807 merged positions 360 and 361. Those are two commits on position 359, + `bd2b27a2e`, which microsoft/openvmm#4794 merged with positions 355-358. Positions 355-359 + are five commits on position 354, `832d5bb48`, which microsoft/openvmm#4775 merged with + position 353. Positions 353 and 354 are two commits on position 352, `b92daa350`, which + microsoft/openvmm#4773 merged with positions 350 and 351. Positions 350-352 are three commits + on position 349, `d2338ea22`, which microsoft/openvmm#4769 merged with position 348. Positions + 348 and 349 are two commits on position 347, `57d0a18b3`, which microsoft/openvmm#4767 merged + with position 346. Positions 346 and 347 are two commits on position 345, `e68871cc6`, which microsoft/openvmm#4762 merged with position 344. Positions 344 and 345 are two commits on position 343, `a12d9167f`, which microsoft/openvmm#4749 merged with positions 341 and 342. Positions 341-343 are three commits on position 340, `2b681564d`, which microsoft/openvmm#4735 merged with position 339. Positions 339 and 340 are two commits on position 338, `8a0d945ed`, which microsoft/openvmm#4734 merged, and position 338 is one commit on `79a501b63`, the head - of the `feature/microvm/release/v2.3` branch of microsoft/openvmm. The pin is 204 commits - past the mapped tip on the same first-parent chain. Positions 158-333, 341-343, and 346-361 + of the `feature/microvm/release/v2.3` branch of microsoft/openvmm. The pin is 208 commits + past the mapped tip on the same first-parent chain. Positions 158-333, 341-343, and 346-365 are not yet assigned to PRs; see [Commits after the mapped tip](#commits-after-the-mapped-tip). - Upstream main: `22c0485be597f87a76771e1db03eaa823a685ffc` (2026-10-22), the fork base. @@ -316,8 +317,8 @@ The physical branch is one first-parent chain: -> PR14 fixup [336] -> PR09 fixup [337] -> PR02 fixup [338] -> PR20 fixup [339] -> PR23 fixup [340] -> unassigned [341-343] -> PR18 fixups [344-345] - -> unassigned [346-361] - -> c32c57d12 (NVX pin) + -> unassigned [346-365] + -> e4c741e18 (NVX pin) ``` For upstream review, PR01-PR08 and PR14 can be rebased independently onto current upstream main, @@ -339,8 +340,8 @@ PR18's position 111. ## Commits after the mapped tip -The NVX pin extends the chain past position 157 without merges. Of the 204 later commits, -positions 158-333, 341-343, and 346-361 are not yet classified or assigned to PRs, positions +The NVX pin extends the chain past position 157 without merges. Of the 208 later commits, +positions 158-333, 341-343, and 346-365 are not yet classified or assigned to PRs, positions 334-337 are the fixups of the `feature/microvm/release/v2.3` rebase, position 338 is a PR02 fixup, positions 339 and 340 are PR20 and PR23 fixups, and positions 344 and 345 are PR18 fixups. @@ -394,6 +395,7 @@ This table groups them by topic in chain order; ranges are inclusive, as in the | 354 | `832d5bb48` | 1 | A platform restore may bind an aggregate, `--mount-aggregate` with its children, policy paths, and owner mode, to the filesystem slot that the snapshot left dormant, validated as at a cold boot, while the slot's device and the captured command line stay as captured; other tiers keep binding only a `--mount` (microsoft/openvmm#4775) | | 355-359 | `2607a7d55..bd2b27a2e` | 5 | microVM virtio devices reach only the RAM ranges of the e820 map: guest memory views that admit only a set of ranges, a virtio queue that refuses a descriptor unless its memory admits the whole buffer, an MMIO transport that restricts device DMA and marks a device that addresses other memory as needing reset, and the loader's e820 RAM ranges, to which every microVM device is restricted (microsoft/openvmm#4794) | | 360-361 | `c9ac93a63..c32c57d12` | 2 | CPU profile validation checks the CPU time bits, so a snapshot's host profile document must fix them too, and the catalog verifies each pinned profile once per process, before a partition uses it: its static data must form a valid profile whose canonical encoding is the encoding that snapshots embed, while the tests keep checking its digest (microsoft/openvmm#4807) | +| 362-365 | `69ddc715b..e4c741e18` | 4 | The microVM's `E_CPU_SURFACE` errors name every CPUID difference rather than the first 16, each entry of a snapshot's effective CPUID record on one line with the registers in which it differs, and VP 0's non-zero CPUID entries outside the profile's tables together with the results that VP 0 does not observe; and the VM worker runs every CPU check of a partition, the comparison with the snapshot's record, the check of VP 0's CPUID, and the check that the backend supports the profile, even after one fails, and reports their failures together (microsoft/openvmm#4804) | Some of these commits change mapped work rather than add to it. Positions 246-250 remove the legacy microVM clock paths and change files that PR10 and PR17 also change. Position 252 makes @@ -411,7 +413,9 @@ can go upstream on its own, and position 356 adds only the virtio queue's check Positions 357-359 build on the fork's virtio-mmio shared interrupt-status transport, MP-table loader, and microVM worker. Positions 360 and 361 change only `cpu_profile`, the fork's CPU profile crate that positions 159-269 add, one of its test helpers in `virt_mshv`, and the -snapshot guide, so they build on that fork-only code. +snapshot guide, so they build on that fork-only code. Positions 362-365 change only the CPU +checks of the VM worker's time ABI, which positions 159-269 also add, and the snapshot guide's +description of them. ## PR summary