nx_mmap_direct_lifecycle_gate_t181.nx
buildroot/runtime/nx_mmap_direct_lifecycle_gate_t181.nx
dependencies 1 imports · 0 importers
imports: nx_syscalls.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 5 | const NXA_MAP_INVALID:i64=0-22 // Linux EINVAL, a protocol value rather than a resource budget. |
functions
| 6 | func sys_munmap_direct(addr:*u8,len:i64)->i64 called by 1: main |
| 11 | func mp(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};sys_write(1,s,n);return 0} |
| 12 | func pages(buf:*u8)->i64{let fd:i64=sys_openat_rd("/proc/self/statm");if fd<0{return -1};let n:i64=sys_read(fd,buf,127);sys_close(fd);if n<=0{return -1};var i:i64=0;var v:i64=0;while i<n&&buf[i]>=(48 as u8)&&buf[i]<=(57 as u8){v=v*10+(buf[i] as i64)-48;i=i+1};if i==0{return -1};return v} |
| 13 | func main()->i64{let buf:*u8=sys_mmap(128);let sizes:*i64=sys_mmap(32) as *i64;sizes[0]=1;sizes[1]=128;sizes[2]=256;sizes[3]=4096;var k:i64=0;while k<4{let p:*u8=sys_mmap_try(sizes[k]);if (p as i64)<=0{return 1};p[0]=17 as u8;if sys_munmap_direct(p,sizes[k])!=0{return 2};k=k+1};let before:i64=pages(buf);if before<=0{return 3};k=0;while k<4{var i:i64=0;while i<2048{let p:*u8=sys_mmap_try(sizes[k]);if (p as i64)<=0{return 4};p[0]=19 as u8;p[sizes[k]-1]=23 as u8;if sys_munmap_direct(p,sizes[k])!=0{return 5};i=i+1};k=k+1};let after:i64=pages(buf);if after!=before{mp("FAIL mapping-growth\n");return 6};let p:*u8=sys_mmap_try(128);if (p as i64)<=0{return 7};p[0]=29 as u8;if sys_munmap_direct(p,0)!=NXA_MAP_INVALID||sys_munmap_direct(p,0-1)!=NXA_MAP_INVALID||sys_munmap_direct(0 as *u8,128)!=NXA_MAP_INVALID{mp("FAIL invalid-length\n");return 8};if p[0]!=(29 as u8){return 9};if sys_munmap_direct(p,128)!=0{return 10};if pages(buf)!=before{return 11};mp("PASS mapping-lifecycle cycles=8192 sizes=1,128,256,4096 virtual-page-delta=0 invalid-lengths-refused mapping-survived-refusal\n");return 0} |