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}