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}