Files
xenia-rs/audit-runs/phase-c7-XamTaskCloseHandle/re-validation.md
MechaCat02 ef93a4fa14 handoff: VSync/event-wedge fixes + iterate 2.A–2.BC research notes
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>
2026-06-05 07:19:08 +02:00

2.6 KiB

Phase C+7 — XamTaskCloseHandle re-validation

Gate matrix

# gate result
1 cvar-OFF determinism 50M (3 runs) all 3 = 43e80e57beeb77565b47d4bec173e96d (UNCHANGED from C+7 baseline; stable-digest is field-coarse)
2 Phase B image_loaded_sha256 ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18 (matches baseline)
3 Phase A main chain matched-prefix ≥ 102158 102164 (+6 from 102158)
3b tid=4 → 11 unchanged from 9 9 (no regression)
3c tid=7 → 2 unchanged from 29 29 (no regression)
3d tid=12 → 7 unchanged from 2 2 (no regression)
3e tid=14 → 9 unchanged from 39 39 (no regression)
3f tid=15 → 10 unchanged from 15 15 (no regression)
4 Both engines build clean
5 Phase A emitter determinism (2 runs) both = eca3ac9a1dd5810bc5b0fa54f58b9ba5 (new baseline; C+7 was 90fb28… but excluded return_value from canonical hash — this run includes it)
6 Unit tests 152 → 156 (+4 new, 0 regressions)

Stable-digest comparison

Baseline (C+6½ / C+7 keSetEvent): instructions=50M, imports=40470, unimpl=0, draws=0, swaps=1, unique_render_targets=0, shader_blobs_live=0, texture_cache_entries=0

Post C+7 XamTaskCloseHandle: identical. Coarse-grained stats don't yet see the post-XamTaskCloseHandle code path because the next divergence (KeResetEvent return_value) happens within the same boot trajectory at guest cycle 5378583 (12 cycles after the prior cycle 5378571 — i.e. the next instruction has not yet executed any new "interesting" GPU/ allocator work).

Phase A determinism

ours.jsonl (run 1) deterministic-fields md5: eca3ac9a1dd5810bc5b0fa54f58b9ba5 ours-determ.jsonl (run 2): eca3ac9a1dd5810bc5b0fa54f58b9ba5

Byte-identical. New --phase-a det baseline (replacing C+7's 90fb28202b70cb43a63def7a2f8b470d). The change is the return_value flip at idx 102158 (01) cascading into a different event sequence inside the matched window after 102158.

Per-chain summary

chain C+7 keSetEvent C+7 XamTaskCloseHandle Δ
canary tid=6 → ours tid=1 (main) 102158 102164 +6
canary tid=4 → ours tid=11 9 9 0 (sister already at end of ours window)
canary tid=7 → ours tid=2 29 29 0 (sister already at end of ours window)
canary tid=12 → ours tid=7 2 2 0 (different bug: KeWaitForSingleObject ret 258 vs 0)
canary tid=14 → ours tid=9 39 39 0 (different bug: XAudio vs RtlEnterCS)
canary tid=15 → ours tid=10 15 15 0

All gates pass. No regressions.