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}