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}