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}