code wiki / (root) / nx_tools_timing_exec_diagnostic.nx

nx_tools_timing_exec_diagnostic.nx source

↩ module page · 33 lines · 1668 B

1// Read-only diagnostic of one explicitly supplied fixture ELF. No config or journal writes. 2import "nx_syscalls.nx" 3import "nx_gate_verdict.nx" 4func main(argc: i64, argv: *i64) -> i64 { 5 if argc != 2 { return 3 } 6 let cwd: *u8=sys_mmap(SYS_PATH_MAX) 7 let cn: i64=sys_getcwd(cwd,SYS_PATH_MAX) 8 gv_puts("diagnostic cwd=" as *u8) 9 if cn > 0 { gv_puts(cwd) } 10 gv_puts(" path=" as *u8); gv_puts(argv[1] as *u8); gv_puts("\n" as *u8) 11 let size: *i64=sys_mmap(8) as *i64 12 let data: *u8=sys_read_file(argv[1] as *u8,size) 13 gv_puts("read_pointer=" as *u8); gv_num(data as i64); gv_puts(" bytes=" as *u8); gv_num(size[0]); gv_puts("\n" as *u8) 14 if (data as i64) <= 0 { return 3 } 15 sys_free_file(data,size[0]) 16 let pid: i64=sys_fork() 17 if pid < 0 { return 3 } 18 if pid == 0 { 19 let av: *i64=sys_mmap(4*8) as *i64 20 av[0]=argv[1]; av[1]="ok" as *u8 as i64; av[2]="0" as *u8 as i64; av[3]=0 21 let env: *i64=sys_mmap(8) as *i64; env[0]=0 22 let clean_rc: i64=sys_execve_clean(argv[1] as *u8,av,env) 23 gv_puts("execve_clean_return=" as *u8); gv_num(clean_rc); gv_puts("\n" as *u8) 24 // Reached only when no executable replaced this process. 25 let direct_rc: i64=sys_execve(argv[1] as *u8,av,env) 26 gv_puts("direct_execve_return=" as *u8); gv_num(direct_rc); gv_puts("\n" as *u8) 27 sys_exit_group(1) 28 } 29 let status: *i64=sys_mmap(8) as *i64 30 let waited: i64=sys_wait4(pid,status,0) 31 gv_puts("waited=" as *u8); gv_num(waited); gv_puts(" wait_status=" as *u8); gv_num(status[0]); gv_puts("\n" as *u8) 32 if waited != pid { return 1 }; if status[0] != 0 { return 1 }; return 0 33}