code wiki / _hdl_build / nx_proc_kat.nx

nx_proc_kat.nx source

↩ module page · 44 lines · 2992 B

1// nx_proc_kat.nx -- KAT for nx_proc (process syscalls + wait-status decoders). HONESTY [W] weak point 2// (reach=200). Pure decoders KAT'd vs the Linux wait-status layout, plus a REAL fork+wait4 roundtrip. 3// license_tier: ORIGINAL expect_exit:0 4import "nx_syscalls.nx" 5import "nx_proc.nx" 6 7func w(s: *u8) -> i64 { var k:i64=0; while s[k]!=(0 as u8){k=k+1} sys_write(1,s,k); return 0 } 8func n(v: i64) -> i64 { let b:*u8=sys_mmap(24); var m:i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} let t:*u8=sys_mmap(24); 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 j:i64=0; while j<k{b[j]=t[k-1-j];j=j+1} sys_write(1,b,k); return 0 } 9 10func main() -> i64 { 11 var pass: i64 = 0 12 13 // T1: exited status (exit code 42 -> status = 42<<8 = 0x2A00) 14 let se: i64 = 42 << 8 15 if nx_proc_wait_exited(se) == 1 { if nx_proc_wait_status(se) == 42 { if nx_proc_wait_signaled(se) == 0 { pass = pass + 1; w("T1 exited-decode PASS\n" as *u8) } else { w("T1 FAIL signaled\n" as *u8) } } else { w("T1 FAIL status\n" as *u8) } } else { w("T1 FAIL exited\n" as *u8) } 16 17 // T2: signaled status (killed by signal 9; low 7 bits = 9) 18 if nx_proc_wait_signaled(9) == 1 { if nx_proc_wait_termsig(9) == 9 { if nx_proc_wait_exited(9) == 0 { pass = pass + 1; w("T2 signaled-decode PASS\n" as *u8) } else { w("T2 FAIL exited\n" as *u8) } } else { w("T2 FAIL termsig\n" as *u8) } } else { w("T2 FAIL signaled\n" as *u8) } 19 20 // T3: stopped/other (low 7 bits = 0x7F) -> NOT signaled, NOT exited 21 if nx_proc_wait_signaled(0x7F) == 0 { if nx_proc_wait_exited(0x7F) == 0 { pass = pass + 1; w("T3 stopped-not-sig-not-exit PASS\n" as *u8) } else { w("T3 FAIL exited\n" as *u8) } } else { w("T3 FAIL signaled\n" as *u8) } 22 23 // T4: getpid / getppid are sane (>0) 24 if nx_proc_getpid() > 0 { if nx_proc_getppid() > 0 { pass = pass + 1; w("T4 getpid/getppid PASS\n" as *u8) } else { w("T4 FAIL ppid\n" as *u8) } } else { w("T4 FAIL pid\n" as *u8) } 25 26 // T5: REAL fork + wait4 roundtrip -- child exits 7, parent decodes 7 27 let pid: i64 = nx_proc_fork() 28 if pid == 0 { sys_exit(7) } 29 let st: *i64 = sys_mmap(16) as *i64 30 nx_proc_wait4(pid, st, 0) 31 if nx_proc_wait_exited(st[0]) == 1 { if nx_proc_wait_status(st[0]) == 7 { pass = pass + 1; w("T5 fork+wait roundtrip(7) PASS\n" as *u8) } else { w("T5 FAIL code=" as *u8); n(nx_proc_wait_status(st[0])); w("\n" as *u8) } } else { w("T5 FAIL not-exited\n" as *u8) } 32 33 // T6: second fork -- child exits 0, code=0, exited=1 34 let pid2: i64 = nx_proc_fork() 35 if pid2 == 0 { sys_exit(0) } 36 let st2: *i64 = sys_mmap(16) as *i64 37 nx_proc_wait4(pid2, st2, 0) 38 if nx_proc_wait_exited(st2[0]) == 1 { if nx_proc_wait_status(st2[0]) == 0 { pass = pass + 1; w("T6 fork+wait(0) PASS\n" as *u8) } else { w("T6 FAIL\n" as *u8) } } else { w("T6 FAIL\n" as *u8) } 39 40 w("NX-PROC-KAT " as *u8); n(pass); w("/6" as *u8) 41 if pass == 6 { w(" GREEN\n" as *u8); return 0 } 42 w(" RED\n" as *u8) 43 return 1 44}