code wiki / _hdl_build / _statfs_probe.nx
_statfs_probe.nx source
↩ module page · 27 lines · 1453 B
1// _statfs_probe.nx -- evidence probe: which __syscall number reaches x86 statfs through the
2// translation table? rv64 statfs=43 vs x86 statfs=137 (landmine class: rv64 unlinkat 35 passed
3// through untranslated -> x86 nanosleep). Prints SF lines; judge free-GB vs df. Throwaway probe.
4import "nx_syscalls.nx"
5func _p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
6func _pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
7func probe(num: i64, path: *u8) -> i64 {
8 let buf: *i64 = sys_mmap(144) as *i64
9 let rc: i64 = __syscall(num, path, buf, 0, 0, 0, 0)
10 _p("SF num=" as *u8); _pn(num); _p(" path=" as *u8); _p(path); _p(" rc=" as *u8); _pn(rc)
11 if rc == 0 {
12 // struct statfs x86-64: f_type[0] f_bsize[1] f_blocks[2] f_bfree[3] f_bavail[4] (i64 each)
13 let freegb: i64 = (buf[1] * buf[4]) / 1073741824
14 _p(" bsize=" as *u8); _pn(buf[1]); _p(" bavail=" as *u8); _pn(buf[4]); _p(" free_gb=" as *u8); _pn(freegb)
15 }
16 _p("\n" as *u8)
17 return 0
18}
19func main() -> i64 {
20 probe(43, "." as *u8)
21 probe(137, "." as *u8)
22 probe(43, "/tmp" as *u8)
23 probe(137, "/tmp" as *u8)
24 _p("SF-PROBE-DONE\n" as *u8)
25 sys_exit(0)
26 return 0
27}