code wiki / _hdl_build / nx_asm_canary.nx
nx_asm_canary.nx source
↩ module page · 56 lines · 3255 B
1// nx_asm_canary.nx -- the ASSEMBLER CANARY law as an executable organ (2026-06-10): no nxasm build
2// is trusted until it assembles the canary (_mb_gate.s) and the result RUNS and exits 42. This module:
3// 1. runner-builds nxasm_x86_main (retry-guarded -> /tmp/nxasm_x86_main.sov.elf)
4// 2. new build assembles _mb_gate.s -> /tmp/canary.elf
5// 3. runs canary.elf -> exit MUST be 42 (signal-aware)
6// 4. emits CANARY PASS/REJECT line to /tmp/nishi_ladder.log ; exit 0=blessed, 1=rejected
7// Closes the failure class where a parse-broken 1-shot build (reg->r15, imm->0xAB) masqueraded as a
8// source bug and burned a session (and likely created the May30 "landmine" verdict). license_tier: ORIGINAL
9import "nx_syscalls.nx"
10
11func ac_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
12
13func ac_run(path: *u8, a1: *u8, a2: *u8) -> i64 {
14 let envp: *i64 = sys_mmap(32) as *i64
15 envp[0] = "PATH=/usr/bin:/bin" as *u8 as i64; envp[1] = 0
16 let av: *i64 = sys_mmap(40) as *i64
17 av[0] = path as i64; av[1] = a1 as i64; av[2] = a2 as i64; av[3] = 0
18 let pid: i64 = sys_fork()
19 if pid == 0 { sys_execve(path, av, envp); sys_exit(127) }
20 let st: *i64 = sys_mmap(16) as *i64
21 sys_wait4(pid, st, 0)
22 let sig: i64 = st[0] & 0x7f
23 if sig != 0 { return 128 + sig }
24 return (st[0] >> 8) & 0xff
25}
26
27func main() -> i64 {
28 ac_w(1, "[asm-canary] runner-building nxasm...\n" as *u8)
29 ac_run("/tmp/nx_sov_build_run.elf" as *u8, "nxasm_x86_main" as *u8, 0 as *u8)
30 ac_w(1, "[asm-canary] assembling canary...\n" as *u8)
31 let rca: i64 = ac_run("/tmp/nxasm_x86_main.sov.elf" as *u8, "_mb_gate.s" as *u8, "/tmp/canary.elf" as *u8)
32 // PER-STEP LOUDNESS (2026-06-10, the feat-gate lesson): a verdict organ MUST name which
33 // step failed -- assemble-fail vs wrong-exit are different bugs (tool vs encoding).
34 ac_w(1, "[asm-canary] assemble rc=" as *u8)
35 let b1: *u8 = sys_mmap(8); b1[0] = (48 + (rca - (rca/10)*10)) as u8
36 if rca >= 100 { ac_w(1, "1xx" as *u8) }
37 if rca < 100 { if rca >= 10 { let bt: *u8 = sys_mmap(8); bt[0] = (48 + rca/10) as u8; sys_write(1, bt, 1) } sys_write(1, b1, 1) }
38 ac_w(1, "\n" as *u8)
39 var rc: i64 = 0 - 1
40 if rca == 0 { rc = ac_run("/tmp/canary.elf" as *u8, 0 as *u8, 0 as *u8) }
41 ac_w(1, "[asm-canary] canary-run rc=" as *u8)
42 var rv: i64 = rc; if rv < 0 { rv = 0 - rv; ac_w(1, "-" as *u8) }
43 let b2: *u8 = sys_mmap(8)
44 if rv >= 100 { ac_w(1, "1xx" as *u8) }
45 if rv < 100 { if rv >= 10 { let bu: *u8 = sys_mmap(8); bu[0] = (48 + rv/10) as u8; sys_write(1, bu, 1) } b2[0] = (48 + (rv - (rv/10)*10)) as u8; sys_write(1, b2, 1) }
46 ac_w(1, " (42=PASS)\n" as *u8)
47 let lfd: i64 = sys_openat_append("/tmp/nishi_ladder.log" as *u8, 0x1a4)
48 if rc == 42 {
49 ac_w(lfd, "CANARY asm=nxasm_x86_main verdict=PASS gate=exit42 date=2026-06-10\n" as *u8)
50 ac_w(1, "[asm-canary] PASS exit42 -- build BLESSED (and movb imm->reg works)\n" as *u8)
51 sys_close(lfd); sys_exit(0); return 0
52 }
53 ac_w(lfd, "CANARY asm=nxasm_x86_main verdict=REJECT gate=exit42 date=2026-06-10\n" as *u8)
54 ac_w(1, "[asm-canary] REJECT -- do NOT use this build\n" as *u8)
55 sys_close(lfd); sys_exit(1); return 1
56}