2026-09-03 - (/loop) The instrument existed, and I mis-grepped it

tests   1991  ->  1991   (no code; three measurements and a correction)

D493 closed with "the next instrument is a trace of bound calls, and it is not optional", and framed it as a design question because a forwarding thunk would reintroduce the indirection principle 7 forbids.

There was nothing to build. ORBISTOUN_WATCHPOINT has accepted :x since it was written - a hardware execute breakpoint, one-shot, snapshotting registers at the hit, four at a time. watchpoint.rs says so in its own module comment. D493 was written off the summary line without reading the vocabulary underneath it, on the same day.

The rule that would have caught it was in the loop prompt, written by me the tick before: before adding a measurement, check whether something already holds the number.

Then I broke my own positive control

Armed on the faulting instruction - which the guest demonstrably executes - it appeared not to fire. It fired. The two kinds of hit are worded differently:

0x480001f0c338: touched after the access at 0x4800013d5eba …    <- data
execute breakpoint at 0x4800013dca44 … hit 1 time(s)            <- execute

grep touched finds one and misses the other. A working instrument read as broken, and the next step would have been a defect report against code doing its job.

A negative from a filter is a fact about the filter. Same family as D490 and D492, and three for three the cheap check would have saved the expensive conclusion.

What it says once asked properly

Five imports the eboot binds into Il2CppUserAssemblies, under execute breakpoints:

export called
0x9162adc3c86893df twice
0x9fdbed4fe0989d70 once, and faults
0xc8275f216d188633 (setenv) never
0x6f8b9da539afc9af never
0x00e9dafedfe399fe never

The resolver is never reached. It showed 222 calls before binding, carrying il2cpp_init, and that is why it looked like the centre of everything. With real code behind the other imports the guest dies in its second call - long before asking for a symbol by name.

Those 222 calls described a path the guest only took because the imports answered placeholders. A number measured under a broken condition measured the broken condition.

And a data watchpoint over the whole run

0x480001f0c338: touched after the access at 0x4800013d5eba, saw 0x0
0x480001f0c338: touched after the access at 0x4800013dca44, saw 0x0

Two accesses, both reads, zero both times, with the faulting read present as its own control. Nothing writes it. The first read is 0x2a inside 0x9fdbed4fe0989d70 - that export reads the global, finds it empty, and calls the function that dereferences it regardless.

What is open

0x9162adc3c86893df runs twice before any of it and does not touch that address. Whether it is supposed to, whether the eboot should call something else first, or whether the platform fills that memory at load, is unestablished - and the three obvious answers are dead already (D491, D492, D493).

What is new is the ability to ask: execute breakpoints on module code work, four at a time, with registers at the hit.

State

cargo test --workspace green - 117 suites, 1991 tests, 0 failures. fmt clean, identity scan clean. No code changed this tick.

Nothing committed. The day holds worklogs 292-344 and D466-D494.

Next: what 0x9162adc3c86893df does with its two calls - registers are already captured at its entry, and its arguments are on the stack addresses the snapshot shows.