XROUT XSNET / XRUNN=2 condition decode - the real precondition (2026-07-23)¶
Static byte-level reverse-engineering of the SINTRAN XROUT kernel
(XMSG-XROUT-L03.BPUN) to find the EXACT condition under which
START-NETWORK-SERVER ENNS0 yields XROUT error XRUNN=2 "Unknown name
(of server or system)". This closes the [OPEN] left by the prior
XMSG-COMMAND-START-NETWORK-SERVER-DECODE-2026-07-23.md (which could not
disassemble the XROUT BPUN for lack of a load base).
Tags: [V] = VERIFIED (decoded bytes / read source / manual quote);
[I] = INFERRED; [OPEN] = not decoded here, exact anchor given.
STRICT no-guessing on XMSG per repo policy.
Version caveat: the running guest banner is XMSG version M00 (88.03.25); these binaries are L03. The prior decode verified the START-NETWORK-SERVER flow is version-stable L03<->M. The XROUT service structure decoded here is L03; where an address is L03-specific it is marked.
0. Headline (the answer)¶
[V]XSNET (service 85) NEVER returns XRUNN=2. Its handlerRSNET@ 0o13753 has a fully-decoded error jump-table (0o14364-0o14407) whose only status codes are 6, 16, 17, 18, 27, 31, 33, 36, 39 - never 2. So the "Unknown name" the operator sees is not produced by the XSNET start call itself.[V]XRUNN=2 is a name-table MISS. It is returned by the XROUT services that RESOLVE a name through the kernel lookup routine CHNAM @ 0o20161:getMagic(RSGMG @0o6200, service XSGMG=71),get-info-about-name(RSGIN @0o6231, XSGIN=82), and the other name-consuming services. Each doesJPL CHNAM; JXZ notfound; ... SAA 2; JPL XRPLY. When the name is not in the XROUT name table, XRUNN=2.[V]The name table is populated only by the kernel inserter YNNAM @ 0o17710, which is called byXSCRS(create service, 80 /RSCRS),XSNAM(give name to port, 66 /RSNAM) andXSDRN(define remote name, 73 /RSDRN). All three first require a local system number (they return XRNLS=27 "No local system number defined" if it is unset).[V]Why the tested DEFINE-REMOTE-NAME fix did nothing:DEF-REMOTE,,D100 100DID insert a name via YNNAM - but the literal string it inserted wasD100, not*XM-ENNS0.getMagic(*XM-ENNS0)still misses CHNAM -> still XRUNN=2. DEFINE-REMOTE-NAME was not the wrong command family, it was the wrong name argument (and semantically it is for remote SYSTEM names, not the local*XM-server name).[V]/[I]The true missing precondition: the literal name*XM-ENNS0must be created in the XROUT name table via XSCRS/XSNAM (which itself needs a local system number defined first, XSDLO=83 / DEFINE-LOCAL-SYSTEM). Neither ENNS0 (proven: only XFDUM+XFDCT) nor the XSNET start handler creates it - XSNET assumes it already exists (it does a getMagic/lookup, not a create). So the creator is an upstream COSMOS network-generation / config step that the harness skipped. This is a config/procedure gap, not an emulator or SINTRAN defect.
1. BPUN loader (Task 1) - VERIFIED¶
Added tools/bpun_load.py implementing the ND-100 absolute binary format
per ND-06.014.2A section 4.2.5.1 ("Binary Format Load"):
A B C ! E F G H I
A = arbitrary text (here a paper-tape octal bootstrap, high-bit CR = 0x8D)
C = octal number just before '!' = program start address
! = 0x21 start-of-binary marker
E = block load address (2 bytes, MSB first)
F = word count (2 bytes, MSB first; E,F,H not counted)
G = F data words (2 bytes each, MSB first)
H = checksum = 16-bit arithmetic sum of the G words
I = action byte (0 => start at C ; nonzero => return to operator)
Applied to the two XMSG segment images (both checksums VERIFIED OK):
| file | load base | words | span | checksum |
|---|---|---|---|---|
XMSG-XROUT-L03.BPUN |
0o000000 | 39943 | 0o000000-0o116006 | calc=file=0o000540 OK |
XMSG-KERNEL-L03.BPUN |
0o120000 | 23551 | 0o120000-0o175776 | calc=file=0o005520 OK |
[V] Key structural discovery: XROUT and the XMSG-KERNEL are linked into
one shared logical address space - XROUT at 0, the kernel at 0o120000. That
is why XROUT's indirect-call pointer cells contain kernel addresses
(0o120605 CFMSK, 0o131104 YPFND, 0o132617 ZRALL, ...). The findings below load
BOTH images into one flat mem[]. Anchoring is by XMSG-SYMBOL-L03.SYMB
(NAME=octal, high-bit ASCII); the RS* symbols are the service-handler entry
addresses, RSNET=0o13753, RSGMG=0o6200, RSGIN=0o6231, CHNAM=0o20161,
YNNAM=0o17710, XRUNN=2.
tools/disbpun.py (loader + symbol annotator over nd100dis) was used for the
disassembly; the ND-100 opcode reads were hand-verified against the nd100-asm
reference.
2. The XROUT service dispatcher (Task 2) - VERIFIED¶
The service-code -> handler table is at 0o2323 (run 1) + 0o2334 (run 2),
indexed as RSTAB[0o2223 + service_code] (verified against three known
slots: XSCRS=80@0o2343, XSGIN=82@0o2345, XSDLO=83@0o2346, XSNET=85@0o2350).
Relevant entries:
0o2343 -> 0o5463 RSCRS (XSCRS=80 create service)
0o2345 -> 0o6231 RSGIN (XSGIN=82 get info about name)
0o2346 -> 0o11357 RSDLO (XSDLO=83 define local system)
0o2350 -> 0o13753 RSNET (XSNET=85 start/stop gateway) <== the "start" call
0o2334 -> 0o5620 RSDRN (XSDRN=73 define remote name)
RSGMG=0o6200 (XSGMG=71 getMagic), RSNAM=0o5433 (XSNAM=66 give name)
3. XSNET (RSNET) does NOT emit XRUNN=2 - VERIFIED¶
RSNET @0o13753 processing spine (frame register B; the request/letter is
reached via -115,B/-118,B), resolved call targets in brackets:
0o14050 LDD =0o14012 ; A,D = server-name descriptor from the letter
0o14051 JPL [CHMAG 0o20204] ; check the caller's MAGIC number in the request
0o14054 JMP [-> 0o14370] ; magic bad -> SAA 39
0o14055 JPL [RCHEK 0o20036] ; request check (calls kernel YPFND 0o131104)
0o14056 JMP [-> 0o14370] ; check fail -> SAA 39
0o14060 JPL [QNFND 0o15141] ; search the net-server/friend table (50-word entries)
0o14062 JMP [-> 0o14374] ; not found -> SAA 16
...
0o14126 JPL [QNSIN 0o14430] ; success path: Name-Server INSERT (net-server table)
Its complete error jump-table (each SAA n; JPL XRPLY), decoded byte-for-byte:
0o14364 SAA 6 -> XRPLY XRMMP Missing mandatory parameter
0o14366 SAA 18 -> XRPLY XRNXD Not enough resources (XD/XF/XM) for start-link/netserver
0o14370 SAA 39 -> XRPLY XRSNR This server is not running
0o14372 SAA 27 -> XRPLY XRNLS No local system number defined
0o14374 SAA 16 -> XRPLY XRILN Illegal/Reserved LUN for link
0o14376 SAA 17 -> XRPLY XRNXL No more Link Descriptors (XL-blocks)
0o14400 SAA 36 -> XRPLY XRRFU Routing table full
0o14402 SAA 10 -> XRPLY XRPRV Caller not privileged
0o14404 SAA 31 -> QCRAS XRNSE Not a service port
0o14406 SAA 33 -> QCRAS XRUKS Unknown remote system name or number
[V] There is no SAA 2 anywhere on the RSNET path. XSNET cannot return
XRUNN. The two SAT 2 instructions in RSNET (0o14171, 0o14752) are index/arg
loads (T:=2), not status codes. RCHEK (0o20036) and CHMAG (0o20204) were also
fully disassembled - neither emits SAA 2 (RCHEK exits via the dispatcher
fall-through FDPLX; CHMAG is a compare loop ending in EXIT).
Note the co-requisite already visible here: XSNET itself returns XRNLS=27 (0o14372) if no local system number is defined, and XRSNR=39 (0o14370) if the server/magic check fails.
4. Where XRUNN=2 actually comes from (Task 3) - VERIFIED¶
4a. getMagic (RSGMG, XSGMG=71) - the smoking gun¶
RSGMG @0o6200, byte-verified:
0o6200 RSGMG JPL [RCPRV 0o20074] ; check privileged
0o6201 JPL [CHNAM 0o20161] ; look up the NAME in the XROUT name table
0o6202 STX -95,B ; X = name-entry ptr (0 if not found)
0o6203 JXZ =>0o6220 ; name NOT FOUND -> error path
0o6204 JPL [RCHEK 0o20036]
0o6205 JMP =>0o6220
0o6206 JPL [QBINC 0o17451] ; found: build reply carrying the magic number
...
0o6217 JPL [XLPLY 0o2454] ; success (letter reply)
0o6220 SAA 2 ; <== XRUNN = 2 (Unknown name)
0o6221 JPL [XRPLY 0o2452] ; error reply
getMagic(name) = XSGMG=71 "Get magic number from name". If name is not in
the CHNAM name table, X==0 -> SAA 2 -> XRUNN=2. This IS the "Unknown name"
condition, and it is exactly the getMagic handshake flagged in the older
2026-07-07 ENNS0-XROUT-GETMAGIC finding.
4b. get-info-about-name (RSGIN, XSGIN=82) - same shape¶
RSGIN @0o6231:
0o6231 RSGIN JPL [CHNAM 0o20161] ; look up name
0o6233 JXZ =>0o6257 ; not found ->
...
0o6257 SAA 2 ; XRUNN=2
0o6260 JPL [XRPLY 0o2452]
4c. The lookup routine CHNAM (0o20161)¶
CHNAM is the single kernel primitive that searches the XROUT name table
and returns X = entry pointer or X=0 on miss. Cells that call it:
0o5737 (RSNAM area), 0o6223 (RSGMG), 0o6261 (RSGIN), 0o112575 (kernel).
Every XRUNN=2 in XROUT is a CHNAM miss immediately followed by SAA 2; JPL XRPLY.
5. What populates the name table (Task 3 cont.) - VERIFIED¶
Names enter the CHNAM table only through the kernel inserter YNNAM
@0o17710. Callers (all byte-verified to JPL [YNNAM]):
| service | code | handler | inserts name? | local-sys gate |
|---|---|---|---|---|
| XSNAM "give name to this port" | 66 | RSNAM @0o5433 | YES (0o5445) | XRNLS=27 @0o5452 |
| XSCRS "create service" | 80 | RSCRS @0o5463 | YES (0o5507) | XRNLS=27 @0o5534 |
| XSDRN "define remote name" | 73 | RSDRN @0o5620 | YES (0o5673) | XRNLS=27 @0o5706 |
[V] So before any name can be created, a local system number must be defined
(XSDLO=83 = DEFINE-LOCAL-SYSTEM); otherwise the create returns XRNLS=27.
[V] DEFINE-REMOTE-NAME really does insert (RSDRN calls YNNAM). The live
test DEF-REMOTE,,D100 100 therefore added the literal name D100 to the
table - not *XM-ENNS0. That is precisely why it did not fix the failure:
getMagic(*XM-ENNS0) still misses. (RSDRN also has its own SAA 2 @0o5716 via a
second CHNAM at 0o5712, and requires privilege (XRPRV=10) + a valid system
number (XRISY=11) + local system (XRNLS=27).)
6. Reconciliation with ENNS0's "Error in communicating with XROUT" (Task 4)¶
[V] The prior static ENNS0 disassembly proved ENNS0's ENTIRE XMSG footprint is
XFDUM (liveness "is XMSG up?") + XFDCT (disconnect) - no XSNAM/XSCRS.
So ENNS0 never registers *XM-ENNS0, by design.
[I] ENNS0's own "Error in communicating with XROUT" during startup and the
operator's later "Unknown name" are the same root fact seen from two sides:
XROUT is not carrying a *XM-ENNS0 name entry (and, upstream, likely no local
system number). ENNS0's startup handshake to XROUT (a getMagic/liveness step)
and the command's getMagic(*XM-ENNS0) both resolve a name through CHNAM and
both fail because the COSMOS network configuration that creates the local system
number + the *XM-ENNS0 service was never run. There is no two-way handshake
defect in the emulator here - the guest XROUT is answering correctly.
[OPEN] The exact XMSG-COMMAND MON 200B that surfaces the 2 (the initial
getMagic/get-info query the handler issues before/around the XSNET start) is
in the command program, not XROUT; decoding it requires the XMSG-COMMAND
Define-Network-* / query handlers (out of scope of the XROUT carve). The XROUT
side is now fully pinned: any CHNAM-resolving service on *XM-ENNS0 returns 2.
7. Conclusion - the precise missing precondition (Task 5)¶
[V] XRUNN=2 = a CHNAM name-table miss on the literal name *XM-ENNS0.
It is emitted by name-resolving services (getMagic XSGMG=71, get-info XSGIN=82,
et al.), NOT by the XSNET start (which has no SAA 2 and would instead fail with
XRNLS=27 / XRSNR=39 if reached).
[V] To make *XM-ENNS0 resolvable, an entry for that exact string must be
inserted into the XROUT name table via YNNAM - i.e. a call to XSCRS
(create service) or XSNAM (give name to port) for *XM-ENNS0 - and that in
turn requires a local system number defined first (XSDLO=83 /
DEFINE-LOCAL-SYSTEM), else the create returns XRNLS=27.
[I] Concrete gap: neither ENNS0 nor the START-NETWORK-SERVER (XSNET)
handler creates *XM-ENNS0. On a real COSMOS system the local-system definition
and the *XM-<server> service creation are done by the site network-generation /
XMSG-STARTUP configuration BEFORE START-NETWORK-SERVER. The harness ran only
start-x + @RT ENNS0 + START-NETWORK-SERVER, so the name was never created.
[V] Not an emulator/SINTRAN defect. The guest XROUT behaves correctly:
resolve an unregistered name -> XRUNN=2. The corrective action is a
configuration/procedure step:
1. Ensure a local system number is defined (DEFINE-LOCAL-SYSTEM / generation).
2. Ensure the network server name *XM-ENNS0 is created (XSCRS/XSNAM),
by running the site COSMOS network-generation / XMSG-STARTUP config that the
ND-210580 warm-start procedure assumes has already run.
NB: DEFINE-REMOTE-NAME with the wrong argument (D100) does not satisfy this;
only an entry for the literal *XM-ENNS0 (or the proper Define-Network-*/
XSCRS step for it) does.
8. Evidence index (combined XROUT+KERNEL image; L03 addresses, octal)¶
| item | addr / value |
|---|---|
| XROUT load base / span | 0o0 / 0o0-0o116006 (checksum OK) |
| KERNEL load base / span | 0o120000 / 0o120000-0o175776 (checksum OK) |
| dispatch table index | RSTAB[0o2223 + service_code] (runs at 0o2323, 0o2334) |
| RSNET (XSNET=85) | 0o13753 - error set {6,16,17,18,27,31,33,36,39}, NO SAA 2 |
| RSNET error jump table | 0o14364-0o14407 |
| RSNET calls | CHMAG 0o20204, RCHEK 0o20036, QNFND 0o15141, QNSIN 0o14430 |
| RSGMG (getMagic XSGMG=71) | 0o6200; JPL CHNAM;JXZ;...SAA 2@0o6220->XRPLY |
| RSGIN (get-info XSGIN=82) | 0o6231; SAA 2@0o6257->XRPLY |
| CHNAM (name-table lookup) | 0o20161 (X=entry or 0) |
| YNNAM (name-table insert) | 0o17710 |
| RSNAM/RSCRS/RSDRN (insert via YNNAM) | 0o5433 / 0o5463 / 0o5620 |
| local-system gate XRNLS=27 | RSNAM 0o5452, RSCRS 0o5534, RSDRN 0o5706, RSNET 0o14372 |
| XRPLY / XLPLY (reply routines) | 0o2452 / 0o2454 |
| XRUNN | 2 |
9. Tools added / used¶
tools/bpun_load.py- ND-100 BPUN absolute-load loader (format ND-06.014.2A 4.2.5.1); returns flatmem[]+ load base + start addr; validates checksums.load_bpun(path, verbose=True).tools/disbpun.py- loads one or more BPUNs +*.SYMBsymbol table (high-bit NAME=octal) and disassembles a range viand100dis, annotating indirect-call targets with symbol names. Both binaries left UNMODIFIED (read-only).
Findings file: E:\Dev\Ronny\NDInsight\SINTRAN\XMSG\DOC\COSMOS-RE\ENNS0-Startup-RE-2026-07-23\XROUT-XSNET-XRUNN-CONDITION-DECODE-2026-07-23.md