Stage 1: per-VM native stacks, allocated but not yet executed on (FABRIC-3.md §XXVIII)
Second stage of the preemptive context-switching plan. Every VM (Hera, every capsule_birth_baby()-born VM including WIREBIND identities) now gets its own dedicated 2 MiB native C stack at birth -- but nothing runs on it yet, that's Stage 2. Pure allocation-machinery proof. Design correction made before writing code: the plan called for cloning sk_vm_arena_alloc()'s guard-page pattern, but that pattern turns out to be Mama-only -- host_services.c's kernel_alloc() gives every baby VM a plain kmalloc() block for its dictionary arena, not a real guarded PMM allocation. Stacks get the real treatment instead (new sk_vm_native_stack_alloc()/_free() in arena.c): independent pmm_alloc_contiguous() + guard pages for every VM without exception, no singleton, no kmalloc fallback -- a stack overflow is exactly the failure mode guard pages exist for, and a corrupted stack could corrupt whatever saved context Stage 2 trusts. 2 MiB size matches this project's own established kernel-stack convention (g_kernel_stack/g_rpi5_native_stack), not a guess -- that one shared 2 MiB stack today already carries all VMs' combined nested VM-EXEC recursion. Three new VM struct fields, freed in vm_cleanup() alongside the existing call_stack free. Allocation failure is non-fatal to birth. All 3 architectures re-verified clean boot to ok>, no native-stack allocation failures for any Tripod-fleet VM. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016UNhH1mhi52i6Qihh7ZV5S
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
15672ce17c
commit
57ac3fc304
@@ -364,6 +364,23 @@ void vm_cleanup(VM* vm)
|
||||
#ifdef __STARKERNEL__
|
||||
sf_free(vm->call_stack);
|
||||
vm->call_stack = NULL;
|
||||
|
||||
/* FABRIC-3.md §XXVIII, Stage 1 (2026-09-13): free the native stack
|
||||
* allocated at birth (capsule_birth_baby() / sk_vm_bootstrap_parity()).
|
||||
* Nothing executes on it yet (that's Stage 2), so there is no
|
||||
* switched-out-state guard to check here yet -- Stage 2 adds that
|
||||
* guard at the KILL call sites, before this function is ever reached
|
||||
* for a VM that would need it. */
|
||||
if (vm->native_stack_paddr != 0) {
|
||||
sk_vm_native_stack_t ns;
|
||||
ns.paddr = vm->native_stack_paddr;
|
||||
ns.guard_vaddr = vm->native_stack_guard_vaddr;
|
||||
ns.stack_top = vm->native_stack_top;
|
||||
sk_vm_native_stack_free(&ns);
|
||||
vm->native_stack_paddr = 0;
|
||||
vm->native_stack_guard_vaddr = 0;
|
||||
vm->native_stack_top = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user