Files
xenia-rs/audit-runs/phase-c25-mm-allocator-family/fix.diff
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

50 lines
2.7 KiB
Diff

--- a/xenia-rs/tools/diff-events/diff_events.py
+++ b/xenia-rs/tools/diff-events/diff_events.py
@@ -287,6 +287,25 @@ ALLOCATOR_RETURN_FNS = frozenset(
# creation call.
"XamNotifyCreateListener",
+ # Phase C+25: `MmGetPhysicalAddress` is a VA→PA translator whose
+ # return depends on which heap region the input VA lives in. This
+ # is the downstream consequence of C+2's deferred Path β (canary
+ # has three physical heaps at vA0/vC0/vE0 routed by page size,
+ # ours has a single unified heap_cursor starting at 0x40000000).
+ # Concretely: at C+25 idx 105,112 canary returned 0x150B0000
+ # (input 0xF50AF000 in `vE0000000` heap: addr - 0xE0000000 + 0x1000
+ # per `PhysicalHeap::GetPhysicalAddress`, see `memory.cc:2317`),
+ # while ours returned 0x0ADCF000 (input ~0x4ADCF000 in unified heap,
+ # masked via `& 0x1FFF_FFFF` per `exports.rs:985`). Both engines'
+ # translations are SELF-CONSISTENT — game code passes the PA
+ # opaquely to GPU (`VdInitializeRingBuffer` is the very next call)
+ # and the GPU translates it back to a host pointer using the same
+ # engine's heap map. Per-(tid,name) ordinal sentinel preserves the
+ # opaque-pass-through semantics while exposing actual divergences
+ # (e.g. game-side arithmetic on the PA, or a translation-count
+ # mismatch). Lifting the engine-side three-physical-heaps memory
+ # model is the C+2 Path β deferral, out of scope for C+25 (see
+ # `project_phase_c2_MmAllocatePhysicalMemoryEx_2026_05_13.md`).
+ "MmGetPhysicalAddress",
]
)
--- a/xenia-rs/tools/diff-events/test_diff_events.py
+++ b/xenia-rs/tools/diff-events/test_diff_events.py
@@ -686,6 +686,150 @@ def test_collect_shared_global_sids_single_tid_excluded() -> None:
+# === Phase C+25 — MmGetPhysicalAddress canonicalization ===
+# (4 new tests; see investigation.md for details)
+def test_mm_get_physical_address_in_allocator_set() -> None: ...
+def test_mm_get_physical_address_canonicalization() -> None: ...
+def test_mm_get_physical_address_cross_engine_alignment() -> None: ...
+def test_mm_get_physical_address_count_mismatch_still_diverges() -> None: ...
+
def main() -> int:
...
# Phase C+25
test_mm_get_physical_address_in_allocator_set()
test_mm_get_physical_address_canonicalization()
test_mm_get_physical_address_cross_engine_alignment()
test_mm_get_physical_address_count_mismatch_still_diverges()
Engine: UNTOUCHED. Python-only fix. Phase B image_canonical_sha256 ea8d160e…
UNCHANGED by definition (no Rust source modified). Build clean. Kernel tests
217 pass unchanged.