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}