D177 - abort must not return, and it was reporting the opposite of the truth

decided ยท 2026-08-21

With the previous generation parsing, two titles failed identically: illegal instruction at image+0x1595bc9, 53 calls, four frames. Identical across unrelated titles is the D152 signature - a shared path rather than title code.

The ordered call tail with call sites (D173) named it in one line:

52  libc::abort   arg0=0xc10   from 0x400001595bc9

abort called from the exact address that then trapped. It is declared noreturn, so a compiler emits an unreachable trap immediately after the call. abort was not declared here at all, fell to the default stub, returned, and execution ran into that trap.

So the emulator was reporting illegal instruction at a meaningless address while the guest was doing something perfectly clear: giving up. That is worse than an unimplemented function - it is a report that contradicts what happened.

The layering it needed

A guest that stops has decided to stop; how to stop is not the subsystem crate's business. It does not know whether a trace is being written or where it goes. The worker knows, and sits above the subsystem crates, so it cannot be called downwards.

orbistoun-core::stop is a handler the worker installs and the subsystems call - the ordinary way to invert a dependency without breaking the spine (principle 6). The trace is persisted before the process ends, the same as the fault and time-limit paths.

A third outcome, which was being reported as the second

A run ends by faulting, by being stopped from outside on the time limit, or by the guest deciding to stop. There was no field for the third, so a trace with no fault meant "ran to the time limit" - and a guest that called abort was described as having run out of time. Not merely imprecise: the opposite of what happened.

CallTrace::stopped records it, and the report now reads fault the guest called abort.