Handoff snapshot of the env-gated diagnostic scaffolding used across the intro-video RE. Kept out of the milestone commits (645feb8..5573ac1) to keep those clean; committed here so nothing is lost on handoff. New — XENIA_PROFILE wall-time profiler (crates/xenia-gpu/src/prof.rs): Coarse buckets attributing playback wall time to interpreter (step_block), kernel HLE (call_export), block decode/cache (lookup_or_build), texture decode, host draw, and present; prints periodic snapshots (every 500M guest instr, or every 500 presents) + a clean-exit report. Hot path is gated on a cached is_on() (one relaxed load) so it is zero-cost when XENIA_PROFILE is unset. Call sites: main.rs run_superblock / parallel worker (step_block, lookup_or_build, call_export), texture_cache ensure_cached, render.rs present + dispatch_xenos_draws. First profile (movie playback, headless single-thread lockstep): effective ~35 MIPS; interpreter body ~40% @ ~95-102 MIPS; texture decode 0.3% (cache works); present ~0%; the rest is per-block dispatch + scheduler plumbing (~13 instr/block over 229M blocks). Overhead-bound, not interpreter-body bound; the levers are coarser execution units (superblock chaining) and ultimately a JIT. Pre-existing read-only probe knobs (were uncommitted; env-gated, observe-only): XENIA_RET_CAPTURE_PC/_REG/_MEM, LOG_RESUMES, LOG_WAITS, LOG_SIGNAL, FORCE_TID, STARVE_LIMIT, INCUMBENT_PICK, INSTR_PER_MS, DUMP_FRAME, DUMP_WGSL, BIND_LOG, CONST_LOG, DISPATCH_REC, AUDIT_PC_TRACE. Tooling: sylph-run.sh (movie oracle loop, 180s default timeout), zq.py (DuckDB disasm/xref helper). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
44 lines
2.5 KiB
Bash
Executable File
44 lines
2.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# sylph-run.sh — run the ours xenia-rs emulator N times and report the standard
|
|
# intro-video oracles. Inherits any XENIA_* probe knobs from the caller's env
|
|
# (e.g. XENIA_FORCE_TID=24, XENIA_STARVE_LIMIT=16, XENIA_LOG_SIGNAL=0x40d10214).
|
|
#
|
|
# Usage: [XENIA_*=... ] sylph-run.sh [runs] [n_instr] [timeout_s] [extra_grep_regex]
|
|
# runs default 6
|
|
# n_instr default 3000000000
|
|
# timeout_s default 180 (boot is DETERMINISTIC and reaches the intro
|
|
# movie's first on-screen frame at ~81s wall; the movie then
|
|
# plays reliably. The old 90s default sat ~9s above that point,
|
|
# so host-load wall-clock jitter cut some runs off just before
|
|
# the movie — the apparent "~1/3 of runs" flakiness. 180s clears
|
|
# it with margin. Guest-instruction execution is identical run
|
|
# to run; only wall time varies with host speed.)
|
|
# extra_grep optional ERE; matching stdout lines are saved per-run for ad-hoc inspection
|
|
#
|
|
# Always-on oracles: source-read 0x824ff708 count (>1 = feeder looped), decode-worker
|
|
# resumes (tid25 start_entry 0x82506588 / tid26 0x825065b8). Full per-run log kept under
|
|
# /tmp/sylph-run/.
|
|
set -u
|
|
cd "/home/fabi/RE - Project Sylpheed/xenia-rs" || exit 2
|
|
RUNS="${1:-6}"; N="${2:-3000000000}"; TO="${3:-180}"; XGREP="${4:-}"
|
|
OUT=/tmp/sylph-run; mkdir -p "$OUT"
|
|
BIN=./target/release/xenia-rs
|
|
[ -x "$BIN" ] || { echo "build first: (cd xenia-rs && export CARGO_BUILD_JOBS=4 && cargo build --release)"; exit 3; }
|
|
|
|
echo "sylph-run: runs=$RUNS n=$N timeout=${TO}s knobs=[$(env | grep -oE 'XENIA_[A-Z_]+=[^ ]*' | tr '\n' ' ')]"
|
|
for i in $(seq 1 "$RUNS"); do
|
|
F="$OUT/run_$i.log"; REC="$OUT/rec_$i.txt"
|
|
RUST_LOG="${RUST_LOG:-warn,xenia_kernel::exports=info,xenia_kernel::state=info}" \
|
|
XENIA_DISPATCH_REC=1 XENIA_DISPATCH_REC_SITES="${XENIA_DISPATCH_REC_SITES:-0x824ff708}" \
|
|
XENIA_DISPATCH_REC_OUT="$REC" \
|
|
timeout "$TO" "$BIN" exec sylpheed.iso -n "$N" >"$F" 2>&1
|
|
pkill -x xenia-rs 2>/dev/null
|
|
sc=$(grep 0x824ff708 "$REC" 2>/dev/null | awk '{print $3}' | head -1)
|
|
w25=$(grep -c "RESUME.*0x82506588" "$F" 2>/dev/null)
|
|
w26=$(grep -c "RESUME.*0x825065b8" "$F" 2>/dev/null)
|
|
xg=""; [ -n "$XGREP" ] && xg=" match($XGREP)=$(grep -cE "$XGREP" "$F" 2>/dev/null)"
|
|
reached="movie"; [ "${sc:-0}" = "0" ] && reached="no-movie"
|
|
echo " run $i: [$reached] source-read=${sc:-0} tid25-resume=$w25 tid26-resume=$w26$xg (log: $F)"
|
|
done
|
|
echo "done. per-run logs in $OUT/. Reliable: source-read>1 = feeder looped; tid25/26 resume = pipeline progressed."
|