code wiki / _hdl_build / nx_init.nx

nx_init.nx source

↩ module page · 87 lines · 5453 B

1// nx_init.nx -- SOVEREIGN INIT SYSTEM (OS gap: INIT-SERVICES). Service UNITS declare dependencies; init computes a 2// dependency-ordered START ORDER (topological sort, Kahn's algorithm) so each unit starts only after its deps, and 3// DETECTS cycles. Ties together the daemons the ecosystem already has under a real init. Grounded: os_init.raw. 4// T1 topo-sort the Nishi service graph -> all units ordered (no cycle). T2 each unit's deps precede it. 5// T3 the root (syscalls, no deps) is first. T4 teeth: a dependency CYCLE is detected (cannot order all). 6// HONEST BEHIND vs systemd: no socket-activation / cgroups / parallel start / live restart-supervision loop (asterisk). 7// expect_exit: 0 Sovereign: nx_syscalls. NEVER-BRICK: orders/launches userspace, writes 0 firmware. 8import "nx_syscalls.nx" 9import "nx_g_puts_lib.nx" 10 11func g_pn(v: i64) -> i64 { let b: *u8=sys_mmap(28); var x: i64=v; if x<0{b[0]=45;sys_write(1,b,1);x=0-x} if x==0{b[0]=48;sys_write(1,b,1);return 0} var d: i64=0; var y: i64=x; while y>0{d=d+1;y=y/10} var i: i64=d-1; y=x; while i>=0{b[i]=(48+(y%10)) as u8;y=y/10;i=i-1} sys_write(1,b,d); return 0 } 12func ck(name: *u8, c: i64) -> i64 { if c==1 { g_puts(" PASS " as *u8) } else { g_puts(" FAIL " as *u8) } g_puts(name); g_puts("\n" as *u8); return c } 13 14const MAXD: i64 = 4 15 16// topological start order (Kahn). ndep[i]=#deps, dep[i*MAXD+k]=dep index. fills order[]; returns count ordered (==N if acyclic, <N if a cycle). 17func nx_topo(ndep: *i64, dep: *i64, N: i64, order: *i64) -> i64 { 18 let indeg: *i64 = sys_mmap(N*8) as *i64; let done: *i64 = sys_mmap(N*8) as *i64 19 var i: i64=0; while i<N { indeg[i]=ndep[i]; done[i]=0; i=i+1 } 20 var oc: i64=0; var changed: i64=1 21 while changed==1 { 22 changed=0; var u: i64=0 23 while u<N { 24 if done[u]==0 { if indeg[u]==0 { 25 order[oc]=u; oc=oc+1; done[u]=1; changed=1 26 var v: i64=0 27 while v<N { if done[v]==0 { var k: i64=0; while k<ndep[v] { if dep[v*MAXD+k]==u { indeg[v]=indeg[v]-1 } k=k+1 } } v=v+1 } 28 } } 29 u=u+1 30 } 31 } 32 return oc 33} 34// every unit's deps must appear BEFORE it in `order`. 35func nx_order_ok(order: *i64, oc: i64, ndep: *i64, dep: *i64, N: i64) -> i64 { 36 if oc != N { return 0 } 37 let pos: *i64 = sys_mmap(N*8) as *i64 38 var i: i64=0; while i<oc { pos[order[i]]=i; i=i+1 } 39 var u: i64=0 40 while u<N { var k: i64=0; while k<ndep[u] { if pos[dep[u*MAXD+k]] >= pos[u] { return 0 } k=k+1 } u=u+1 } 41 return 1 42} 43 44func main() -> i64 { 45 g_puts("nx_init (SOVEREIGN init: dependency-ordered service units + cycle detection)\n" as *u8) 46 var pass: i64=0; var total: i64=0 47 48 // the Nishi service graph: 0 syscalls | 1 alloc<-0 | 2 net<-0 | 3 blockfs<-1,0 | 4 tls<-2 | 5 shell<-3,1 | 6 sites<-4,3 49 let N: i64=7 50 let ndep: *i64 = sys_mmap(N*8) as *i64; let dep: *i64 = sys_mmap(N*MAXD*8) as *i64 51 let nm: *i64 = sys_mmap(N*8) as *i64 52 nm[0]=("syscalls" as *u8) as i64; nm[1]=("alloc" as *u8) as i64; nm[2]=("net" as *u8) as i64; nm[3]=("blockfs" as *u8) as i64; nm[4]=("tls" as *u8) as i64; nm[5]=("shell" as *u8) as i64; nm[6]=("sites_daemon" as *u8) as i64 53 ndep[0]=0 54 ndep[1]=1; dep[1*MAXD+0]=0 55 ndep[2]=1; dep[2*MAXD+0]=0 56 ndep[3]=2; dep[3*MAXD+0]=1; dep[3*MAXD+1]=0 57 ndep[4]=1; dep[4*MAXD+0]=2 58 ndep[5]=2; dep[5*MAXD+0]=3; dep[5*MAXD+1]=1 59 ndep[6]=2; dep[6*MAXD+0]=4; dep[6*MAXD+1]=3 60 61 let order: *i64 = sys_mmap(N*8) as *i64 62 let oc: i64 = nx_topo(ndep, dep, N, order) 63 g_puts(" start order: "); var i: i64=0; while i<oc { g_puts(nm[order[i]] as *u8); if i<oc-1 { g_puts(" -> " as *u8) } i=i+1 } g_puts("\n" as *u8) 64 var t1: i64=0; if oc==N { t1=1 } 65 pass=pass+ck("T1: the service graph topo-sorts -- all 7 units ordered (acyclic)" as *u8, t1); total=total+1 66 var t2: i64=0; if nx_order_ok(order, oc, ndep, dep, N)==1 { t2=1 } 67 pass=pass+ck("T2: dependency order respected -- every unit starts after its deps" as *u8, t2); total=total+1 68 var t3: i64=0; if oc>0 { if order[0]==0 { t3=1 } } 69 pass=pass+ck("T3: the root unit (syscalls, no deps) starts first" as *u8, t3); total=total+1 70 71 // T4 teeth: a 2-unit dependency CYCLE (0<->1) must be detected 72 let cn: i64=2; let cnd: *i64 = sys_mmap(cn*8) as *i64; let cdp: *i64 = sys_mmap(cn*MAXD*8) as *i64; let cord: *i64 = sys_mmap(cn*8) as *i64 73 cnd[0]=1; cdp[0*MAXD+0]=1; cnd[1]=1; cdp[1*MAXD+0]=0 74 let coc: i64 = nx_topo(cnd, cdp, cn, cord) 75 g_puts(" cycle test (0<->1): ordered "); g_pn(coc); g_puts(" / "); g_pn(cn); g_puts(" (a cycle cannot fully order)\n" as *u8) 76 var t4: i64=0; if coc<cn { t4=1 } 77 pass=pass+ck("T4 (teeth): a dependency cycle is DETECTED (cannot order all units)" as *u8, t4); total=total+1 78 79 var okall: i64=0; if pass==total { okall=1 } 80 g_puts("---- nx_init: passed "); g_pn(pass); g_puts(" / "); g_pn(total); g_puts(" ----\n" as *u8) 81 if okall==1 { 82 let logf: i64=sys_openat_append("knowledge/status/init.log" as *u8, 420) 83 if logf>=0 { let z: i64=sys_write(logf,"NXINIT GREEN: dependency-ordered service start (Kahn topo) + cycle detection; deps-before-dependents verified\n" as *u8,103); sys_close(logf) } 84 g_puts("verdict=GREEN (sovereign init: dependency-ordered service units, deps-before-dependents, cycle-detecting; the INIT-SERVICES gap)\n" as *u8); sys_exit(0); return 0 85 } 86 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 87}