code wiki / _hdl_build / nx_hwmap.nx
nx_hwmap.nx source
↩ module page · 196 lines · 8335 B
1// nx_hwmap.nx -- X-DRV-W0 HWMAP (SOVEREIGN-DRIVER-WORLD law, operator 2026-06-12).
2// The spore's FIRST act on any iron: enumerate the hardware BEFORE binding drivers.
3// The team's hardware-map capability -- "the spore knows what hardware exists".
4//
5// Reads /sys/bus/pci/devices via sys_getdents64 (the real kernel enumeration, NOT a
6// tutor-asserted list); for each device dir READS vendor/device/class straight from
7// sysfs; AUTHORS knowledge/registry/hwmap.tsv itself via sys_openat_wr; emits a
8// HWMAPGATE evidence line to stdout AND appends it to knowledge/status/hwmap.log
9// (the evidence nx_reconcile grades from -- the organ does NOT flip its own row).
10//
11// SELF-VALIDATING (no-cheat): GREEN requires devices>=1 (real iron found) AND
12// with_vendor==devices (every enumerated device had a 0x-prefixed vendor actually
13// read from sysfs -- a fabricated map can't satisfy this) AND control_neg<0 (a
14// deliberately bogus device path MUST fail to open -- proves it is hitting the real
15// filesystem, not synthesizing). A driver SPEC built atop this map is X-DRV-W1.
16// license_tier: ORIGINAL
17import "nx_syscalls.nx"
18const HW_MAGIC_4096: i64 = 4096
19const HW_MAGIC_1048640: i64 = 1048640
20const HW_MAGIC_2000000: i64 = 2000000
21const HW_MAGIC_1048576: i64 = 1048576
22
23const HW_DIR: *u8 = "/sys/bus/pci/devices"
24const HW_OUT: *u8 = "knowledge/registry/hwmap.tsv"
25const HW_LOG: *u8 = "knowledge/status/hwmap.log"
26
27func hw_msg(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
28
29// append NUL-terminated s into dst at off; return new offset (no NUL written).
30func hw_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64 = 0; while s[i] != (0 as u8) { dst[off+i] = s[i]; i = i + 1 } return off + i }
31
32// append decimal v into dst at off; return new offset.
33func hw_catn(dst: *u8, off: i64, v: i64) -> i64 {
34 var o: i64 = off
35 var m: i64 = v
36 if m < 0 { dst[o] = 45 as u8; o = o + 1; m = 0 - m }
37 let t: *u8 = sys_mmap(28)
38 var k: i64 = 0
39 if m == 0 { t[0] = 48; k = 1 }
40 while m > 0 { t[k] = 48 + (m % 10); m = m / 10; k = k + 1 }
41 var i: i64 = 0
42 while i < k { dst[o+i] = t[k-1-i]; i = i + 1 }
43 return o + k
44}
45
46// build "<dir>/<name><suffix>" (suffix carries its own leading '/') into out, NUL-terminated.
47func hw_path(out: *u8, dir: *u8, name: *u8, suffix: *u8) -> i64 {
48 var p: i64 = 0
49 var i: i64 = 0
50 while dir[i] != (0 as u8) { out[p] = dir[i]; p = p + 1; i = i + 1 }
51 out[p] = 47 as u8; p = p + 1
52 i = 0
53 while name[i] != (0 as u8) { out[p] = name[i]; p = p + 1; i = i + 1 }
54 i = 0
55 while suffix[i] != (0 as u8) { out[p] = suffix[i]; p = p + 1; i = i + 1 }
56 out[p] = 0 as u8
57 return p
58}
59
60// read a small sysfs file into buf, strip trailing whitespace, NUL-terminate; return length, or -1 if open fails.
61func hw_read_trim(path: *u8, buf: *u8, cap: i64) -> i64 {
62 let fd: i64 = sys_openat_rd(path)
63 if fd < 0 { return 0 - 1 }
64 var tot: i64 = 0
65 var r: i64 = 1
66 while r > 0 {
67 let dst: *u8 = ((buf as i64) + tot) as *u8
68 r = sys_read(fd, dst, cap - tot - 1)
69 if r > 0 { tot = tot + r }
70 }
71 sys_close(fd)
72 var go: i64 = 1
73 while go == 1 {
74 if tot <= 0 { go = 0 }
75 else {
76 let c: i64 = buf[tot-1] as i64
77 if c == 10 { tot = tot - 1 } else { if c == 13 { tot = tot - 1 } else { if c == 32 { tot = tot - 1 } else { go = 0 } } }
78 }
79 }
80 buf[tot] = 0 as u8
81 return tot
82}
83
84// emit one device row (bdf \t vendor \t device \t class) into ob; bump vcnt[0] iff a 0x-vendor was read.
85func hw_row(root: *u8, ob: *u8, o0: i64, name: *u8, pathbuf: *u8, valbuf: *u8, vcnt: *i64) -> i64 {
86 var o: i64 = o0
87 o = hw_cat(ob, o, name)
88 o = hw_cat(ob, o, "\t" as *u8)
89 hw_path(pathbuf, root, name, "/vendor" as *u8)
90 let vn: i64 = hw_read_trim(pathbuf, valbuf, 256)
91 if vn > 1 { if valbuf[0] == (48 as u8) { if valbuf[1] == (120 as u8) { vcnt[0] = vcnt[0] + 1 } } }
92 if vn > 0 { o = hw_cat(ob, o, valbuf) } else { o = hw_cat(ob, o, "?" as *u8) }
93 o = hw_cat(ob, o, "\t" as *u8)
94 hw_path(pathbuf, root, name, "/device" as *u8)
95 let dn: i64 = hw_read_trim(pathbuf, valbuf, 256)
96 if dn > 0 { o = hw_cat(ob, o, valbuf) } else { o = hw_cat(ob, o, "?" as *u8) }
97 o = hw_cat(ob, o, "\t" as *u8)
98 hw_path(pathbuf, root, name, "/class" as *u8)
99 let cn: i64 = hw_read_trim(pathbuf, valbuf, 256)
100 if cn > 0 { o = hw_cat(ob, o, valbuf) } else { o = hw_cat(ob, o, "?" as *u8) }
101 o = hw_cat(ob, o, "\n" as *u8)
102 return o
103}
104
105// build the HWMAPGATE evidence line, write to stdout AND append to the gate log at logpath.
106func hw_emit(logpath: *u8, root: *u8, out: *u8, devices: i64, with_vendor: i64, neg: i64, epoch: i64, ok: i64) -> i64 {
107 let gb: *u8 = sys_mmap(HW_MAGIC_4096)
108 var g: i64 = 0
109 g = hw_cat(gb, g, "HWMAPGATE authored=organ source=" as *u8)
110 g = hw_cat(gb, g, root)
111 g = hw_cat(gb, g, " devices=" as *u8)
112 g = hw_catn(gb, g, devices)
113 g = hw_cat(gb, g, " with_vendor=" as *u8)
114 g = hw_catn(gb, g, with_vendor)
115 g = hw_cat(gb, g, " control_neg=" as *u8)
116 g = hw_catn(gb, g, neg)
117 g = hw_cat(gb, g, " census=" as *u8)
118 g = hw_cat(gb, g, out)
119 g = hw_cat(gb, g, " epoch=" as *u8)
120 g = hw_catn(gb, g, epoch)
121 if ok == 1 { g = hw_cat(gb, g, " verdict=GREEN\n" as *u8) } else { g = hw_cat(gb, g, " verdict=RED\n" as *u8) }
122 sys_write(1, gb, g)
123 let lfd: i64 = sys_openat_append(logpath, 420)
124 if lfd >= 0 { sys_write(lfd, gb, g); sys_close(lfd) }
125 return 0
126}
127
128// argv: [1]=sysfs root (default /sys/bus/pci/devices), [2]=census out, [3]=gate log.
129// Overriding any arg routes to a TAMPER lane (default /tmp logs) so a bogus root proves
130// the gate goes RED without touching the real census/gate log -- sovereign self-tamper,
131// NO external oracle.
132func main(argc: i64, argv: *i64) -> i64 {
133 var root: *u8 = HW_DIR
134 var out: *u8 = HW_OUT
135 var logp: *u8 = HW_LOG
136 if argc >= 2 { root = argv[1] as *u8; out = "/tmp/_hwmap_tamper.tsv" as *u8; logp = "/tmp/_hwmap_tamper.log" as *u8 }
137 if argc >= 3 { out = argv[2] as *u8 }
138 if argc >= 4 { logp = argv[3] as *u8 }
139
140 let epoch0: i64 = sys_now_realtime_sec()
141 let dfd: i64 = sys_openat_rd(root)
142 if dfd < 0 { hw_emit(logp, root, out, 0, 0, 0 - 1, epoch0, 0); return 1 }
143 let dirbuf: *u8 = sys_mmap(HW_MAGIC_1048640)
144 let pathbuf: *u8 = sys_mmap(HW_MAGIC_4096)
145 let valbuf: *u8 = sys_mmap(256)
146 let ob: *u8 = sys_mmap(HW_MAGIC_2000000)
147 let negbuf: *u8 = sys_mmap(HW_MAGIC_4096)
148 let vc: *i64 = sys_mmap(16) as *i64
149 vc[0] = 0
150 var o: i64 = 0
151 o = hw_cat(ob, o, "# AUTHORED BY nx_hwmap (X-DRV-W0) -- enumerated from sysfs via getdents64; fields READ from the kernel, NOT tutor-asserted. The spore hardware map.\n" as *u8)
152 o = hw_cat(ob, o, "# columns: bdf\tvendor\tdevice\tclass\n" as *u8)
153 var devices: i64 = 0
154 var done: i64 = 0
155 while done == 0 {
156 let nb: i64 = sys_getdents64(dfd, dirbuf, HW_MAGIC_1048576)
157 if nb <= 0 { done = 1 }
158 else {
159 var off: i64 = 0
160 while off < nb {
161 let rec: *u8 = ((dirbuf as i64) + off) as *u8
162 let rl: i64 = dirent_reclen(rec)
163 if rl <= 0 { off = nb }
164 else {
165 let name: *u8 = dirent_name(rec)
166 if name[0] != (46 as u8) {
167 devices = devices + 1
168 o = hw_row(root, ob, o, name, pathbuf, valbuf, vc)
169 }
170 off = off + rl
171 }
172 }
173 }
174 }
175 sys_close(dfd)
176
177 let wfd: i64 = sys_openat_wr(out, 420)
178 if wfd < 0 { hw_emit(logp, root, out, devices, vc[0], 0 - 1, epoch0, 0); return 1 }
179 sys_write(wfd, ob, o)
180 sys_close(wfd)
181
182 // neg control derived from root: a bogus device under it MUST fail to open (real-fs proof).
183 hw_path(negbuf, root, "zzqnonexistent_bdf" as *u8, "/vendor" as *u8)
184 let neg: i64 = sys_openat_rd(negbuf)
185 if neg >= 0 { sys_close(neg) }
186
187 var ok: i64 = 1
188 if devices < 1 { ok = 0 }
189 if vc[0] != devices { ok = 0 }
190 if neg >= 0 { ok = 0 }
191
192 let epoch: i64 = sys_now_realtime_sec()
193 hw_emit(logp, root, out, devices, vc[0], neg, epoch, ok)
194 if ok == 1 { return 0 }
195 return 1
196}