D581 - Every mapping the guest was given, in order

Status: measured Date: 2026-09-08

The half a run has never reported

A run says this and nothing else about memory:

orbistoun: 1 reservation(s) failed, first at 0x7400047e0000, len=0x1fe0000 - conflict

The failures. Nothing about the eighty-odd that succeeded - so a pointer into guest memory could not be traced back to the call that produced it, and two runs whose arena addresses differed could be seen to differ and not where.

That is the asymmetry D578 closed for the filesystem, in the second subsystem that had it. ORBISTOUN_TRACE_MAPS is ORBISTOUN_TRACE_OPENS for memory, gated for the same reason: a title maps steadily for as long as it runs, so an ordinary run pays one atomic load.

Four fields, and three of them exist because a diff needed them

field why
base, length, readable what was placed
order a bump allocator's address is a function of everything before it, so the list is a sequence and not a set
at_call when, in the run's own units. An address says two runs differ; a call ordinal says where to look
during what was running. The import last called, named by the reporting layer, which is the one that holds the table
hinted a guest that names its own address repeats; one taking what the arena offered moves when anything before it moves

Each of the last three was added because the previous diff could not answer the next question, and the third is what ended the investigation in one run: mapping 19 in one run said during libkernel::scePthreadCreate. The guest makes threads, which nothing in the default report says because scePthreadCreate is implemented and only unimplemented calls are ranked.

What it measured

With the two determinism fixes of D582 in place, two runs of PPSA03416:

identical mappings
host clock 1 of 49
logical clock 19 of 47
logical clock, ignoring call ordinals 24 to 30 of 47

and the divergence sits exactly at the first scePthreadCreate. Before it the sequence is identical, address for address and call for call; after it, guest threads are real host threads and their interleaving is not this project's to reproduce.

That is a diagnosis rather than a fix, and the record is what makes it one: without the sequence the same runs said only that the arena moved.

Recorded at one site, printed through one function

mapping_placed already existed as the single place that means a mapping now exists (D579), so the record has one call site rather than three - and the print goes through what_the_guest_asked_for, the function that exists because a reporter had been wired into some of the ways a run can end and not all of them, three times.

What this does not establish

That the list is every mapping. It holds what passed through mapping_placed; a path that places memory some other way is absent and would look identical to no mapping at all. None is known, and none has been looked for.

Nor that a stable mapping sequence means a stable run. It is one observable of many. Two runs agreeing here can still differ in what they compute, and the call ordinals already show they differ in how many calls fall between mappings.