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>
This commit is contained in:
139
audit-runs/phase-b-state-equivalence/README.md
Normal file
139
audit-runs/phase-b-state-equivalence/README.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# Phase B — Initial-state equivalence snapshot & diff
|
||||
|
||||
**Purpose.** Build the infrastructure that catalogs every observable
|
||||
state difference between xenia-canary and xenia-rs at the moment
|
||||
immediately before the first guest PPC instruction of the XEX
|
||||
entry_point executes. Without a baseline equivalence proof, Phase C's
|
||||
"first runtime divergence" claim from the Phase A event-log harness is
|
||||
meaningful only relative to whatever baseline the snapshot point
|
||||
actually captures.
|
||||
|
||||
Phase B is purely catalog. It does not investigate divergences, does
|
||||
not hypothesize causes, and does not propose fixes. Those belong to
|
||||
Phase C+. The 19-audit anchor-on-wedge failure (AUDIT-049→067) is the
|
||||
reason this discipline is enforced.
|
||||
|
||||
## What's in this directory
|
||||
|
||||
| File | Purpose |
|
||||
|---|---|
|
||||
| [`canary-patch.diff`](canary-patch.diff) | All changes to `xenia-canary/` for this phase — cvar declarations, `phase_b_snapshot.{h,cc}`, single hook in `xthread.cc::Execute`. |
|
||||
| [`ours-changes.md`](ours-changes.md) | All changes to `xenia-rs/` for this phase, file-by-file with rationale. |
|
||||
| [`validation.md`](validation.md) | Proof that all five acceptance gates passed (cvar-OFF determinism, well-formedness, hash-determinism, invariants, negative test). |
|
||||
| `digest-post-phaseB-cvaroff.json` | Post-Phase-B `xenia-rs check --stable-digest -n 50M` digest with cvar OFF. Byte-identical to Phase A's baseline → Phase B gate 1 PASS for ours. |
|
||||
| `snap-001/canary/` | Full canary snapshot dir (5 JSON files + manifest). |
|
||||
| `snap-001/ours/` | Full ours snapshot dir (5 JSON files + manifest). |
|
||||
| [`report.md`](report.md) | Output of `diff_state.py` on the sanity pair — **the Phase B divergence catalog**. STOP-class result on `image_loaded_sha256`. |
|
||||
| `report.json` | Machine-readable sibling of `report.md`. |
|
||||
|
||||
## The harness
|
||||
|
||||
Two emitters + one diff tool:
|
||||
|
||||
- **Canary side** ([`src/xenia/kernel/phase_b_snapshot.{h,cc}`](../../../../xenia-canary/src/xenia/kernel/phase_b_snapshot.h) + a single hook in [`xthread.cc::Execute`](../../../../xenia-canary/src/xenia/kernel/xthread.cc#L583)): when `--phase_b_snapshot_dir=<dir>` is set, immediately before the JIT executes the first guest instruction at `entry_point()`, write five JSON files + manifest under `<dir>/canary/`. Without the cvar, behavior is bit-identical to upstream.
|
||||
- **Ours side** ([`crates/xenia-kernel/src/phase_b_snapshot.rs`](../../../crates/xenia-kernel/src/phase_b_snapshot.rs) + a single hook in [`crates/xenia-app/src/main.rs::worker_prologue`](../../../crates/xenia-app/src/main.rs)): mirrors the canary emitter. CLI flag is `--phase-b-snapshot-dir <DIR>` on the `exec` subcommand (env-var fallback `XENIA_PHASE_B_SNAPSHOT_DIR`).
|
||||
- **Diff tool** ([`tools/diff-state/diff_state.py`](../../../tools/diff-state/diff_state.py)): stdlib-only Python. Reads both snapshot dirs, walks each file applying the field-skip / set-vs-sequence rules, classifies divergences (σ-structural / δ-content / γ-kernel-content / κ-cache / ε-host-allocator / τ-host-timing), exits 2 on STOP-class.
|
||||
|
||||
## Snapshot point — equivalence claim
|
||||
|
||||
The hooks fire at *equivalent* moments in both engines:
|
||||
|
||||
- **Canary**: at [`xthread.cc:583`](../../../../xenia-canary/src/xenia/kernel/xthread.cc#L583), one line before `processor()->Execute(thread_state_, address, args.data(), args.size())`. Guard: `address == GetExecutableModule()->entry_point()`.
|
||||
- **Ours**: in [`worker_prologue` at `main.rs:2228`](../../../crates/xenia-app/src/main.rs), one block after `let pc = kernel.scheduler.ctx(hw_id).pc;`. Guard: `pc == kernel.entry_pc && current_tid == INITIAL_GUEST_TID`.
|
||||
|
||||
Validation gate 4 reads both `cpu_state.pc` files and confirms they
|
||||
equal `config.xex_entry_point` in their respective engine: `PASS`.
|
||||
|
||||
## Recipes (copy-paste)
|
||||
|
||||
### Pre-clean caches (NOT optional per spec)
|
||||
|
||||
```bash
|
||||
rm -rf ~/.local/share/Xenia/cache/ # canary persistent cache
|
||||
# ours cache root is tmpfs-default per AUDIT-038. Verify XENIA_CACHE_PERSIST is unset.
|
||||
```
|
||||
|
||||
### Build
|
||||
|
||||
```bash
|
||||
# Canary — reconfigure required after adding phase_b_snapshot.{h,cc} (CMake
|
||||
# xe_platform_sources is non-incremental for new sources).
|
||||
cd xenia-canary
|
||||
cmake --preset cross-win-clangcl
|
||||
cmake --build build-cross --preset cross-debug --target xenia-app -j$(nproc)
|
||||
cp build-cross/bin/Windows/Debug/xenia_canary.exe \
|
||||
build-cross/bin/Windows/Debug/xenia_canary_phaseB.exe
|
||||
|
||||
# Ours
|
||||
cd ../xenia-rs
|
||||
cargo build --release -p xenia-app
|
||||
cp target/release/xenia-rs target/release/xenia-rs-phaseB
|
||||
```
|
||||
|
||||
Renamed binaries (`xenia_canary_phaseB.exe`, `xenia-rs-phaseB`) dodge the
|
||||
project Stop hook per
|
||||
[`feedback_stop_hook_kills_xenia_rs.md`](../../../../.claude/projects/-home-fabi-RE---Project-Sylpheed/memory/feedback_stop_hook_kills_xenia_rs.md).
|
||||
Every canary invocation uses `--mute=true` per
|
||||
[`feedback_canary_mute_default.md`](../../../../.claude/projects/-home-fabi-RE---Project-Sylpheed/memory/feedback_canary_mute_default.md).
|
||||
|
||||
### Snapshot canary
|
||||
|
||||
```bash
|
||||
SNAP="$(pwd)/audit-runs/phase-b-state-equivalence/snap-001"
|
||||
mkdir -p "$SNAP"
|
||||
cd ../xenia-canary
|
||||
WP=$(winepath -w "$SNAP")
|
||||
wine build-cross/bin/Windows/Debug/xenia_canary_phaseB.exe \
|
||||
--mute=true \
|
||||
--phase_b_snapshot_dir="$WP" \
|
||||
--phase_b_snapshot_and_exit=true \
|
||||
"../Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja).iso"
|
||||
wineserver -k
|
||||
```
|
||||
|
||||
### Snapshot ours
|
||||
|
||||
```bash
|
||||
cd ../xenia-rs
|
||||
./target/release/xenia-rs-phaseB exec --quiet \
|
||||
--phase-b-snapshot-dir "$SNAP" --phase-b-snapshot-and-exit \
|
||||
"../Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja).iso"
|
||||
```
|
||||
|
||||
### Diff
|
||||
|
||||
```bash
|
||||
python3 tools/diff-state/diff_state.py \
|
||||
--canary "$SNAP/canary" \
|
||||
--ours "$SNAP/ours" \
|
||||
--out "$SNAP/../report.md"
|
||||
```
|
||||
|
||||
Exit code: 0 (no divergence) / 1 (divergences found) / **2 (STOP triggered)**. The Phase B sanity run produces exit 2 — see `report.md` for the breakdown.
|
||||
|
||||
## Phase C handoff
|
||||
|
||||
The first divergence Phase C should look at is the **`image_loaded_sha256` mismatch** between the two engines. Canary and ours both reach the same `entry_pc = 0x824ab748` but their loaded PE images don't match byte-for-byte. Phase B does not interpret this. Phase C should:
|
||||
|
||||
1. Re-run both engines with `--phase-b-dump-section-content` set.
|
||||
2. Open the resulting `memory.json::section_contents[]` arrays in both files and binary-diff each region with the same `(start, end)`.
|
||||
3. Determine which sections (`.text`, `.rdata`, etc.) actually differ, and whether the difference is a relocation, a byte-level XEX decoder discrepancy, or a section-table layout choice.
|
||||
|
||||
Until that's resolved, downstream Phase C investigation of the 57 other divergences risks anchoring on symptoms — exactly the failure pattern Phase B was built to avoid.
|
||||
|
||||
## Scope: what's wired, what isn't
|
||||
|
||||
- Wired end-to-end in both engines: cpu_state, memory, kernel-objects, vfs-probes, config. Five files + manifest with SHA-256.
|
||||
- Section-content dump (`--phase-b-dump-section-content`): cvar declared, plumbed, default OFF. Both engines emit `section_contents: null` by default. The escape-hatch wiring is in place for Phase C's binary-diff use; the actual bytes aren't dumped in the sanity run.
|
||||
- Walk-the-full-committed-page-set on both engines: deliberately NOT done. Canary's `QueryRegionInfo` reports COMMIT for some host-uncommitted pages (physical heap mirrors, low-system-heap reserve), and ours's `is_mapped` analogously reports COMMIT for some addresses whose mmap'd page hasn't been touched yet. Reading those addresses faults. The named-region scheme — XEX image + main stack + PCR + TLS — captures the cross-engine-comparable memory without crash risk.
|
||||
|
||||
## Known limitations
|
||||
|
||||
- **Order of `objects[]` in `kernel.json`** is canonical: sorted by `handle_semantic_id`. The semantic_id is computed from `(type_code, raw_handle)` at snapshot time, not from Phase A's `(create_site_pc, tid, tid_event_idx_at_creation, type)`. Reason: objects alive at the snapshot point were minted before Phase B instrumentation could capture the creation tuple. The simpler-formula semantic_id is stable within a single engine but does **not** correlate one-to-one across engines. The diff tool documents this and treats the `objects[]` array as a *set* (sort-and-compare); structural divergences are still surfaced, but γ-content divergences inside matching pairs are not (because the pairing is heuristic, not principled).
|
||||
- **Canary's PPCContext doesn't expose a `pc` field.** The snapshot emits `cpu_state.pc = entry_address` (the arg passed to `processor()->Execute`), which is the about-to-execute PC by definition at the hook point. This is documented in `validation.md`.
|
||||
- **Wine prefix vkd3d/dxvk caches** are not pre-cleaned by the recipe above. Phase B was run on a warm prefix; cold-prefix runs may produce a single additional vkd3d-related VFS entry. Negligible for this gate; pre-clean explicitly if desired.
|
||||
|
||||
## See also
|
||||
|
||||
- [Phase A README](../phase-a-diff-harness/README.md) — the upstream event-log harness Phase B builds on.
|
||||
- [`tools/diff-state/README.md`](../../../tools/diff-state/README.md) — diff-tool usage / classification rules / negative-test recipe.
|
||||
1070
audit-runs/phase-b-state-equivalence/canary-patch.diff
Normal file
1070
audit-runs/phase-b-state-equivalence/canary-patch.diff
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"instructions": 50000001,
|
||||
"imports": 40454,
|
||||
"unimpl": 0,
|
||||
"draws": 0,
|
||||
"swaps": 1,
|
||||
"unique_render_targets": 0,
|
||||
"shader_blobs_live": 0,
|
||||
"texture_cache_entries": 0
|
||||
}
|
||||
61
audit-runs/phase-b-state-equivalence/ours-changes.md
Normal file
61
audit-runs/phase-b-state-equivalence/ours-changes.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Phase B — ours changes inventory
|
||||
|
||||
All instrumentation is additive and cvar-gated default-off. With
|
||||
`KernelState::phase_b_snapshot_dir == None` (the default), the
|
||||
worker_prologue hook is one Option-tag test; the emitter module is
|
||||
unreached. Gate 1 verified `xenia-rs check --stable-digest -n 50M`
|
||||
produces a byte-identical digest pre/post-patch (see `validation.md`).
|
||||
|
||||
## New files
|
||||
|
||||
- [crates/xenia-kernel/src/phase_b_snapshot.rs](../../../crates/xenia-kernel/src/phase_b_snapshot.rs) — emitter for all five snapshot files + manifest. Stdlib `serde_json` + `sha2`; no new transitive deps beyond what was already pulled into the workspace. ~590 LOC.
|
||||
- [tools/diff-state/diff_state.py](../../../tools/diff-state/diff_state.py) — stdlib-only Python. Reads both engines' snapshot dirs, classifies divergences by class (σ-structural, δ-content, γ-kernel-content, κ-cache, ε-host-allocator, τ-host-timing), enforces STOP gate on `image_loaded_sha256`/`xex_entry_point`/`iso_sha256`. ~380 LOC.
|
||||
- [tools/diff-state/README.md](../../../tools/diff-state/README.md) — usage + rules reference.
|
||||
|
||||
## Modified files
|
||||
|
||||
### [crates/xenia-app/src/main.rs](../../../crates/xenia-app/src/main.rs)
|
||||
|
||||
- Around line 251: three new `Exec` flags — `--phase-b-snapshot-dir <DIR>`, `--phase-b-snapshot-and-exit`, `--phase-b-dump-section-content`.
|
||||
- Around line 420: env-var fallback (`XENIA_PHASE_B_SNAPSHOT_DIR`, `XENIA_PHASE_B_SNAPSHOT_AND_EXIT`, `XENIA_PHASE_B_DUMP_SECTION_CONTENT`); plumbed through `cmd_exec` (signature gained three trailing args).
|
||||
- Around line 945: `kernel.entry_pc = entry; kernel.phase_b_snapshot_dir = …;` etc. — feeds the resolved values to `KernelState` for the hook to read.
|
||||
- Around line 2228 (`worker_prologue`): single hook call into `xenia_kernel::phase_b_snapshot::fire_if_entry_thread(kernel, mem, pc, current_tid)`, gated by `kernel.phase_b_snapshot_dir.is_some()` (zero-cost when None).
|
||||
- `cmd_check` updated to thread three `None`/`false` defaults so the golden digest path stays unaffected.
|
||||
|
||||
### [crates/xenia-kernel/src/state.rs](../../../crates/xenia-kernel/src/state.rs)
|
||||
|
||||
- Four new public fields on `KernelState`: `phase_b_snapshot_dir: Option<PathBuf>`, `phase_b_snapshot_and_exit: bool`, `phase_b_dump_section_content: bool`, `entry_pc: u32`. Default-constructed `None`/`false`/`0`.
|
||||
|
||||
### [crates/xenia-kernel/src/lib.rs](../../../crates/xenia-kernel/src/lib.rs)
|
||||
|
||||
- Adds `pub mod phase_b_snapshot;` to the module list (alphabetical position after `objects`).
|
||||
|
||||
### [crates/xenia-kernel/Cargo.toml](../../../crates/xenia-kernel/Cargo.toml)
|
||||
|
||||
- New dependencies: `serde_json` (workspace), `sha2` (workspace, newly added), `libc = "0.2"` (for `_exit`).
|
||||
|
||||
### [Cargo.toml](../../../Cargo.toml) (workspace)
|
||||
|
||||
- New `sha2 = "0.10"` workspace dependency.
|
||||
|
||||
## Snapshot mechanism
|
||||
|
||||
When `phase_b_snapshot_dir` is `Some`, the hook in `worker_prologue` calls
|
||||
`fire_if_entry_thread` exactly once. The helper:
|
||||
|
||||
1. Fast-path early-returns when `phase_b_snapshot_dir == None` (Option-tag check).
|
||||
2. Returns if `DONE` is already set (subsequent slot visits).
|
||||
3. Returns if `pc != entry_pc || current_tid != INITIAL_GUEST_TID` (this slot visit is not the entry thread's first instruction).
|
||||
4. CAS-claims `CLAIMED` (one-shot guard against any race).
|
||||
5. Calls `write_snapshot`, which builds five `serde_json::Value` trees, serializes each with `serialize_sorted` (a deterministic walker that sorts object keys via `BTreeMap`-equivalent), writes each via `File::create + flush + sync_all`, indexes the SHA-256s into `manifest.json`.
|
||||
6. If `phase_b_snapshot_and_exit`, calls `libc::_exit(0)` so the snapshot is durable and the process terminates before the host scheduler or other threads can perturb on-disk state.
|
||||
|
||||
## What's in each snapshot file (ours side)
|
||||
|
||||
| file | content |
|
||||
|---|---|
|
||||
| `cpu_state.json` | `pc` (= entry_pc), `gpr[32]` (raw u64 hex), `fpr[32]` (raw bit-pattern hex), `vr[128]` + `vscr` (32-hex BE byte order), `cr[8]`, `xer`/`msr`/`ctr`/`lr`/`vrsave`/`fpscr`, `thread_id`, `stack_base/limit`, `tls_base`, `pcr_base`. |
|
||||
| `memory.json` | `regions[]` — named ranges (XEX image, main stack, PCR, TLS) each with SHA-256. `heaps[]` — 4 heap descriptors with committed-page histograms. `committed_pages_total`. |
|
||||
| `kernel.json` | `objects[]` (sorted by FNV-1a stable `handle_semantic_id`) — type, type_code, details (per-type fields like `thread_id`/`is_entry_thread`). `exports_registered_count/sha256/sample[]`. |
|
||||
| `vfs.json` | `resolve_path_probes[]` — canonical 10-path probe set. `mounted_devices_observed_count`. `cache_root_listing[]`. |
|
||||
| `config.json` | `xex_entry_point`, `xex_image_base/size`, `image_loaded_sha256` (the primary cross-engine invariant), `cvars{}`, `host_ns_at_snapshot` / `wall_clock_iso8601` (deterministic_skip-flagged). |
|
||||
497
audit-runs/phase-b-state-equivalence/report.json
Normal file
497
audit-runs/phase-b-state-equivalence/report.json
Normal file
@@ -0,0 +1,497 @@
|
||||
{
|
||||
"divergences": [
|
||||
{
|
||||
"canary": "0x00000000701d0000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x00000000700fff00",
|
||||
"path": "gpr[1]"
|
||||
},
|
||||
{
|
||||
"canary": "0x0000000030028000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x000000007fff0000",
|
||||
"path": "gpr[13]"
|
||||
},
|
||||
{
|
||||
"canary": "0x0000000000000000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x00000000bcbcbcbc",
|
||||
"path": "lr"
|
||||
},
|
||||
{
|
||||
"canary": "0x30028000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x7fff0000",
|
||||
"path": "pcr_base"
|
||||
},
|
||||
{
|
||||
"canary": "0x701d0000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x00000000",
|
||||
"path": "stack_base"
|
||||
},
|
||||
{
|
||||
"canary": "0x70150000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x00000000",
|
||||
"path": "stack_limit"
|
||||
},
|
||||
{
|
||||
"canary": 6,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": 1,
|
||||
"path": "thread_id"
|
||||
},
|
||||
{
|
||||
"canary": "0x30027000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "0x00000000",
|
||||
"path": "tls_base"
|
||||
},
|
||||
{
|
||||
"canary": "00000000000000000000000000000100",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "cpu_state.json",
|
||||
"kind": "value",
|
||||
"ours": "00000000000000000000000000010000",
|
||||
"path": "vscr"
|
||||
},
|
||||
{
|
||||
"canary": null,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "extra-field",
|
||||
"ours": [],
|
||||
"path": "regions_walked"
|
||||
},
|
||||
{
|
||||
"canary": 2466,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 2594,
|
||||
"path": "committed_pages_total"
|
||||
},
|
||||
{
|
||||
"canary": 261991,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "missing-field",
|
||||
"ours": null,
|
||||
"path": "heaps[base=0x00000000].page_state_histogram.free"
|
||||
},
|
||||
{
|
||||
"canary": 153,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 0,
|
||||
"path": "heaps[base=0x00000000].page_state_histogram.committed"
|
||||
},
|
||||
{
|
||||
"canary": 65536,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 4096,
|
||||
"path": "heaps[base=0x40000000].page_size"
|
||||
},
|
||||
{
|
||||
"canary": 16098,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "missing-field",
|
||||
"ours": null,
|
||||
"path": "heaps[base=0x40000000].page_state_histogram.free"
|
||||
},
|
||||
{
|
||||
"canary": 30,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 263,
|
||||
"path": "heaps[base=0x40000000].page_state_histogram.committed"
|
||||
},
|
||||
{
|
||||
"canary": "0x3f000000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x40000000",
|
||||
"path": "heaps[base=0x40000000].size"
|
||||
},
|
||||
{
|
||||
"canary": 65536,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 4096,
|
||||
"path": "heaps[base=0x80000000].page_size"
|
||||
},
|
||||
{
|
||||
"canary": 3950,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "missing-field",
|
||||
"ours": null,
|
||||
"path": "heaps[base=0x80000000].page_state_histogram.free"
|
||||
},
|
||||
{
|
||||
"canary": 146,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 2336,
|
||||
"path": "heaps[base=0x80000000].page_state_histogram.committed"
|
||||
},
|
||||
{
|
||||
"canary": "0x10000000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x40000000",
|
||||
"path": "heaps[base=0x80000000].size"
|
||||
},
|
||||
{
|
||||
"canary": 65536,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "missing-field",
|
||||
"ours": null,
|
||||
"path": "heaps[base=0x90000000].page_state_histogram.free"
|
||||
},
|
||||
{
|
||||
"canary": null,
|
||||
"class": "sigma-structural",
|
||||
"file": "memory.json",
|
||||
"kind": "extra-field",
|
||||
"ours": 0,
|
||||
"path": "heaps[base=0x90000000].page_state_histogram.committed"
|
||||
},
|
||||
{
|
||||
"canary": "0x10000000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x40000000",
|
||||
"path": "heaps[base=0x90000000].size"
|
||||
},
|
||||
{
|
||||
"canary": 4096,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 1048576,
|
||||
"path": "regions[0].byte_count"
|
||||
},
|
||||
{
|
||||
"canary": "0x30028000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x70100000",
|
||||
"path": "regions[0].end"
|
||||
},
|
||||
{
|
||||
"canary": "ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7",
|
||||
"class": "delta-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "30e14955ebf1352266dc2ff8067e68104607e750abb9d3b36582b8af909fcb58",
|
||||
"path": "regions[0].sha256"
|
||||
},
|
||||
{
|
||||
"canary": "0x30027000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x70000000",
|
||||
"path": "regions[0].start"
|
||||
},
|
||||
{
|
||||
"canary": "0x30029000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x7ffe1000",
|
||||
"path": "regions[1].end"
|
||||
},
|
||||
{
|
||||
"canary": "2390751521f95a4c513da387bc2ee8a82c5b9261bfc565be5e108fafbda61cf3",
|
||||
"class": "delta-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7",
|
||||
"path": "regions[1].sha256"
|
||||
},
|
||||
{
|
||||
"canary": "0x30028000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x7ffe0000",
|
||||
"path": "regions[1].start"
|
||||
},
|
||||
{
|
||||
"canary": 524288,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": 4096,
|
||||
"path": "regions[2].byte_count"
|
||||
},
|
||||
{
|
||||
"canary": "0x701d0000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x7fff1000",
|
||||
"path": "regions[2].end"
|
||||
},
|
||||
{
|
||||
"canary": "07854d2fef297a06ba81685e660c332de36d5d18d546927d30daad6d7fda1541",
|
||||
"class": "delta-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "e35cddaf9c210aed7505ec4cf1c599f58ac2b7ec25b0885db1ee49aba2db519a",
|
||||
"path": "regions[2].sha256"
|
||||
},
|
||||
{
|
||||
"canary": "0x70150000",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "0x7fff0000",
|
||||
"path": "regions[2].start"
|
||||
},
|
||||
{
|
||||
"canary": "a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c",
|
||||
"class": "delta-content",
|
||||
"file": "memory.json",
|
||||
"kind": "value",
|
||||
"ours": "ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18",
|
||||
"path": "regions[3].sha256"
|
||||
},
|
||||
{
|
||||
"canary": 0,
|
||||
"class": "sigma-structural",
|
||||
"file": "kernel.json",
|
||||
"kind": "seq-length",
|
||||
"ours": 32,
|
||||
"path": "exports_registered_sample"
|
||||
},
|
||||
{
|
||||
"canary": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"class": "delta-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "value",
|
||||
"ours": "bb97815f82b2313c9eaa07bf80dab47c5c23408c24203a1283dfb2aba1e84e09",
|
||||
"path": "exports_registered_sha256"
|
||||
},
|
||||
{
|
||||
"canary": "0d6236cd0677766b",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=0d6236cd0677766b]"
|
||||
},
|
||||
{
|
||||
"canary": "0d8cd68a54c991e3",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=0d8cd68a54c991e3]"
|
||||
},
|
||||
{
|
||||
"canary": "0db6fd47a31adfc0",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=0db6fd47a31adfc0]"
|
||||
},
|
||||
{
|
||||
"canary": "0e8c94fa2ab636b3",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=0e8c94fa2ab636b3]"
|
||||
},
|
||||
{
|
||||
"canary": "20b2d85926bc7b11",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=20b2d85926bc7b11]"
|
||||
},
|
||||
{
|
||||
"canary": "20b37f5926bd96d6",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=20b37f5926bd96d6]"
|
||||
},
|
||||
{
|
||||
"canary": "20de1f16750fb24e",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=20de1f16750fb24e]"
|
||||
},
|
||||
{
|
||||
"canary": "89cc99291d29ed5c",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=89cc99291d29ed5c]"
|
||||
},
|
||||
{
|
||||
"canary": "8d4ce6ee5f4e68af",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=8d4ce6ee5f4e68af]"
|
||||
},
|
||||
{
|
||||
"canary": "8d7786abada08427",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=8d7786abada08427]"
|
||||
},
|
||||
{
|
||||
"canary": "a0c8cf37cde6a492",
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "missing-from-ours",
|
||||
"ours": null,
|
||||
"path": "objects[handle_semantic_id=a0c8cf37cde6a492]"
|
||||
},
|
||||
{
|
||||
"canary": null,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "kernel.json",
|
||||
"kind": "extra-in-ours",
|
||||
"ours": "9879c5053fedb1d0",
|
||||
"path": "objects[handle_semantic_id=9879c5053fedb1d0]"
|
||||
},
|
||||
{
|
||||
"canary": 0,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "vfs.json",
|
||||
"kind": "type-mismatch",
|
||||
"ours": null,
|
||||
"path": "resolve_path_probes[0].size"
|
||||
},
|
||||
{
|
||||
"canary": true,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "vfs.json",
|
||||
"kind": "type-mismatch",
|
||||
"ours": null,
|
||||
"path": "resolve_path_probes[2].is_directory"
|
||||
},
|
||||
{
|
||||
"canary": true,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "vfs.json",
|
||||
"kind": "value",
|
||||
"ours": false,
|
||||
"path": "resolve_path_probes[2].resolved"
|
||||
},
|
||||
{
|
||||
"canary": 4096,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "vfs.json",
|
||||
"kind": "type-mismatch",
|
||||
"ours": null,
|
||||
"path": "resolve_path_probes[2].size"
|
||||
},
|
||||
{
|
||||
"canary": 0,
|
||||
"class": "gamma-kernel-content",
|
||||
"file": "vfs.json",
|
||||
"kind": "type-mismatch",
|
||||
"ours": null,
|
||||
"path": "resolve_path_probes[6].size"
|
||||
},
|
||||
{
|
||||
"canary": "",
|
||||
"class": "sigma-structural",
|
||||
"file": "config.json",
|
||||
"kind": "missing-field",
|
||||
"ours": null,
|
||||
"path": "cvars.phase_a_event_log_path"
|
||||
},
|
||||
{
|
||||
"canary": "a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c",
|
||||
"class": "delta-content-STOP",
|
||||
"file": "config.json",
|
||||
"kind": "value",
|
||||
"ours": "ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18",
|
||||
"path": "image_loaded_sha256"
|
||||
},
|
||||
{
|
||||
"canary": "ccf935d24a74e002",
|
||||
"class": "delta-content",
|
||||
"file": "config.json",
|
||||
"kind": "value",
|
||||
"ours": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"path": "xex_header_sha256"
|
||||
}
|
||||
],
|
||||
"file_status": {
|
||||
"config.json": "diverged",
|
||||
"cpu_state.json": "diverged",
|
||||
"kernel.json": "diverged",
|
||||
"memory.json": "diverged",
|
||||
"vfs.json": "diverged"
|
||||
},
|
||||
"invariants": [
|
||||
{
|
||||
"canary": "0x824ab748",
|
||||
"name": "xex_entry_point",
|
||||
"ok": true,
|
||||
"ours": "0x824ab748"
|
||||
},
|
||||
{
|
||||
"canary": "0x824ab748 == 0x824ab748",
|
||||
"name": "cpu_state.pc == xex_entry_point",
|
||||
"ok": true,
|
||||
"ours": "0x824ab748 == 0x824ab748"
|
||||
},
|
||||
{
|
||||
"canary": "a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c",
|
||||
"name": "image_loaded_sha256",
|
||||
"ok": false,
|
||||
"ours": "ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18"
|
||||
}
|
||||
],
|
||||
"schema_version": 1,
|
||||
"stop": true
|
||||
}
|
||||
98
audit-runs/phase-b-state-equivalence/report.md
Normal file
98
audit-runs/phase-b-state-equivalence/report.md
Normal file
@@ -0,0 +1,98 @@
|
||||
# Phase B snapshot diff
|
||||
|
||||
- canary snapshot: `audit-runs/phase-b-state-equivalence/snap-001/canary`
|
||||
- ours snapshot: `audit-runs/phase-b-state-equivalence/snap-001/ours`
|
||||
|
||||
## Invariants (HARD GATE)
|
||||
|
||||
| invariant | canary | ours | ok? |
|
||||
|---|---|---|---|
|
||||
| xex_entry_point | `0x824ab748` | `0x824ab748` | PASS |
|
||||
| cpu_state.pc == xex_entry_point | `0x824ab748 == 0x824ab748` | `0x824ab748 == 0x824ab748` | PASS |
|
||||
| image_loaded_sha256 | `a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c` | `ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18` | FAIL |
|
||||
|
||||
> **STOP**: a primary equivalence invariant failed. Downstream divergences are not interpretable until this is resolved. Re-run with `--phase-b-dump-section-content` on both engines and binary-diff the regions to localize.
|
||||
|
||||
## File-level summary
|
||||
|
||||
| file | status | divergence count by class |
|
||||
|---|---|---|
|
||||
| cpu_state.json | diverged | gamma-kernel-content=9 |
|
||||
| memory.json | diverged | sigma-structural=6 delta-content=4 gamma-kernel-content=17 |
|
||||
| kernel.json | diverged | sigma-structural=1 delta-content=1 gamma-kernel-content=12 |
|
||||
| vfs.json | diverged | gamma-kernel-content=5 |
|
||||
| config.json | diverged | sigma-structural=1 delta-content-STOP=1 delta-content=1 |
|
||||
|
||||
## σ-structural divergences (priority 1)
|
||||
|
||||
- **memory.json** `regions_walked`: kind=`extra-field` canary=`None` ours=`[]`
|
||||
- **memory.json** `heaps[base=0x00000000].page_state_histogram.free`: kind=`missing-field` canary=`261991` ours=`None`
|
||||
- **memory.json** `heaps[base=0x40000000].page_state_histogram.free`: kind=`missing-field` canary=`16098` ours=`None`
|
||||
- **memory.json** `heaps[base=0x80000000].page_state_histogram.free`: kind=`missing-field` canary=`3950` ours=`None`
|
||||
- **memory.json** `heaps[base=0x90000000].page_state_histogram.free`: kind=`missing-field` canary=`65536` ours=`None`
|
||||
- **memory.json** `heaps[base=0x90000000].page_state_histogram.committed`: kind=`extra-field` canary=`None` ours=`0`
|
||||
- **kernel.json** `exports_registered_sample`: kind=`seq-length` canary=`0` ours=`32`
|
||||
- **config.json** `cvars.phase_a_event_log_path`: kind=`missing-field` canary=`''` ours=`None`
|
||||
|
||||
## δ-content STOP divergences
|
||||
|
||||
- **config.json** `image_loaded_sha256`: kind=`value` canary=`'a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c'` ours=`'ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18'`
|
||||
|
||||
## δ-content divergences (priority 2)
|
||||
|
||||
- **memory.json** `regions[0].sha256`: kind=`value` canary=`'ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7'` ours=`'30e14955ebf1352266dc2ff8067e68104607e750abb9d3b36582b8af909fcb58'`
|
||||
- **memory.json** `regions[1].sha256`: kind=`value` canary=`'2390751521f95a4c513da387bc2ee8a82c5b9261bfc565be5e108fafbda61cf3'` ours=`'ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7'`
|
||||
- **memory.json** `regions[2].sha256`: kind=`value` canary=`'07854d2fef297a06ba81685e660c332de36d5d18d546927d30daad6d7fda1541'` ours=`'e35cddaf9c210aed7505ec4cf1c599f58ac2b7ec25b0885db1ee49aba2db519a'`
|
||||
- **memory.json** `regions[3].sha256`: kind=`value` canary=`'a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c'` ours=`'ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18'`
|
||||
- **kernel.json** `exports_registered_sha256`: kind=`value` canary=`'0000000000000000000000000000000000000000000000000000000000000000'` ours=`'bb97815f82b2313c9eaa07bf80dab47c5c23408c24203a1283dfb2aba1e84e09'`
|
||||
- **config.json** `xex_header_sha256`: kind=`value` canary=`'ccf935d24a74e002'` ours=`'0000000000000000000000000000000000000000000000000000000000000000'`
|
||||
|
||||
## γ-kernel-content divergences (priority 2)
|
||||
|
||||
- **cpu_state.json** `gpr[1]`: kind=`value` canary=`'0x00000000701d0000'` ours=`'0x00000000700fff00'`
|
||||
- **cpu_state.json** `gpr[13]`: kind=`value` canary=`'0x0000000030028000'` ours=`'0x000000007fff0000'`
|
||||
- **cpu_state.json** `lr`: kind=`value` canary=`'0x0000000000000000'` ours=`'0x00000000bcbcbcbc'`
|
||||
- **cpu_state.json** `pcr_base`: kind=`value` canary=`'0x30028000'` ours=`'0x7fff0000'`
|
||||
- **cpu_state.json** `stack_base`: kind=`value` canary=`'0x701d0000'` ours=`'0x00000000'`
|
||||
- **cpu_state.json** `stack_limit`: kind=`value` canary=`'0x70150000'` ours=`'0x00000000'`
|
||||
- **cpu_state.json** `thread_id`: kind=`value` canary=`6` ours=`1`
|
||||
- **cpu_state.json** `tls_base`: kind=`value` canary=`'0x30027000'` ours=`'0x00000000'`
|
||||
- **cpu_state.json** `vscr`: kind=`value` canary=`'00000000000000000000000000000100'` ours=`'00000000000000000000000000010000'`
|
||||
- **memory.json** `committed_pages_total`: kind=`value` canary=`2466` ours=`2594`
|
||||
- **memory.json** `heaps[base=0x00000000].page_state_histogram.committed`: kind=`value` canary=`153` ours=`0`
|
||||
- **memory.json** `heaps[base=0x40000000].page_size`: kind=`value` canary=`65536` ours=`4096`
|
||||
- **memory.json** `heaps[base=0x40000000].page_state_histogram.committed`: kind=`value` canary=`30` ours=`263`
|
||||
- **memory.json** `heaps[base=0x40000000].size`: kind=`value` canary=`'0x3f000000'` ours=`'0x40000000'`
|
||||
- **memory.json** `heaps[base=0x80000000].page_size`: kind=`value` canary=`65536` ours=`4096`
|
||||
- **memory.json** `heaps[base=0x80000000].page_state_histogram.committed`: kind=`value` canary=`146` ours=`2336`
|
||||
- **memory.json** `heaps[base=0x80000000].size`: kind=`value` canary=`'0x10000000'` ours=`'0x40000000'`
|
||||
- **memory.json** `heaps[base=0x90000000].size`: kind=`value` canary=`'0x10000000'` ours=`'0x40000000'`
|
||||
- **memory.json** `regions[0].byte_count`: kind=`value` canary=`4096` ours=`1048576`
|
||||
- **memory.json** `regions[0].end`: kind=`value` canary=`'0x30028000'` ours=`'0x70100000'`
|
||||
- **memory.json** `regions[0].start`: kind=`value` canary=`'0x30027000'` ours=`'0x70000000'`
|
||||
- **memory.json** `regions[1].end`: kind=`value` canary=`'0x30029000'` ours=`'0x7ffe1000'`
|
||||
- **memory.json** `regions[1].start`: kind=`value` canary=`'0x30028000'` ours=`'0x7ffe0000'`
|
||||
- **memory.json** `regions[2].byte_count`: kind=`value` canary=`524288` ours=`4096`
|
||||
- **memory.json** `regions[2].end`: kind=`value` canary=`'0x701d0000'` ours=`'0x7fff1000'`
|
||||
- **memory.json** `regions[2].start`: kind=`value` canary=`'0x70150000'` ours=`'0x7fff0000'`
|
||||
- **kernel.json** `objects[handle_semantic_id=0d6236cd0677766b]`: kind=`missing-from-ours` canary=`'0d6236cd0677766b'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=0d8cd68a54c991e3]`: kind=`missing-from-ours` canary=`'0d8cd68a54c991e3'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=0db6fd47a31adfc0]`: kind=`missing-from-ours` canary=`'0db6fd47a31adfc0'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=0e8c94fa2ab636b3]`: kind=`missing-from-ours` canary=`'0e8c94fa2ab636b3'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=20b2d85926bc7b11]`: kind=`missing-from-ours` canary=`'20b2d85926bc7b11'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=20b37f5926bd96d6]`: kind=`missing-from-ours` canary=`'20b37f5926bd96d6'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=20de1f16750fb24e]`: kind=`missing-from-ours` canary=`'20de1f16750fb24e'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=89cc99291d29ed5c]`: kind=`missing-from-ours` canary=`'89cc99291d29ed5c'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=8d4ce6ee5f4e68af]`: kind=`missing-from-ours` canary=`'8d4ce6ee5f4e68af'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=8d7786abada08427]`: kind=`missing-from-ours` canary=`'8d7786abada08427'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=a0c8cf37cde6a492]`: kind=`missing-from-ours` canary=`'a0c8cf37cde6a492'` ours=`None`
|
||||
- **kernel.json** `objects[handle_semantic_id=9879c5053fedb1d0]`: kind=`extra-in-ours` canary=`None` ours=`'9879c5053fedb1d0'`
|
||||
- **vfs.json** `resolve_path_probes[0].size`: kind=`type-mismatch` canary=`0` ours=`None`
|
||||
- **vfs.json** `resolve_path_probes[2].is_directory`: kind=`type-mismatch` canary=`True` ours=`None`
|
||||
- **vfs.json** `resolve_path_probes[2].resolved`: kind=`value` canary=`True` ours=`False`
|
||||
- **vfs.json** `resolve_path_probes[2].size`: kind=`type-mismatch` canary=`4096` ours=`None`
|
||||
- **vfs.json** `resolve_path_probes[6].size`: kind=`type-mismatch` canary=`0` ours=`None`
|
||||
|
||||
## Phase C handoff
|
||||
|
||||
Suggested attack order: σ first (structural), then γ ranked by object type (Thread > Event > Semaphore > Mutex > Timer > File > Other), then δ. ε and τ are catalog-only.
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"build_id": "canary-phaseB",
|
||||
"iso_path": "\\Device\\Cdrom0\\default.xex",
|
||||
"xex_entry_point": "0x824ab748",
|
||||
"xex_image_base": "0x82000000",
|
||||
"xex_image_size": 9568256,
|
||||
"image_loaded_sha256": "a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c",
|
||||
"xex_header_sha256": "ccf935d24a74e002",
|
||||
"cvars": {
|
||||
"phase_a_event_log_path": "",
|
||||
"phase_b_dump_section_content": false,
|
||||
"phase_b_snapshot_and_exit": true,
|
||||
"phase_b_snapshot_dir": "Z:\\home\\fabi\\RE - Project Sylpheed\\xenia-rs\\audit-runs\\phase-b-state-equivalence\\snap-001"
|
||||
},
|
||||
"wall_clock_iso8601": "epoch:1778701705",
|
||||
"host_ns_at_snapshot": 0,
|
||||
"deterministic_skip": [
|
||||
"host_ns_at_snapshot",
|
||||
"wall_clock_iso8601",
|
||||
"build_id",
|
||||
"iso_path",
|
||||
"cvars.phase_b_snapshot_dir"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"pc": "0x824ab748",
|
||||
"lr": "0x0000000000000000",
|
||||
"ctr": "0x0000000000000000",
|
||||
"msr": "0x0000000000009030",
|
||||
"vrsave": "0xffffffff",
|
||||
"fpscr": "0x00000000",
|
||||
"xer": {
|
||||
"ca": 0,
|
||||
"ov": 0,
|
||||
"so": 0,
|
||||
"tbc": 0
|
||||
},
|
||||
"cr": [
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0"
|
||||
],
|
||||
"gpr": [
|
||||
"0x0000000000000000",
|
||||
"0x00000000701d0000",
|
||||
"0x0000000020000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000030028000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000"
|
||||
],
|
||||
"fpr": [
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000"
|
||||
],
|
||||
"vr": [
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000"
|
||||
],
|
||||
"vscr": "00000000000000000000000000000100",
|
||||
"thread_id": 6,
|
||||
"hw_id": 0,
|
||||
"stack_base": "0x701d0000",
|
||||
"stack_limit": "0x70150000",
|
||||
"tls_base": "0x30027000",
|
||||
"pcr_base": "0x30028000",
|
||||
"deterministic_skip": [
|
||||
"hw_id"
|
||||
]
|
||||
}
|
||||
151
audit-runs/phase-b-state-equivalence/snap-001/canary/kernel.json
Normal file
151
audit-runs/phase-b-state-equivalence/snap-001/canary/kernel.json
Normal file
@@ -0,0 +1,151 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"objects": [
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x00000000",
|
||||
"is_entry_thread": false,
|
||||
"priority": 0,
|
||||
"stack_size": 131072,
|
||||
"suspended": false,
|
||||
"thread_id": 3
|
||||
},
|
||||
"handle_semantic_id": "0d6236cd0677766b",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000018",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x00000000",
|
||||
"is_entry_thread": false,
|
||||
"priority": 0,
|
||||
"stack_size": 131072,
|
||||
"suspended": false,
|
||||
"thread_id": 1
|
||||
},
|
||||
"handle_semantic_id": "0d8cd68a54c991e3",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000010",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x824ab748",
|
||||
"is_entry_thread": true,
|
||||
"priority": 13,
|
||||
"stack_size": 524288,
|
||||
"suspended": false,
|
||||
"thread_id": 6
|
||||
},
|
||||
"handle_semantic_id": "0db6fd47a31adfc0",
|
||||
"name": null,
|
||||
"raw_handle_id": "0xf8000008",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x00000000",
|
||||
"is_entry_thread": false,
|
||||
"priority": 5,
|
||||
"stack_size": 131072,
|
||||
"suspended": false,
|
||||
"thread_id": 5
|
||||
},
|
||||
"handle_semantic_id": "0e8c94fa2ab636b3",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000020",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {},
|
||||
"handle_semantic_id": "20b2d85926bc7b11",
|
||||
"name": null,
|
||||
"raw_handle_id": "0xf8000004",
|
||||
"type": "Module",
|
||||
"type_code": 8
|
||||
},
|
||||
{
|
||||
"details": {},
|
||||
"handle_semantic_id": "20b37f5926bd96d6",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000004",
|
||||
"type": "Module",
|
||||
"type_code": 8
|
||||
},
|
||||
{
|
||||
"details": {},
|
||||
"handle_semantic_id": "20de1f16750fb24e",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x0100000c",
|
||||
"type": "Module",
|
||||
"type_code": 8
|
||||
},
|
||||
{
|
||||
"details": {},
|
||||
"handle_semantic_id": "89cc99291d29ed5c",
|
||||
"name": null,
|
||||
"raw_handle_id": "0xf8000000",
|
||||
"type": "Event",
|
||||
"type_code": 1
|
||||
},
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x00000000",
|
||||
"is_entry_thread": false,
|
||||
"priority": 5,
|
||||
"stack_size": 131072,
|
||||
"suspended": false,
|
||||
"thread_id": 4
|
||||
},
|
||||
"handle_semantic_id": "8d4ce6ee5f4e68af",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x0100001c",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {
|
||||
"ctx_ptr": "0x00000000",
|
||||
"entry_pc": "0x00000000",
|
||||
"is_entry_thread": false,
|
||||
"priority": 0,
|
||||
"stack_size": 131072,
|
||||
"suspended": false,
|
||||
"thread_id": 2
|
||||
},
|
||||
"handle_semantic_id": "8d7786abada08427",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000014",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
},
|
||||
{
|
||||
"details": {},
|
||||
"handle_semantic_id": "a0c8cf37cde6a492",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x01000008",
|
||||
"type": "Module",
|
||||
"type_code": 8
|
||||
}
|
||||
],
|
||||
"handle_name_table": [],
|
||||
"notification_listeners": [],
|
||||
"exports_registered_count": 0,
|
||||
"exports_registered_sample": [],
|
||||
"exports_registered_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"deterministic_skip": [
|
||||
"raw_handle_id",
|
||||
"exports_registered_count"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"files": {
|
||||
"config.json": "bc273d0fbed9aabe4453c6126e40a19354650b6e82f2a7ddcc4fd3d8c2f01c7f",
|
||||
"cpu_state.json": "b57464533ac776df8d9f752678bca1a9ba7df77adc896eb313766952a50326dd",
|
||||
"kernel.json": "78affa1cbb3bc93402a9c0e8686c9a632a5ce0b676999e68aad05e972b0dbc7b",
|
||||
"memory.json": "18e39edfd15ce93042f2fe522254136b55d816df196164d5e2580751d2238e25",
|
||||
"vfs.json": "93a5ee2826dc85d0d2c0559287a096b2d52e1f84fef8921ad024a1ca18c445ff"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"page_size": 4096,
|
||||
"guest_address_space_bytes": 4294967296,
|
||||
"heaps": [
|
||||
{
|
||||
"base": "0x00000000",
|
||||
"name": "v00000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"committed": 153,
|
||||
"free": 261991
|
||||
},
|
||||
"size": "0x40000000"
|
||||
},
|
||||
{
|
||||
"base": "0x40000000",
|
||||
"name": "v40000000",
|
||||
"page_size": 65536,
|
||||
"page_state_histogram": {
|
||||
"committed": 30,
|
||||
"free": 16098
|
||||
},
|
||||
"size": "0x3f000000"
|
||||
},
|
||||
{
|
||||
"base": "0x80000000",
|
||||
"name": "v80000000",
|
||||
"page_size": 65536,
|
||||
"page_state_histogram": {
|
||||
"committed": 146,
|
||||
"free": 3950
|
||||
},
|
||||
"size": "0x10000000"
|
||||
},
|
||||
{
|
||||
"base": "0x90000000",
|
||||
"name": "v90000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"free": 65536
|
||||
},
|
||||
"size": "0x10000000"
|
||||
}
|
||||
],
|
||||
"regions": [
|
||||
{
|
||||
"byte_count": 4096,
|
||||
"end": "0x30028000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7",
|
||||
"start": "0x30027000"
|
||||
},
|
||||
{
|
||||
"byte_count": 4096,
|
||||
"end": "0x30029000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "2390751521f95a4c513da387bc2ee8a82c5b9261bfc565be5e108fafbda61cf3",
|
||||
"start": "0x30028000"
|
||||
},
|
||||
{
|
||||
"byte_count": 524288,
|
||||
"end": "0x701d0000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "07854d2fef297a06ba81685e660c332de36d5d18d546927d30daad6d7fda1541",
|
||||
"start": "0x70150000"
|
||||
},
|
||||
{
|
||||
"byte_count": 9568256,
|
||||
"end": "0x82920000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "a70993b77ca9e29218d033fad7c0b45c874676c4e0edd966545d39b266486a9c",
|
||||
"start": "0x82000000"
|
||||
}
|
||||
],
|
||||
"committed_pages_total": 2466,
|
||||
"section_contents": null,
|
||||
"deterministic_skip": [
|
||||
"host_base_pointer"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"engine": "canary",
|
||||
"resolve_path_probes": [
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "\\Device\\Cdrom0",
|
||||
"resolved": true,
|
||||
"size": 0
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "\\Device\\Cdrom0\\dat",
|
||||
"resolved": true,
|
||||
"size": 4096
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "\\Device\\Cdrom0\\dat\\movie",
|
||||
"resolved": true,
|
||||
"size": 4096
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "\\Device\\Cdrom0\\dat\\movie\\opening.bik",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": false,
|
||||
"path": "\\Device\\Cdrom0\\default.xex",
|
||||
"resolved": true,
|
||||
"size": 3497984
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "\\Device\\HardDisk0\\Partition1",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "cache:\\",
|
||||
"resolved": true,
|
||||
"size": 0
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "cache:\\nonexistent_probe",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "game:\\dat",
|
||||
"resolved": true,
|
||||
"size": 4096
|
||||
},
|
||||
{
|
||||
"is_directory": false,
|
||||
"path": "game:\\default.xex",
|
||||
"resolved": true,
|
||||
"size": 3497984
|
||||
}
|
||||
],
|
||||
"mounted_devices_observed_count": 1,
|
||||
"cache_root_listing": [],
|
||||
"deterministic_skip": [
|
||||
"host_path_realpath"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"build_id": "ours-phaseB",
|
||||
"cvars": {
|
||||
"phase_b_dump_section_content": false,
|
||||
"phase_b_snapshot_and_exit": true,
|
||||
"phase_b_snapshot_dir": "audit-runs/phase-b-state-equivalence/snap-001"
|
||||
},
|
||||
"deterministic_skip": [
|
||||
"host_ns_at_snapshot",
|
||||
"wall_clock_iso8601",
|
||||
"build_id",
|
||||
"iso_path",
|
||||
"cvars.phase_b_snapshot_dir"
|
||||
],
|
||||
"engine": "ours",
|
||||
"host_ns_at_snapshot": 0,
|
||||
"image_loaded_sha256": "ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18",
|
||||
"iso_path": "",
|
||||
"schema_version": 1,
|
||||
"wall_clock_iso8601": "epoch:0",
|
||||
"xex_entry_point": "0x824ab748",
|
||||
"xex_header_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"xex_image_base": "0x82000000",
|
||||
"xex_image_size": 9568256
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
{
|
||||
"cr": [
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0",
|
||||
"0x0"
|
||||
],
|
||||
"ctr": "0x0000000000000000",
|
||||
"deterministic_skip": [
|
||||
"hw_id"
|
||||
],
|
||||
"engine": "ours",
|
||||
"fpr": [
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000"
|
||||
],
|
||||
"fpscr": "0x00000000",
|
||||
"gpr": [
|
||||
"0x0000000000000000",
|
||||
"0x00000000700fff00",
|
||||
"0x0000000020000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x000000007fff0000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000",
|
||||
"0x0000000000000000"
|
||||
],
|
||||
"hw_id": 0,
|
||||
"lr": "0x00000000bcbcbcbc",
|
||||
"msr": "0x0000000000009030",
|
||||
"pc": "0x824ab748",
|
||||
"pcr_base": "0x7fff0000",
|
||||
"schema_version": 1,
|
||||
"stack_base": "0x00000000",
|
||||
"stack_limit": "0x00000000",
|
||||
"thread_id": 1,
|
||||
"tls_base": "0x00000000",
|
||||
"vr": [
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000",
|
||||
"00000000000000000000000000000000"
|
||||
],
|
||||
"vrsave": "0xffffffff",
|
||||
"vscr": "00000000000000000000000000010000",
|
||||
"xer": {
|
||||
"ca": 0,
|
||||
"ov": 0,
|
||||
"so": 0,
|
||||
"tbc": 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
{
|
||||
"deterministic_skip": [
|
||||
"raw_handle_id",
|
||||
"exports_registered_count"
|
||||
],
|
||||
"engine": "ours",
|
||||
"exports_registered_count": 199,
|
||||
"exports_registered_sample": [
|
||||
"xam.xex!NetDll_WSACleanup",
|
||||
"xam.xex!NetDll_WSAStartup",
|
||||
"xam.xex!XGetAVPack",
|
||||
"xam.xex!XGetGameRegion",
|
||||
"xam.xex!XGetLanguage",
|
||||
"xam.xex!XGetVideoMode",
|
||||
"xam.xex!XMsgInProcessCall",
|
||||
"xam.xex!XMsgStartIORequest",
|
||||
"xam.xex!XMsgStartIORequestEx",
|
||||
"xam.xex!XNotifyGetNext",
|
||||
"xam.xex!XNotifyPositionUI",
|
||||
"xam.xex!XamAlloc",
|
||||
"xam.xex!XamContentClose",
|
||||
"xam.xex!XamContentCreate",
|
||||
"xam.xex!XamContentCreateEnumerator",
|
||||
"xam.xex!XamContentDelete",
|
||||
"xam.xex!XamContentGetCreator",
|
||||
"xam.xex!XamContentGetDeviceData",
|
||||
"xam.xex!XamContentGetDeviceName",
|
||||
"xam.xex!XamContentGetDeviceState",
|
||||
"xam.xex!XamContentSetThumbnail",
|
||||
"xam.xex!XamEnableInactivityProcessing",
|
||||
"xam.xex!XamEnumerate",
|
||||
"xam.xex!XamFree",
|
||||
"xam.xex!XamGetExecutionId",
|
||||
"xam.xex!XamGetSystemVersion",
|
||||
"xam.xex!XamInputGetCapabilities",
|
||||
"xam.xex!XamInputGetKeystrokeEx",
|
||||
"xam.xex!XamInputGetState",
|
||||
"xam.xex!XamInputSetState",
|
||||
"xam.xex!XamLoaderLaunchTitle",
|
||||
"xam.xex!XamLoaderTerminateTitle"
|
||||
],
|
||||
"exports_registered_sha256": "bb97815f82b2313c9eaa07bf80dab47c5c23408c24203a1283dfb2aba1e84e09",
|
||||
"handle_name_table": [],
|
||||
"notification_listeners": [],
|
||||
"objects": [
|
||||
{
|
||||
"details": {
|
||||
"entry_pc": "0x824ab748",
|
||||
"exit_code": null,
|
||||
"hw_id": 0,
|
||||
"is_entry_thread": true,
|
||||
"thread_id": 1
|
||||
},
|
||||
"handle_semantic_id": "9879c5053fedb1d0",
|
||||
"name": null,
|
||||
"raw_handle_id": "0x00001000",
|
||||
"type": "Thread",
|
||||
"type_code": 5
|
||||
}
|
||||
],
|
||||
"schema_version": 1
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"engine": "ours",
|
||||
"files": {
|
||||
"config.json": "35a8749a1507100f393577242c973ccf51ec4280f22262be0836845f40fe5604",
|
||||
"cpu_state.json": "4e6df54ca1939d08854f3a52b49ed2c5ee0823d63cdecad8a7395203dac5443a",
|
||||
"kernel.json": "b64ea3a6c14f1b0aaadc6de8adbb894edf636a813120d08028ca096e1d06bacc",
|
||||
"memory.json": "8ff1253f790f3f2645e9f47fb50fa7b52073ae2e73fe5ef68ff6d53af59681dd",
|
||||
"vfs.json": "97bb2bda57266d8e0dd1da13309eab5ece43130ef378a0b682917d299e9dc4e1"
|
||||
},
|
||||
"schema_version": 1
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"committed_pages_total": 2594,
|
||||
"deterministic_skip": [
|
||||
"host_base_pointer"
|
||||
],
|
||||
"engine": "ours",
|
||||
"guest_address_space_bytes": 4294967296,
|
||||
"heaps": [
|
||||
{
|
||||
"base": "0x00000000",
|
||||
"name": "v00000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"committed": 0
|
||||
},
|
||||
"size": "0x40000000"
|
||||
},
|
||||
{
|
||||
"base": "0x40000000",
|
||||
"name": "v40000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"committed": 263
|
||||
},
|
||||
"size": "0x40000000"
|
||||
},
|
||||
{
|
||||
"base": "0x80000000",
|
||||
"name": "v80000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"committed": 2336
|
||||
},
|
||||
"size": "0x40000000"
|
||||
},
|
||||
{
|
||||
"base": "0x90000000",
|
||||
"name": "v90000000",
|
||||
"page_size": 4096,
|
||||
"page_state_histogram": {
|
||||
"committed": 0
|
||||
},
|
||||
"size": "0x40000000"
|
||||
}
|
||||
],
|
||||
"page_size": 4096,
|
||||
"regions": [
|
||||
{
|
||||
"byte_count": 1048576,
|
||||
"end": "0x70100000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "30e14955ebf1352266dc2ff8067e68104607e750abb9d3b36582b8af909fcb58",
|
||||
"start": "0x70000000"
|
||||
},
|
||||
{
|
||||
"byte_count": 4096,
|
||||
"end": "0x7ffe1000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "ad7facb2586fc6e966c004d7d1d16b024f5805ff7cb47c7a85dabd8b48892ca7",
|
||||
"start": "0x7ffe0000"
|
||||
},
|
||||
{
|
||||
"byte_count": 4096,
|
||||
"end": "0x7fff1000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "e35cddaf9c210aed7505ec4cf1c599f58ac2b7ec25b0885db1ee49aba2db519a",
|
||||
"start": "0x7fff0000"
|
||||
},
|
||||
{
|
||||
"byte_count": 9568256,
|
||||
"end": "0x82920000",
|
||||
"protect": 0,
|
||||
"section_kind": null,
|
||||
"sha256": "ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18",
|
||||
"start": "0x82000000"
|
||||
}
|
||||
],
|
||||
"regions_walked": [],
|
||||
"schema_version": 1,
|
||||
"section_contents": null
|
||||
}
|
||||
71
audit-runs/phase-b-state-equivalence/snap-001/ours/vfs.json
Normal file
71
audit-runs/phase-b-state-equivalence/snap-001/ours/vfs.json
Normal file
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"cache_root_listing": [],
|
||||
"deterministic_skip": [
|
||||
"host_path_realpath"
|
||||
],
|
||||
"engine": "ours",
|
||||
"mounted_devices_observed_count": 1,
|
||||
"resolve_path_probes": [
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "\\Device\\Cdrom0",
|
||||
"resolved": true,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "\\Device\\Cdrom0\\dat",
|
||||
"resolved": true,
|
||||
"size": 4096
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "\\Device\\Cdrom0\\dat\\movie",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "\\Device\\Cdrom0\\dat\\movie\\opening.bik",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": false,
|
||||
"path": "\\Device\\Cdrom0\\default.xex",
|
||||
"resolved": true,
|
||||
"size": 3497984
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "\\Device\\HardDisk0\\Partition1",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "cache:\\",
|
||||
"resolved": true,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": null,
|
||||
"path": "cache:\\nonexistent_probe",
|
||||
"resolved": false,
|
||||
"size": null
|
||||
},
|
||||
{
|
||||
"is_directory": true,
|
||||
"path": "game:\\dat",
|
||||
"resolved": true,
|
||||
"size": 4096
|
||||
},
|
||||
{
|
||||
"is_directory": false,
|
||||
"path": "game:\\default.xex",
|
||||
"resolved": true,
|
||||
"size": 3497984
|
||||
}
|
||||
],
|
||||
"schema_version": 1
|
||||
}
|
||||
130
audit-runs/phase-b-state-equivalence/validation.md
Normal file
130
audit-runs/phase-b-state-equivalence/validation.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# Phase B — Validation record
|
||||
|
||||
All gates executed on 2026-05-13 against the patched canary
|
||||
(`build-cross/bin/Windows/Debug/xenia_canary.exe` + renamed
|
||||
`xenia_canary_phaseB.exe`) and ours (`target/release/xenia-rs` + renamed
|
||||
`target/release/xenia-rs-phaseB`).
|
||||
|
||||
## Gate 1: cvar-OFF determinism
|
||||
|
||||
### ours
|
||||
|
||||
- Pre-patch digest: `audit-runs/phase-a-diff-harness/digest-post-patch-cvaroff.json` (Phase A baseline; Phase A's gate-1 already proved byte-identity to the genuine pre-patch).
|
||||
- Post-Phase-B digest: `audit-runs/phase-b-state-equivalence/digest-post-phaseB-cvaroff.json`.
|
||||
- Both runs: `check --stable-digest -n 50000000` against the same ISO.
|
||||
- `diff` of the two files produces zero output. Byte-identical. **PASS.**
|
||||
|
||||
### canary
|
||||
|
||||
- Phase B adds three new CONFIG DUMP lines (`phase_b_snapshot_dir = ""`, `phase_b_snapshot_and_exit = false`, `phase_b_dump_section_content = false`). All other lines either match Phase A's accepted host-pointer/timing jitter or are unchanged.
|
||||
- Smoke marker (`AUDIT-DEMO-SETUP-BEGIN`) still fires.
|
||||
- **PASS** by the Phase A gate-1 method.
|
||||
|
||||
## Gate 2: Snapshot files well-formed
|
||||
|
||||
### ours
|
||||
|
||||
```
|
||||
$ ls audit-runs/phase-b-state-equivalence/snap-001/ours/
|
||||
config.json cpu_state.json kernel.json manifest.json memory.json vfs.json
|
||||
```
|
||||
|
||||
All six files parse as JSON, lead with `"schema_version": 1` (or contain it in manifest), and are alphabetically sort-keys-sorted (verified by re-serializing — `serde_json::Map` defaults to ordered). **PASS.**
|
||||
|
||||
### canary
|
||||
|
||||
```
|
||||
$ ls audit-runs/phase-b-state-equivalence/snap-001/canary/
|
||||
config.json cpu_state.json kernel.json manifest.json memory.json vfs.json
|
||||
```
|
||||
|
||||
Same six files, same shape. Note: canary's `phase_b_snapshot.cc` writes JSON via direct `fmt::format` rather than a JSON map, so keys are emitted in **insertion order, not alphabetical order**. The diff tool parses to dict before comparing, so this asymmetry has no functional impact (verified empirically — `diff_state.py` produces identical reports across multiple runs of either engine). It does mean the canary↔ours manifest hashes differ even when the underlying state is semantically identical; the diff tool falls back to full content comparison in that case. **PASS** with this caveat documented.
|
||||
|
||||
## Gate 3: Hash-deterministic re-runs (ours)
|
||||
|
||||
Two runs of ours with identical args:
|
||||
|
||||
```
|
||||
$ ./target/release/xenia-rs-phaseB exec --quiet \
|
||||
--phase-b-snapshot-dir <dir> --phase-b-snapshot-and-exit <iso> # run 1
|
||||
$ mv <dir>/ours <dir>/ours-a
|
||||
$ ./target/release/xenia-rs-phaseB exec --quiet \
|
||||
--phase-b-snapshot-dir <dir> --phase-b-snapshot-and-exit <iso> # run 2
|
||||
$ diff -r <dir>/ours <dir>/ours-a && echo BYTE-IDENTICAL
|
||||
BYTE-IDENTICAL
|
||||
```
|
||||
|
||||
**PASS.** Re-running ours with the same args produces hash-identical snapshot files.
|
||||
|
||||
> The first re-run attempt produced a `config.json` mismatch because the
|
||||
> two runs were given different `--phase-b-snapshot-dir` values (whose
|
||||
> path string is embedded in `config.json::cvars.phase_b_snapshot_dir`).
|
||||
> That field is in the diff tool's `SKIP_BY_FILE["config.json"]` skip
|
||||
> set; the hash difference confirmed the skip rule is well-placed. With
|
||||
> identical inputs the snapshots are byte-equal.
|
||||
|
||||
## Gate 4: Invariants (HARD GATE)
|
||||
|
||||
From `report.md`:
|
||||
|
||||
| invariant | canary | ours | ok? |
|
||||
|---|---|---|---|
|
||||
| xex_entry_point | `0x824ab748` | `0x824ab748` | **PASS** |
|
||||
| cpu_state.pc == xex_entry_point | `0x824ab748 == 0x824ab748` (canary) | `0x824ab748 == 0x824ab748` (ours) | **PASS** |
|
||||
| image_loaded_sha256 | `a70993b7…` | `ea8d160e…` | **FAIL → STOP** |
|
||||
|
||||
The PC + entry-point invariants prove the snapshot point is **equivalent across engines** — both fired immediately before the first instruction at the same address. This is the principal Phase B equivalence claim.
|
||||
|
||||
The `image_loaded_sha256` mismatch is the **expected STOP condition** per the spec. Phase B's contract is to detect and report this; investigation belongs to Phase C/D. The report.md flags it explicitly with re-run guidance.
|
||||
|
||||
## Gate 5: Diff-tool negative test
|
||||
|
||||
```
|
||||
$ cp audit-runs/phase-b-state-equivalence/snap-001/ours/kernel.json /tmp/kernel-mut.json
|
||||
$ sed -i 's/"thread_id": 1/"thread_id": 999/' /tmp/kernel-mut.json
|
||||
$ mkdir -p /tmp/ours-mut && cp -r audit-runs/phase-b-state-equivalence/snap-001/ours/* /tmp/ours-mut/
|
||||
$ cp /tmp/kernel-mut.json /tmp/ours-mut/kernel.json
|
||||
$ python3 tools/diff-state/diff_state.py \
|
||||
--canary audit-runs/phase-b-state-equivalence/snap-001/ours \
|
||||
--ours /tmp/ours-mut --out /tmp/r.md
|
||||
$ echo $?
|
||||
1
|
||||
```
|
||||
|
||||
Report.md names two divergences:
|
||||
- `kernel.json <manifest>` `manifest-hash-mismatch` — surfaces that `/tmp/ours-mut/kernel.json`'s SHA does not match what `/tmp/ours-mut/manifest.json` claims.
|
||||
- `kernel.json objects[handle_semantic_id=…].details.thread_id` value=`canary=1, ours=999` — the actual mutation.
|
||||
|
||||
**PASS.**
|
||||
|
||||
> Verified 2026-05-13 (Phase A/B verify session). Pre-fix the diff tool
|
||||
> trusted the manifest-claimed hashes without verifying them; a tampered
|
||||
> file with an intact manifest copy would silently report "identical"
|
||||
> (exit 0). The fix in [`diff_state.py`](../../tools/diff-state/diff_state.py)
|
||||
> (around `diff_directory`) re-hashes each file, surfaces a
|
||||
> `manifest-hash-mismatch` σ-structural divergence when the on-disk SHA
|
||||
> does not match the manifest, and falls through to a full content diff.
|
||||
|
||||
## Summary
|
||||
|
||||
| Gate | Status |
|
||||
|---|---|
|
||||
| 1. Cvar-OFF determinism (both engines) | PASS |
|
||||
| 2. Snapshots well-formed (both engines) | PASS |
|
||||
| 3. Hash-deterministic re-runs (ours) | PASS |
|
||||
| 4. Invariants — pc == entry_point | PASS |
|
||||
| 4. Invariants — image_loaded_sha256 | **FAIL → STOP** (expected: this is what Phase B catalogs) |
|
||||
| 5. Diff-tool negative test | PASS |
|
||||
|
||||
## Cascade prediction at session close
|
||||
|
||||
- A (snapshot tool emits readable state both engines): **achieved**.
|
||||
- B (section content hashes match): **NOT achieved** — `image_loaded_sha256` differs. The XEX is loaded into different post-decompression states between the two engines. This is the primary finding that Phase C will investigate, *not* a Phase B failure.
|
||||
- C (divergence catalog produced with classification): **achieved** — 58 divergences across all 5 files, fully classified.
|
||||
- D (fix lands): **N/A — out of scope for Phase B**.
|
||||
|
||||
## Notes on minor implementation choices
|
||||
|
||||
- Canary's PPCContext doesn't expose a `pc` field (the JIT dispatch loop manages PC). At the snapshot point the about-to-execute PC equals the `address` arg to `processor()->Execute(...)`, which the hook receives as `entry_address`; we emit that value as `cpu_state.pc`.
|
||||
- Memory snapshots emit a **fixed named-region list** (XEX image, main stack, PCR, TLS) rather than walking the full page table. An earlier blanket-walk approach crashed in Wine because canary's `QueryRegionInfo` reports `COMMIT` for some pages whose host-side backing is reserved-not-committed (physical heap mirrors, low system heap). The named-region list is sufficient for the diff tool's cross-engine comparison.
|
||||
- The `xex_header_sha256` field uses different formats in each engine (canary emits a 64-bit `UserModule::hash()`; ours emits a placeholder zero string). This is a known one-line shim that Phase B intentionally leaves as a divergence to demonstrate the diff tool's δ-content class.
|
||||
Reference in New Issue
Block a user