D369 - A marker nobody decodes is arithmetic somebody does by hand
decided - 2026-08-29
sentinel_slot has existed since D308 and nothing
called it. Every marker fault this project has ever reported
was decoded by a person dividing an address by a stride they had to go
and look up, and it was done three times in one session before anybody
noticed the decoder was already written.
The reporter asks it now. The first run afterwards said:
read of 0x5e2700002000 is handoff field 2 itself, which nothing has established
which is the finding D368 had to infer from a pair of runs, stated outright by one.
The decoder lives where the marker is made
orbistoun-report took a dependency on
orbistoun-abi rather than copying two constants. Two copies
of that arithmetic is how a decoder comes to disagree with the thing it
decodes - and the disagreement would be silent, because both would
produce a plausible field number.
Two depths, because one could not answer the next question
A field marker says the guest used field n, and that is
all it can say: the moment the guest reads through the field,
the marker has done its job and what comes back is whatever is in the
page. A zeroed page answers zero, which names nothing.
So the page behind each field can hold markers of its own, one per
word, each naming the field and the offset it was read
from. ORBISTOUN_HANDOFF_FIELDS now has four
settings, and each answers a different question:
| setting | what it answers |
|---|---|
strict |
which field the guest used - any use stops the run at an address that names it |
markers |
how far it gets when reads through a field succeed |
deep |
which member of what a field points at was used |
zero |
how far it gets when every field is a value it can check |
strict is the one that named field 2, and it is the one
that had been quietly lost when the region was mapped in D365 - mapping
makes the read succeed, which is what let the guest get further and is
exactly what stops it saying which field it read.
The stride is not shared, and that is not tidiness
Content markers use their own stride, deliberately far from the field
markers'. A guest truncating a marker to thirty-two bits - which they
do, because a structure member is often an int - keeps only
the low half; with one stride, both depths produce the
same low half, and the question the two depths exist to
tell apart would have the same answer either way.
That is not hypothetical. klogsrv carries a truncated
marker into an address it then dereferences: 0x2001 is
field 2's low half plus one. With a shared stride, "did that come from
the field or from what the field points at" would have been
unanswerable; with separate strides, one run said it came from the
field.