code wiki / _hdl_build / nx_funcmine_gate.nx
nx_funcmine_gate.nx source
↩ module page · 116 lines · 5725 B
1// nx_funcmine_gate.nx -- GATE for the function-body dedup miner (5 teeth incl neg-control +
2// determinism + MUTATION). PREREQ: stage _offc/nx_funcmine.elf. Run from nxc2 root. One miner
3// fork per tooth (self-exec chain). Fixture dir /tmp/fmdir with 3 files:
4// fa.nx: func shared_helper (BODY B) + func only_a
5// fb.nx: func shared_helper (BODY B, byte-identical) + func only_b
6// fc.nx: func only_c
7// T1 the identical shared_helper across fa+fb reported DUPFUNC copies=2 | T2 NEG the unique funcs
8// (only_a/b/c) NOT in any dup group | T3 summary dupgroups=1 | T4 determinism | T5 MUTATION: change
9// one byte of fb's shared_helper body -> no longer a dup -> dupgroups=0.
10// license_tier: ORIGINAL No hw writes (Rule 26).
11import "nx_seat_drive_lib.nx"
12import "nx_seg_store.nx"
13import "nx_deploy_lib.nx"
14import "nx_syscalls.nx"
15
16func fg_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 }
17func fg_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 }
18func fg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
19
20func fg_run(dir: *u8, outp: *u8) -> i64 {
21 let av: *i64 = sys_mmap(16) as *i64
22 av[0] = dir as i64
23 return dep_run_capture("_offc/nx_funcmine.elf" as *u8, av, 1, outp)
24}
25
26func fg_seed(mutate: i64) -> i64 {
27 sys_mkdir("/tmp/fmdir" as *u8, 0x1ed)
28 let fa: *u8 = "func shared_helper(x: i64) -> i64 { return x + 1 }\nfunc only_a() -> i64 { return 7 }\n" as *u8
29 ss_writefile("/tmp/fmdir/fa.nx" as *u8, fa, fg_len(fa))
30 var fb: *u8 = "func shared_helper(x: i64) -> i64 { return x + 1 }\nfunc only_b() -> i64 { return 8 }\n" as *u8
31 if mutate == 1 { fb = "func shared_helper(x: i64) -> i64 { return x + 2 }\nfunc only_b() -> i64 { return 8 }\n" as *u8 }
32 ss_writefile("/tmp/fmdir/fb.nx" as *u8, fb, fg_len(fb))
33 let fc: *u8 = "func only_c() -> i64 { return 9 }\n" as *u8
34 ss_writefile("/tmp/fmdir/fc.nx" as *u8, fc, fg_len(fc))
35 return 0
36}
37
38func main(argc: i64, argv: *i64) -> i64 {
39 var stage: i64 = 1
40 var pass: i64 = 0
41 if argc >= 2 { let ss1: *u8 = argv[1] as *u8; stage = fg_atoi(ss1) }
42 if argc >= 3 { let ps: *u8 = argv[2] as *u8; pass = fg_atoi(ps) }
43 if stage < 1 { stage = 1 }
44
45 if stage == 1 {
46 fg_seed(0)
47 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t1.out" as *u8)
48 let out: *u8 = sys_mmap(65536)
49 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536)
50 var ok: i64 = 0
51 if rc == 0 { if sd_count(out, n, "DUPFUNC copies=2 " as *u8) == 1 { if sd_count(out, n, "shared_helper" as *u8) >= 1 { ok = 1 } } }
52 if ok == 1 { sd_w("T1 identical-body-across-files PASS\n" as *u8); pass = pass + 1 } else { sd_w("T1 identical-body-across-files FAIL\n" as *u8) }
53 }
54 if stage == 2 {
55 let out: *u8 = sys_mmap(65536)
56 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536)
57 var ok: i64 = 0
58 if sd_count(out, n, "only_a" as *u8) == 0 { if sd_count(out, n, "only_c" as *u8) == 0 { ok = 1 } }
59 if ok == 1 { sd_w("T2 neg-unique-not-reported PASS\n" as *u8); pass = pass + 1 } else { sd_w("T2 neg-unique-not-reported FAIL\n" as *u8) }
60 }
61 if stage == 3 {
62 let out: *u8 = sys_mmap(65536)
63 let n: i64 = dp_read("/tmp/fm_t1.out" as *u8, out, 65536)
64 var ok: i64 = 0
65 if sd_count(out, n, "dupgroups=1 dupfuncs=2" as *u8) == 1 { ok = 1 }
66 if ok == 1 { sd_w("T3 summary-exact PASS\n" as *u8); pass = pass + 1 } else { sd_w("T3 summary-exact FAIL\n" as *u8) }
67 }
68 if stage == 4 {
69 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t4.out" as *u8)
70 let a: *u8 = sys_mmap(65536)
71 let an: i64 = dp_read("/tmp/fm_t1.out" as *u8, a, 65536)
72 let b: *u8 = sys_mmap(65536)
73 let bn: i64 = dp_read("/tmp/fm_t4.out" as *u8, b, 65536)
74 var same: i64 = 0
75 if rc == 0 { if an == bn { if an > 0 { same = 1; var i: i64 = 0; while i < an { if a[i] != b[i] { same = 0; i = an } else { i = i + 1 } } } } }
76 if same == 1 { sd_w("T4 deterministic PASS\n" as *u8); pass = pass + 1 } else { sd_w("T4 deterministic FAIL\n" as *u8) }
77 }
78 if stage == 5 {
79 fg_seed(1)
80 let rc: i64 = fg_run("/tmp/fmdir" as *u8, "/tmp/fm_t5.out" as *u8)
81 let out: *u8 = sys_mmap(65536)
82 let n: i64 = dp_read("/tmp/fm_t5.out" as *u8, out, 65536)
83 var ok: i64 = 0
84 if rc == 0 { if sd_count(out, n, "dupgroups=0 " as *u8) == 1 { ok = 1 } }
85 if ok == 1 { sd_w("T5 mutation-breaks-dup PASS\n" as *u8); pass = pass + 1 } else { sd_w("T5 mutation-breaks-dup FAIL\n" as *u8) }
86 }
87
88 if stage >= 5 {
89 sd_w("NX-FUNCMINE-GATE pass=" as *u8)
90 let pb: *u8 = sys_mmap(8)
91 pb[0] = (48 + pass) as u8
92 pb[1] = 0 as u8
93 sd_w(pb)
94 if pass == 5 { sd_w("/5 verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
95 sd_w("/5 verdict=RED\n" as *u8)
96 sys_exit(1)
97 return 1
98 }
99
100 let self: *u8 = argv[0] as *u8
101 let sb: *u8 = sys_mmap(24)
102 fg_itoa(sb, stage + 1)
103 let pb2: *u8 = sys_mmap(24)
104 fg_itoa(pb2, pass)
105 let nav: *i64 = sys_mmap(40) as *i64
106 nav[0] = self as i64
107 nav[1] = sb as i64
108 nav[2] = pb2 as i64
109 nav[3] = 0
110 let envp: *i64 = sys_mmap(16) as *i64
111 envp[0] = 0
112 sys_execve(self, nav, envp)
113 sd_w("FMG-EXEC-FAIL\n" as *u8)
114 sys_exit(1)
115 return 1
116}