code wiki / _hdl_build / nx_oo_extract_gate.nx

nx_oo_extract_gate.nx source

↩ module page · 142 lines · 7610 B

1// nx_oo_extract_gate.nx -- GATE for the byte-proven OO extractor (5 teeth, REAL builds via nx_buildonly). 2// PREREQ: stage _offc/nx_oo_extract.elf + _offc/nx_buildonly.elf. Run from nxc2 root. One extractor fork 3// per tooth (self-exec chain). Fixtures written into runtime/_hdl_build/ (so bare-name build resolves 4// them), cleaned up each tooth. 5// T1 identical oohelp across 2 consumers -> EXTRACTED, base created, consumers import it + no longer 6// define it, each rebuilt BYTE-IDENTICAL | T2 NEG different bodies -> REFUSED + consumers UNCHANGED | 7// T3 the REFUSED carries reason= AND fix= (feedback law) | T4 NEG function-not-defined -> ABORTED | 8// T5 EXTRACTED carries reason= AND fix=. 9// license_tier: ORIGINAL No hw writes (Rule 26). 10import "nx_seat_drive_lib.nx" 11import "nx_seg_store.nx" 12import "nx_deploy_lib.nx" 13import "nx_syscalls.nx" 14 15func og_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 } 16func og_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 } 17func og_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 18func og_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 } 19func og_has(p: *u8, lit: *u8) -> i64 { let b: *u8 = sys_mmap(65536); let n: i64 = og_read(p, b, 65536); if n <= 0 { return 0 } return sd_count(b, n, lit) } 20 21func og_clean() -> i64 { 22 sys_unlinkat("runtime/_hdl_build/ooc1.nx" as *u8) 23 sys_unlinkat("runtime/_hdl_build/ooc2.nx" as *u8) 24 sys_unlinkat("runtime/_hdl_build/oobase.nx" as *u8) 25 sys_unlinkat("runtime/_hdl_build/ooc1.nx.oobak" as *u8) 26 sys_unlinkat("runtime/_hdl_build/ooc2.nx.oobak" as *u8) 27 return 0 28} 29// run: nx_oo_extract oohelp runtime/_hdl_build/oobase.nx _offc/nx_buildonly.elf <c1> [c2] 30func og_run(c2: i64, outp: *u8) -> i64 { 31 let av: *i64 = sys_mmap(64) as *i64 32 av[0] = "oohelp" as *u8 as i64 33 av[1] = "runtime/_hdl_build/oobase.nx" as *u8 as i64 34 av[2] = "_offc/nx_buildonly.elf" as *u8 as i64 35 av[3] = "runtime/_hdl_build/ooc1.nx" as *u8 as i64 36 var nn: i64 = 4 37 if c2 == 1 { av[4] = "runtime/_hdl_build/ooc2.nx" as *u8 as i64; nn = 5 } 38 return dep_run_capture("_offc/nx_oo_extract.elf" as *u8, av, nn, outp) 39} 40 41func main(argc: i64, argv: *i64) -> i64 { 42 var stage: i64 = 1 43 var pass: i64 = 0 44 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = og_atoi(ss1) } 45 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = og_atoi(ps) } 46 if stage < 1 { stage = 1 } 47 48 if stage == 1 { 49 og_clean() 50 let c1: *u8 = "func oohelp(x: i64) -> i64 { return x + 1 }\nfunc main() -> i64 { return oohelp(41) }\n" as *u8 51 ss_writefile("runtime/_hdl_build/ooc1.nx" as *u8, c1, og_len(c1)) 52 let c2: *u8 = "func oohelp(x: i64) -> i64 { return x + 1 }\nfunc main() -> i64 { return oohelp(7) }\n" as *u8 53 ss_writefile("runtime/_hdl_build/ooc2.nx" as *u8, c2, og_len(c2)) 54 let rc: i64 = og_run(1, "/tmp/oo_t1.out" as *u8) 55 let out: *u8 = sys_mmap(16384) 56 let n: i64 = dp_read("/tmp/oo_t1.out" as *u8, out, 16384) 57 var ok: i64 = 0 58 if rc == 0 { if sd_count(out, n, "verdict=EXTRACTED" as *u8) == 1 { 59 if og_has("runtime/_hdl_build/oobase.nx" as *u8, "func oohelp" as *u8) >= 1 { 60 if og_has("runtime/_hdl_build/ooc1.nx" as *u8, "import \"oobase.nx\"" as *u8) >= 1 { 61 if og_has("runtime/_hdl_build/ooc1.nx" as *u8, "func oohelp" as *u8) == 0 { ok = 1 } 62 } 63 } 64 } } 65 og_clean() 66 if ok == 1 { sd_w("T1 extracted-byte-identical PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 extracted-byte-identical FAIL\n" as *u8) } 67 } 68 if stage == 2 { 69 og_clean() 70 let c1: *u8 = "func oohelp(x: i64) -> i64 { return x + 1 }\nfunc main() -> i64 { return oohelp(41) }\n" as *u8 71 ss_writefile("runtime/_hdl_build/ooc1.nx" as *u8, c1, og_len(c1)) 72 let c2: *u8 = "func oohelp(x: i64) -> i64 { return x + 2 }\nfunc main() -> i64 { return oohelp(7) }\n" as *u8 73 ss_writefile("runtime/_hdl_build/ooc2.nx" as *u8, c2, og_len(c2)) 74 let rc: i64 = og_run(1, "/tmp/oo_t2.out" as *u8) 75 let out: *u8 = sys_mmap(16384) 76 let n: i64 = dp_read("/tmp/oo_t2.out" as *u8, out, 16384) 77 var ok: i64 = 0 78 // REFUSED + consumers UNCHANGED (ooc1 still defines oohelp, no import) 79 if rc == 1 { if sd_count(out, n, "verdict=REFUSED" as *u8) == 1 { 80 if og_has("runtime/_hdl_build/ooc1.nx" as *u8, "func oohelp" as *u8) >= 1 { 81 if og_has("runtime/_hdl_build/ooc1.nx" as *u8, "import \"oobase.nx\"" as *u8) == 0 { ok = 1 } 82 } 83 } } 84 og_clean() 85 if ok == 1 { sd_w("T2 neg-different-bodies-refused-unchanged PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 neg-different-bodies-refused-unchanged FAIL\n" as *u8) } 86 } 87 if stage == 3 { 88 let out: *u8 = sys_mmap(16384) 89 let n: i64 = dp_read("/tmp/oo_t2.out" as *u8, out, 16384) 90 var ok: i64 = 0 91 if sd_count(out, n, "reason=" as *u8) >= 1 { if sd_count(out, n, "fix=" as *u8) >= 1 { ok = 1 } } 92 if ok == 1 { sd_w("T3 refusal-has-reason-and-fix PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 refusal-has-reason-and-fix FAIL\n" as *u8) } 93 } 94 if stage == 4 { 95 og_clean() 96 let c1: *u8 = "func notit() -> i64 { return 1 }\nfunc main() -> i64 { return notit() }\n" as *u8 97 ss_writefile("runtime/_hdl_build/ooc1.nx" as *u8, c1, og_len(c1)) 98 let rc: i64 = og_run(0, "/tmp/oo_t4.out" as *u8) 99 let out: *u8 = sys_mmap(16384) 100 let n: i64 = dp_read("/tmp/oo_t4.out" as *u8, out, 16384) 101 var ok: i64 = 0 102 if rc == 2 { if sd_count(out, n, "verdict=ABORTED" as *u8) == 1 { if sd_count(out, n, "not-defined" as *u8) >= 1 { ok = 1 } } } 103 og_clean() 104 if ok == 1 { sd_w("T4 neg-not-defined-aborted PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 neg-not-defined-aborted FAIL\n" as *u8) } 105 } 106 if stage == 5 { 107 let out: *u8 = sys_mmap(16384) 108 let n: i64 = dp_read("/tmp/oo_t1.out" as *u8, out, 16384) 109 var ok: i64 = 0 110 if sd_count(out, n, "reason=" as *u8) >= 1 { if sd_count(out, n, "fix=" as *u8) >= 1 { ok = 1 } } 111 if ok == 1 { sd_w("T5 extracted-has-reason-and-fix PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 extracted-has-reason-and-fix FAIL\n" as *u8) } 112 } 113 114 if stage >= 5 { 115 sd_w("NX-OO-EXTRACT-GATE pass=" as *u8) 116 let pb: *u8 = sys_mmap(8) 117 pb[0] = (48 + pass) as u8 118 pb[1] = 0 as u8 119 sd_w(pb) 120 if pass == 5 { sd_w("/5 verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 121 sd_w("/5 verdict=RED\n" as *u8) 122 sys_exit(1) 123 return 1 124 } 125 126 let self: *u8 = argv[0] as *u8 127 let sb: *u8 = sys_mmap(24) 128 og_itoa(sb, stage + 1) 129 let pb2: *u8 = sys_mmap(24) 130 og_itoa(pb2, pass) 131 let nav: *i64 = sys_mmap(40) as *i64 132 nav[0] = self as i64 133 nav[1] = sb as i64 134 nav[2] = pb2 as i64 135 nav[3] = 0 136 let envp: *i64 = sys_mmap(16) as *i64 137 envp[0] = 0 138 sys_execve(self, nav, envp) 139 sd_w("OOG-EXEC-FAIL\n" as *u8) 140 sys_exit(1) 141 return 1 142}