code wiki / _hdl_build / nx_cmos_gate.nx
nx_cmos_gate.nx source
↩ module page · 103 lines · 4104 B
1// nx_cmos_gate.nx -- proves the never-brick CMOS config-tweak model.
2//
3// T0 golden-valid : a known-good CMOS image has a consistent checksum
4// T1 safe-tweak-valid : a guarded config tweak keeps the checksum valid + changes the byte
5// N1 raw-corrupt-detected : a raw byte flip (no checksum fix) -> cmos_valid == 0 (BIOS would reject)
6// N2 restore-recovers : restoring the golden snapshot makes it valid again
7// N3 refuse-checksum-byte : cmos_set_safe REFUSES to write the checksum bytes (0x2E/0x2F)
8// N4 refuse-rtc-byte : cmos_set_safe REFUSES to write the RTC/clock/status bytes (<0x10)
9//
10// GREEN only if all six hold. Evidence -> knowledge/status/cmos_gate.log.
11// Sovereign: imports nx_cmos + nx_framed_append + nx_syscalls (no gcc). license_tier: ORIGINAL
12import "nx_cmos.nx"
13import "nx_framed_append.nx"
14import "nx_syscalls.nx"
15
16const CG_LOG: *u8 = "knowledge/status/cmos_gate.log"
17
18func cg_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 }
19func cg_catn(dst: *u8, off: i64, v: i64) -> i64 {
20 var m: i64 = v; var o: i64 = off
21 if m < 0 { m = 0 - m }
22 let t: *u8 = sys_mmap(28); var k: i64 = 0
23 if m == 0 { t[0] = 48 as u8; k = 1 }
24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
25 var i: i64 = 0
26 while i < k { dst[o + i] = t[k - 1 - i]; i = i + 1 }
27 return o + k
28}
29func cg_row(name: *u8, pass: i64) -> i64 {
30 let buf: *u8 = sys_mmap(528)
31 var o: i64 = 0
32 o = cg_cat(buf, o, "CMOSG row=\x00" as *u8)
33 o = cg_cat(buf, o, name)
34 if pass == 1 { o = cg_cat(buf, o, " verdict=PASS\x00" as *u8) } else { o = cg_cat(buf, o, " verdict=FAIL\x00" as *u8) }
35 buf[o] = 0 as u8
36 fa_appendz(CG_LOG, buf, 512)
37 c_puts(" "); c_puts(name)
38 if pass == 1 { c_puts(" PASS\n") } else { c_puts(" FAIL\n") }
39 return 0
40}
41
42func main() -> i64 {
43 c_puts("cmos gate (never-brick config tweak: checksum + golden + range guards)\n")
44 let g: *u8 = sys_mmap(CMOS_SIZE + 16)
45 let w: *u8 = sys_mmap(CMOS_SIZE + 16)
46 cmos_golden(g)
47
48 // T0 golden valid
49 var t0: i64 = 0; if cmos_valid(g) == 1 { t0 = 1 }
50
51 // T1 safe tweak stays valid + byte changed
52 cmos_restore(w, g)
53 let r1: i64 = cmos_set_safe(w, 24, 0x77)
54 var t1: i64 = 0; if r1 == CMOS_OK { if cmos_valid(w) == 1 { if (w[24] as i64) == 0x77 { t1 = 1 } } }
55
56 // N1 raw corruption detected
57 cmos_restore(w, g)
58 cmos_corrupt_raw(w, 20)
59 var n1: i64 = 0; if cmos_valid(w) == 0 { n1 = 1 }
60
61 // N2 restore recovers
62 cmos_restore(w, g)
63 var n2: i64 = 0; if cmos_valid(w) == 1 { n2 = 1 }
64
65 // N3 refuse checksum byte
66 cmos_restore(w, g)
67 let r3: i64 = cmos_set_safe(w, 46, 0)
68 var n3: i64 = 0; if r3 == CMOS_REFUSED { if cmos_valid(w) == 1 { n3 = 1 } }
69
70 // N4 refuse RTC byte
71 cmos_restore(w, g)
72 let r4: i64 = cmos_set_safe(w, 5, 0)
73 var n4: i64 = 0; if r4 == CMOS_REFUSED { if cmos_valid(w) == 1 { n4 = 1 } }
74
75 var passes: i64 = 0
76 if t0 == 1 { passes = passes + 1 }
77 if t1 == 1 { passes = passes + 1 }
78 if n1 == 1 { passes = passes + 1 }
79 if n2 == 1 { passes = passes + 1 }
80 if n3 == 1 { passes = passes + 1 }
81 if n4 == 1 { passes = passes + 1 }
82 var green: i64 = 0
83 if passes == 6 { green = 1 }
84
85 cg_row("T0-golden-valid \x00" as *u8, t0)
86 cg_row("T1-safe-tweak-stays-valid\x00" as *u8, t1)
87 cg_row("N1-raw-corrupt-detected \x00" as *u8, n1)
88 cg_row("N2-restore-recovers \x00" as *u8, n2)
89 cg_row("N3-refuse-checksum-byte \x00" as *u8, n3)
90 cg_row("N4-refuse-rtc-byte \x00" as *u8, n4)
91
92 let vb: *u8 = sys_mmap(528)
93 var o: i64 = 0
94 o = cg_cat(vb, o, "CMOS verdict=\x00" as *u8)
95 if green == 1 { o = cg_cat(vb, o, "GREEN\x00" as *u8) } else { o = cg_cat(vb, o, "RED\x00" as *u8) }
96 o = cg_cat(vb, o, " passes=\x00" as *u8); o = cg_catn(vb, o, passes); o = cg_cat(vb, o, "/6 END\x00" as *u8)
97 vb[o] = 0 as u8
98 fa_appendz(CG_LOG, vb, 512)
99 c_puts(vb); c_puts("\n")
100
101 if green == 1 { return 0 }
102 return 1
103}