D641 - Four numbers, and the wall moved
Status: measured Date: 2026-09-09
The probe started making real syscalls, and orbistoun refused them
REQ-20260908T1620Z-4c1e came back delivered: obSCEne now
reports its syscall route per leg. Run locally, it says something nobody
had asked for:
OBS|measure|010-kernel/syscall-route|syscall|payload-args|0x0|flag
OBS|measure|010-kernel/syscall-route|syscall|gadget|0x700000008c0a|address
0x700000008c0a is orbistoun's own thunk
table - getpid plus ten, the nop sled D400 laid
down so a payload's gadget hunt finds a real syscall entry. The probe's
new build looks for one in title mode and finds it. So for the first
time a guest here issues real syscalls, and the run
that followed went backwards: 223 imports to 187, 394,000 calls to
4,886, a clean exit replaced by a fault at 0x5e2d.
The report named the reason without being asked:
orbistoun: the guest made 4213 syscalls, in this order:
0 603 nothing here implements it (0x400000280000)
1 603 nothing here implements it (0x40000027c000)
2 603 nothing here implements it (0x400000278000)
Four thousand two hundred and thirteen calls to number
603, with a first argument walking backwards through
the guest image in 0x4000 steps. That is a program mapping
its own address space, never told where a region ends, stepping by hand
and never stopping.
603 is sceKernelVirtualQuery, which this project
has implemented for months. It answered by name and refused by
number - the same one-function-two-answers shape D632 found in
sceKernelDlsym, one layer down.
Four numbers, each one observed before it was added
vendor-syscalls.toml sets the bar itself: "Nothing
may be added here because it seemed likely. The bar is that a guest was
watched asking for the number, and that what it does with the answer is
described." Four entries now meet it, and the order matters:
| number | name | how it was reached |
|---|---|---|
| 603 | sceKernelVirtualQuery |
4,213 calls, walking the image backwards |
| 572 | sceKernelAllocateDirectMemory |
only after 603 was bound |
| 573 | sceKernelMapDirectMemory |
only after 572 |
| 574 | sceKernelReleaseDirectMemory |
only after 573 |
The last three were invisible until the first was answered - the guest never got past its memory walk to ask. That is what makes them observed rather than inferred, and it is why they were added in two steps rather than one.
585 and 586 are deliberately absent. obSCEne picks
obs_is_ps5() ? 585 : 573 for map and 586 : 574
for release; this guest asked for the lower pair, so under orbistoun its
generation test answers "not the current one" - a fact about what this
emulator presents, worth knowing on its own. Adding the upper pair
because their siblings were seen is exactly the "it seemed likely" the
file refuses.
What it moved
imports 225 distinct (+38), 432605 calls (+427701)
fault the guest called exit (was 0x5e2d)
verdict FURTHER executed code it could not reach before
225 distinct imports - past the previous best of 223 - and a clean exit. Against the console's pkg leg:
| before | after | |
|---|---|---|
| checks concluding differently | 255 | 84 |
| passed there, failed here | 115 | 5 |
| distinct findings | 17 | 5 |
What is left is three libSceNet checks, one input-SDK poll, and
900-surface/control - the weak symbol that should be null
and is bound (D633).
And the AGC wall answered, in the same batch
REQ-20260908T1621Z-7a5d resolved
not-possible - no leg maps libSceAgc - but the sweep
carried 166-agc/create-shader measurements anyway, from the
payload leg:
| condition | answer |
|---|---|
| well-formed header | 0x8a6c002f |
the 0xd8 payload shape |
0x8a6c002f |
the 0x118 payload shape |
0x8a6c002f |
PPSA03416's own 0x108 shape, supplied
by this project |
0x8a6c002f |
| null argument | 0xb |
And OBS|bytes|…|out-after is unchanged poison:
the call writes nothing.
So the header is not the variable. Every shape is refused
identically, including one a real title passes. Forcing that measured
code into PPSA03416 was tried and moved nothing - as forcing
0x0 did not, earlier - which says again that the guest acts
on the out-parameter and not the return. D621's wall stands, and it is
now bounded: not a header question, and not a return-code question.