code wiki / _hdl_build / nx_consol_apply_mc_gate.nx
nx_consol_apply_mc_gate.nx source
↩ module page · 139 lines · 7310 B
1// nx_consol_apply_mc_gate.nx -- GATE for the multi-consumer applier (5 teeth: consolidate, never-brick
2// refuse, restore-verify, determinism, shadow-absent). PREREQ: stage _offc/nx_consol_apply_mc.elf +
3// _offc/nx_mc_fix.elf. Run from nxc2 root. The mock nx_mc_fix makes each importer's artifact depend on
4// the shared lib /tmp/mc_shared. importers-file = /tmp/mc_imps (imp1,imp2).
5// T1 retire UNRELATED file -> all importers identical -> CONSOLIDATED | T2 retire the SHARED lib ->
6// importers change -> REFUSED | T3 after T2 the shared lib is RESTORED byte-exact | T4 determinism |
7// T5 absent shadow -> exit 2.
8// license_tier: ORIGINAL No hw writes (Rule 26).
9import "nx_seat_drive_lib.nx"
10import "nx_seg_store.nx"
11import "nx_deploy_lib.nx"
12import "nx_syscalls.nx"
13
14func mg_atoi(s: *u8) -> i64 { var v: i64 = 0; var i: i64 = 0; while s[i] != (0 as u8) { let c: i64 = s[i] as i64; if c >= 48 { if c <= 57 { v = v * 10 + (c - 48) } } i = i + 1 } return v }
15func mg_itoa(dst: *u8, v: i64) -> i64 { var m: i64 = v; let t: *u8 = sys_mmap(24); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 } while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } var i: i64 = 0; while i < k { dst[i] = t[k - 1 - i]; i = i + 1 } dst[k] = 0 as u8; return k }
16func mg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
17func mg_exists(p: *u8) -> i64 { let fd: i64 = sys_openat_rd(p); if fd >= 0 { sys_close(fd); return 1 } return 0 }
18func mg_read(p: *u8, b: *u8, cap: i64) -> i64 { let fd: i64 = sys_openat_rd(p); if fd < 0 { return 0 - 1 } let n: i64 = sys_read(fd, b, cap - 1); sys_close(fd); return n }
19
20func mg_run(shadow: *u8, retire: *u8, outp: *u8) -> i64 {
21 let av: *i64 = sys_mmap(32) as *i64
22 av[0] = shadow as i64
23 av[1] = retire as i64
24 av[2] = "_offc/nx_mc_fix.elf" as *u8 as i64
25 av[3] = "/tmp/mc_imps" as *u8 as i64
26 return dep_run_capture("_offc/nx_consol_apply_mc.elf" as *u8, av, 4, outp)
27}
28
29func mg_seed() -> i64 {
30 let lib: *u8 = "LIB-VERSION-ONE" as *u8
31 ss_writefile("/tmp/mc_shared" as *u8, lib, mg_len(lib))
32 let unr: *u8 = "unrelated" as *u8
33 ss_writefile("/tmp/mc_unrelated" as *u8, unr, mg_len(unr))
34 let imps: *u8 = "mcimp1\nmcimp2\n" as *u8
35 ss_writefile("/tmp/mc_imps" as *u8, imps, mg_len(imps))
36 return 0
37}
38
39func main(argc: i64, argv: *i64) -> i64 {
40 var stage: i64 = 1
41 var pass: i64 = 0
42 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = mg_atoi(ss1) }
43 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = mg_atoi(ps) }
44 if stage < 1 { stage = 1 }
45
46 if stage == 1 {
47 mg_seed()
48 sys_unlinkat("/tmp/mc_unrelated.ret" as *u8)
49 let rc: i64 = mg_run("/tmp/mc_unrelated" as *u8, "/tmp/mc_unrelated.ret" as *u8, "/tmp/mc_t1.out" as *u8)
50 let out: *u8 = sys_mmap(16384)
51 let n: i64 = dp_read("/tmp/mc_t1.out" as *u8, out, 16384)
52 var ok: i64 = 0
53 if rc == 0 { if sd_count(out, n, "verdict=CONSOLIDATED" as *u8) == 1 { ok = 1 } }
54 if ok == 1 { sd_w("T1 unrelated-retire-consolidated PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 unrelated-retire-consolidated FAIL\n" as *u8) }
55 }
56 if stage == 2 {
57 mg_seed()
58 sys_unlinkat("/tmp/mc_shared.ret" as *u8)
59 let rc: i64 = mg_run("/tmp/mc_shared" as *u8, "/tmp/mc_shared.ret" as *u8, "/tmp/mc_t2.out" as *u8)
60 let out: *u8 = sys_mmap(16384)
61 let n: i64 = dp_read("/tmp/mc_t2.out" as *u8, out, 16384)
62 var ok: i64 = 0
63 // the refusal must carry CLEAR FEEDBACK: a reason= AND a fix= (operator law: no refusal without
64 // actionable feedback for AI + human). This tooth mechanizes that requirement.
65 if rc == 1 { if sd_count(out, n, "verdict=REFUSED " as *u8) == 1 { if sd_count(out, n, "reason=" as *u8) >= 1 { if sd_count(out, n, "fix=" as *u8) >= 1 { ok = 1 } } } }
66 if ok == 1 { sd_w("T2 refused-WITH-reason-and-fix PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 refused-WITH-reason-and-fix FAIL\n" as *u8) }
67 }
68 if stage == 3 {
69 var ok: i64 = 0
70 if mg_exists("/tmp/mc_shared" as *u8) == 1 {
71 let b: *u8 = sys_mmap(256)
72 let m: i64 = mg_read("/tmp/mc_shared" as *u8, b, 256)
73 if m == 15 { ok = 1 }
74 }
75 if ok == 1 { sd_w("T3 shared-lib-restored PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 shared-lib-restored FAIL\n" as *u8) }
76 }
77 if stage == 4 {
78 mg_seed()
79 sys_unlinkat("/tmp/mc_unrelated.ret" as *u8)
80 let rc: i64 = mg_run("/tmp/mc_unrelated" as *u8, "/tmp/mc_unrelated.ret" as *u8, "/tmp/mc_t4.out" as *u8)
81 let out: *u8 = sys_mmap(16384)
82 let n: i64 = dp_read("/tmp/mc_t4.out" as *u8, out, 16384)
83 var ok: i64 = 0
84 if rc == 0 { if sd_count(out, n, "verdict=CONSOLIDATED" as *u8) == 1 { ok = 1 } }
85 if ok == 1 { sd_w("T4 deterministic-consolidate PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 deterministic-consolidate FAIL\n" as *u8) }
86 }
87 if stage == 5 {
88 sys_unlinkat("/tmp/mc_absent" as *u8)
89 let rc: i64 = mg_run("/tmp/mc_absent" as *u8, "/tmp/mc_absent.ret" as *u8, "/tmp/mc_t5.out" as *u8)
90 if rc == 2 { sd_w("T5 shadow-absent-clean PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 shadow-absent-clean FAIL\n" as *u8) }
91 }
92 if stage == 6 {
93 // SOUND COVERAGE: an importer that never builds (mcbroken) must be VERIFIED still-unbuilt, not
94 // ignored. importers = [mcimp1 (builds), mcbroken (never)]. Retire the UNRELATED file -> mcimp1
95 // unchanged + mcbroken still-unbuilt -> CONSOLIDATED (all 2 covered, 1 built).
96 let lib: *u8 = "LIB-VERSION-ONE" as *u8
97 ss_writefile("/tmp/mc_shared" as *u8, lib, mg_len(lib))
98 let unr: *u8 = "unrelated" as *u8
99 ss_writefile("/tmp/mc_unrelated" as *u8, unr, mg_len(unr))
100 let imps2: *u8 = "mcimp1\nmcbroken1\n" as *u8
101 ss_writefile("/tmp/mc_imps" as *u8, imps2, mg_len(imps2))
102 sys_unlinkat("/tmp/mc_unrelated.ret" as *u8)
103 let rc: i64 = mg_run("/tmp/mc_unrelated" as *u8, "/tmp/mc_unrelated.ret" as *u8, "/tmp/mc_t6.out" as *u8)
104 let out: *u8 = sys_mmap(16384)
105 let n: i64 = dp_read("/tmp/mc_t6.out" as *u8, out, 16384)
106 var ok: i64 = 0
107 if rc == 0 { if sd_count(out, n, "all 2 importers unchanged, 1 built" as *u8) == 1 { ok = 1 } }
108 if ok == 1 { sd_w("T6 unbuilt-importer-covered PASS\n" as *u8); pass = pass + 1 } else { sd_w("T6 unbuilt-importer-covered FAIL\n" as *u8) }
109 }
110
111 if stage >= 6 {
112 sd_w("NX-CONSOL-APPLY-MC-GATE pass=" as *u8)
113 let pb: *u8 = sys_mmap(8)
114 pb[0] = (48 + pass) as u8
115 pb[1] = 0 as u8
116 sd_w(pb)
117 if pass == 6 { sd_w("/6 verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
118 sd_w("/6 verdict=RED\n" as *u8)
119 sys_exit(1)
120 return 1
121 }
122
123 let self: *u8 = argv[0] as *u8
124 let sb: *u8 = sys_mmap(24)
125 mg_itoa(sb, stage + 1)
126 let pb2: *u8 = sys_mmap(24)
127 mg_itoa(pb2, pass)
128 let nav: *i64 = sys_mmap(40) as *i64
129 nav[0] = self as i64
130 nav[1] = sb as i64
131 nav[2] = pb2 as i64
132 nav[3] = 0
133 let envp: *i64 = sys_mmap(16) as *i64
134 envp[0] = 0
135 sys_execve(self, nav, envp)
136 sd_w("MCG-EXEC-FAIL\n" as *u8)
137 sys_exit(1)
138 return 1
139}