D287 M-152: correct false evidence citation, static architecture trace

scratch/d287_freeze_gdb.txt, cited as this finding's freeze-time
evidence, does not contain it -- grepped for every specific number the
write-up quotes (frame 17616, the three heartbeat stall times) and got
zero hits. The file on disk is an unrelated clean normal-exit capture.
No real freeze-time thread state has actually been analyzed for this bug
yet; corrected the entry so a future session doesn't treat it as
narrowed-and-confirmed.

Also traced the consumer/producer architecture statically (mainThread's
only OS_MESG_BLOCK send is rsp.c:271's osSendMesg into the scheduler's
cmdQ; GE_D60 doesn't cover sends), and found portHeartbeatCheck hard-caps
at 3 reports/process -- "heartbeat stopped logging" in the original
write-up is that cap, not new evidence. Both quirks added to
porting-notes.md. No code change -- diagnostic-only pass, needs a real
live capture next.
This commit is contained in:
James Dansereau committed 2026-09-16 16:26:39 -04:00
1 parent 695ff7ec09
commit 8d42ac5ee2
2 files changed
+16 -1

No files matched your search

+13
View File
@@ -702,6 +702,19 @@ through a converter or a runtime bswap fixup reads scrambled.
Confirm the `src/game/` side is clean first (item ID, resource-table
entry, model header, generic equip/gate pipeline) before spending time
in fast3d — but once it is, look there, not back at the decomp logic.
- **`portHeartbeatCheck` (`port/src/libultra.c:218`) hard-caps at 3
reports total per process lifetime, by design** ("stop after a few
reports"). When chasing a long-idle hang (D287), "the heartbeat stopped
logging" is that cap firing, not evidence the hang resolved, worsened,
or changed mechanism — don't read silence from this diagnostic as a
signal. Gate a raised/unlimited report count behind its own env var for
these investigations instead of trusting the default cap's silence.
- **Before citing a `scratch/*.log`/`.txt` capture as "evidence" in a
finding, grep it for the specific numbers/strings the write-up claims**
(D287): a file with the right name on disk is not proof it holds the
claimed capture — this one turned out to be an unrelated normal-exit
run, not the freeze it was cited for, and the mistake propagated
through the entry unnoticed until a later static pass checked.
- **D74 wrap-block is DEAD CODE** (`gfx_pc.cpp:1546/1551`): guard is
`cms & G_TX_WRAP` but `G_TX_WRAP == 0`, so always false (line 1887 does
it right with `cms == G_TX_WRAP`). And if it did run it indexes