Source changes (dormant parity infra, retained from iterate 2.AI/2.AO): - xenia-kernel/exports.rs: nt_create_event manual_reset polarity + related event wiring - xenia-gpu/mmio_region.rs: D1MODE_VBLANK_VLINE_STATUS hardcode parity Also lands the audit-runs/ analysis notes (.md/.txt/.json digests) for the iterate 2.x VSync/0x10e8/0x1004 wedge investigation. Raw trace dumps (.jsonl/.gz/.csv/.stdout) and agent worktrees (.claude/) are gitignored as regenerable local artifacts — see memory + HANDOFF for the running findings. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
76 lines
3.9 KiB
Markdown
76 lines
3.9 KiB
Markdown
# Phase C+21 cold-vs-cold result (2026-05-14)
|
|
|
|
## Matched-prefix table (vs C+19/C+20 baseline)
|
|
|
|
| chain | C+19 | C+20 | C+21 (jitter-1) | C+21 (jitter-2) | C+21 (jitter-3) | C+21 (fresh c21) |
|
|
|--------------------------------|---------|---------|-----------------|-----------------|-----------------|------------------|
|
|
| canary tid=6 → ours tid=1 main | 104,606 | 104,606 | **104,607** | **104,607** | **104,607** | **104,607** |
|
|
| canary tid=4 → ours tid=11 | 11 | 11 | 11 | 11 | 11 | 11 |
|
|
| canary tid=7 → ours tid=2 | 32 | 32 | 32 | 32 | 32 | 32 |
|
|
| canary tid=12 → ours tid=7 | 3 | 3 | 3 | 3 | 3 | 3 |
|
|
| canary tid=14 → ours tid=9 | 41 | 41 | 41 | 41 | 41 | 41 |
|
|
| canary tid=15 → ours tid=10 | 16 | 16 | 16 | 16 | 16 | 16 |
|
|
|
|
Main chain ADVANCED +1 vs C+19/C+20 baseline (104,606 → 104,607).
|
|
The +1 is unmasking the next real downstream divergence; the C+20
|
|
wait.begin jitter event at 104,606 is now transparent.
|
|
|
|
CRITICALLY: all 4 canary cold samples now agree at 104,607 —
|
|
reading-error #32 jitter cloud is fully absorbed at the diff layer.
|
|
|
|
## Floating-event absorption counts
|
|
|
|
| run | floating_create (c/o) | floating_wait (c/o) |
|
|
|--------------------|-----------------------|---------------------|
|
|
| jitter-1 | 0 / 1 (tid=15→10) | 1 / 0 (tid=6→1) |
|
|
| jitter-2 | 0 / 1 | 0 / 0 |
|
|
| jitter-3 | 1 / 0 + 0 / 1 | 3 / 0 (tid=6→1) |
|
|
| fresh c21 | 0 / 1 | 0 / 0 |
|
|
|
|
`floating_create` reflects C+18 absorption — observed
|
|
in tid=15→10 (the original D-NEW-3 case, still firing 1 ours-side
|
|
handle.create absorb). `floating_wait` is new in C+21 and varies
|
|
with canary's host-scheduler contention pattern. Sister chains see
|
|
no wait.begin absorption (their waits are per-thread, not shared-
|
|
global — strict matching preserved).
|
|
|
|
## Cold-stable invariants
|
|
|
|
- **ours cold digest**: bit-stable across 3 runs of `xrs-verify-c19`
|
|
(50M instr, 39290 imports, 0 unimpl). No engine source change.
|
|
- **Phase B image hash**: unchanged (no engine source change).
|
|
- **Schema version**: still `1` (wire format unchanged — C+21 is
|
|
diff-tool-only).
|
|
|
|
## Reading-error class #32 — diff-tool counter-measure landed
|
|
|
|
Pre-C+21, matched-prefix in canary cold-vs-cold could vary by 1+
|
|
indices across canary samples (jitter-1 contended → matched=104,606
|
|
strict-fail; jitter-2 fast-path → matched=104,607 naturally;
|
|
jitter-3 shifted → matched=104,603 strict-fail). Post-C+21, all
|
|
samples yield matched=104,607 — the metric is now stable across
|
|
canary's contention jitter.
|
|
|
|
## Outcome
|
|
|
|
C+21 LANDED. Main matched-prefix 104,606 → 104,607 (+1) and
|
|
deterministic across canary cold samples. Reading-error class #32
|
|
mitigated at the diff-tool layer. The next real divergence at
|
|
104,607 is an actual structural difference (canary enters another
|
|
CS while ours leaves one) — handed off to C+22.
|
|
|
|
## Next target
|
|
|
|
C+22 = the new divergence at tid=6→1 idx=104,607 (canary
|
|
`import.call RtlEnterCriticalSection` vs ours
|
|
`import.call RtlLeaveCriticalSection`). Initial framing: appears to
|
|
be a CS-acquire-vs-release ordering difference in the post-fast-
|
|
path RtlEnterCriticalSection sequence. Investigation will start
|
|
with a static read of canary's vs ours's RtlEnter and RtlLeave
|
|
control flow at this guest PC range.
|
|
|
|
Alternative: tackle D-NEW-2 (`KeWaitForSingleObject` `timeout_ns`
|
|
sign/scale asymmetry on tid=12→7 idx=3) — small ε-class encoding
|
|
fix, independent of scheduler determinism. Recommended path
|
|
depends on cost estimate; the C+22 framing scope can pick either.
|