D121 - Console generation is observed, never asserted from presence
Console generation is observed, never asserted from presence:
both and neither resolve to
unknown, and only a single driver may name a
console.
Status: implemented - the HUD (src/sysinfo.c) renders
GEN unknown when both or neither graphics driver resolves;
005-generation already returned a partial for
both, and its wording now names the cause. Verified on
shadPS4 (GEN UNKNOWN); make check green
(117).
The HUD's GEN field read the presence of a
current-generation graphics symbol as proof of the current console. On
shadPS4 that printed 5 (current) on a PS4 emulator, next to
its own PS4-scale MEM/VRAM. It was the one
field that trusted a pointer instead of observing behaviour - principle
2, broken in the program's own header.
No address-only test can rescue it.
obs_address_is_callable is
addr != NULL && addr >= OBS_LOWEST_CALLABLE: a
crash-guard (D058) answering "safe to jump here", not "does this work".
A loader that stub-resolves every unresolved import answers "yes" to any
symbol - shadPS4 stub-resolved 64,183 of this program's imports in one
run, 1,058 of them NIDs it could not even name, 236 in
libSceAgc - so presence on such a loader is worthless by
construction. The contrast is in its own log: the PS4 video-out it
implements runs through Lib.VideoOut
(driver.cpp) with real parameters; every
Agc/Gnm/…2 symbol is a
Core.Linker Stub resolved warning.
So presence can name a generation only when exactly
one driver resolves. both is the fingerprint of a
stub-everything loader as much as of back-compat, and
neither is the normal early-emulator state - both are
unknown. both renders unconfirmed (something
graphics-shaped did resolve), neither absent.
Detection (obs_detected_generation, D110) is unchanged;
it still returns current/previous/both/unknown. This decision governs
how the two consumers report both: the header as
unknown, the section as a partial that cannot attribute
absences. Neither claims a console it cannot prove.