code wiki / (root) / nx_mmap_direct_lifecycle_gate_t181.nx

nx_mmap_direct_lifecycle_gate_t181.nx

buildroot/runtime/nx_mmap_direct_lifecycle_gate_t181.nx

1983 B13 linesdepth 2pulls 2 transitivereach 0 importersview sourcekind tooltopic mmap
docsdependenciesstructsconstsfunctions

dependencies 1 imports · 0 importers

nx_syscalls.nx nx_mmap_direct_lifecycle_gate_

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

main sys_mmap nxa_die sys_write sys_exit nxa_lock_take nxa_lock_addr sys_write ↻ nxa_lock_give nxa_lock_addr ↻ nxa_report_overrun sys_write ↻ nxa_dump_printable sys_write ↻ nxa_dump_sizes sys_write ↻ sys_mmap_try sys_munmap_direct pages sys_openat_rd sys_read sys_close mp sys_write ↻

structs

none

consts

5const NXA_MAP_INVALID:i64=0-22 // Linux EINVAL, a protocol value rather than a resource budget.

functions

6func sys_munmap_direct(addr:*u8,len:i64)->i64
called by 1: main
11func mp(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};sys_write(1,s,n);return 0}
called by 1: main calls 1: sys_write
12func 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}
called by 1: main calls 3: sys_openat_rdsys_readsys_close
13func 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}