code wiki / _hdl_build / nx_ns_probe.nx
nx_ns_probe.nx source
↩ module page · 36 lines · 1908 B
1// nx_ns_probe.nx -- R2-A NISHI CONTAINERS rung 0: does the sovereign syscall layer speak Linux
2// NAMESPACES? Probes unshare(2) with UTS/MNT/PID flags. rv64 unshare = 97 (__syscall translates
3// rv64->x86 272). Readout law: 0 = namespace created (running as root) ; -EPERM(-1) = syscall WIRED,
4// needs privilege (still a PASS for the layer) ; -ENOSYS(-38) = TRANSLATION GAP = raised hand.
5// Run VIA nx_sov_build_run; trust run-exit only. exit: 0=wired(0/EPERM), 1=ENOSYS gap, 2=other.
6// license_tier: ORIGINAL
7import "nx_sovjson_lib.nx"
8import "nx_syscalls.nx"
9
10func np_w(s: *u8) -> i64 { return sj_puts(s) }
11func np_n(v: i64) -> i64 { let b: *u8=sys_mmap(28); var m: i64=v; if m<0 {m=0-m; np_w("-" as *u8)}; let t: *u8=sys_mmap(28); 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 {b[i]=t[k-1-i];i=i+1}; sys_write(1,b,k); return 0 }
12
13func np_try(name: *u8, flags: i64) -> i64 {
14 let r: i64 = __syscall(97, flags, 0, 0, 0, 0, 0) // unshare (rv64 97 -> x86 272)
15 np_w("ns_probe " as *u8); np_w(name); np_w(" rc=" as *u8); np_n(r); np_w("\n" as *u8)
16 return r
17}
18
19func main() -> i64 {
20 var worst: i64 = 0
21 let r1: i64 = np_try("UTS" as *u8, 0x04000000)
22 let r2: i64 = np_try("MNT" as *u8, 0x00020000)
23 let r3: i64 = np_try("PID" as *u8, 0x20000000)
24 var i: i64 = 0
25 let rs: *i64 = sys_mmap(32) as *i64
26 rs[0] = r1; rs[1] = r2; rs[2] = r3
27 while i < 3 {
28 let r: i64 = rs[i]
29 if r == (0 - 38) { worst = 1 } // ENOSYS = translation gap
30 if r < 0 { if r != (0 - 1) { if r != (0 - 38) { if worst == 0 { worst = 2 } } } }
31 i = i + 1
32 }
33 if worst == 0 { np_w("NS LAYER WIRED (0 or EPERM = syscall reaches kernel)\n" as *u8) }
34 if worst == 1 { np_w("RAISED HAND: unshare NOT in rv64->x86 translation (ENOSYS)\n" as *u8) }
35 sys_exit(worst); return worst
36}