Replaces STADIUM_MAX_VM_COUNT (Kconfig, hardcoded default 4) with a boot-time computation, mirroring the pattern stadium_boot_init() already used for the cell pool. New Kconfig STADIUM_VM_MEMORY_PERCENT (default 50): max_vm_count = (kmalloc_get_stats().free_bytes after the cell array * STADIUM_VM_MEMORY_PERCENT / 100) / VM_MEMORY_SIZE, floored to 1, no ceiling (population is not knowable in advance - could be 4, could be 4000). stadium_quotas and word_slots (plus stat_promotions/stat_evictions) are now kmalloc'd to the computed count instead of declared with a macro. New accessor stadium_max_vm_count() replaces every STADIUM_MAX_VM_COUNT reference, including capsule_birth.c's birth-refusal gate. Two things found and fixed along the way: - The existing cell-pool budget was sourced from pmm_get_stats(), which reflects physical pages PMM hasn't handed to any subsystem yet - but the actual allocation is kmalloc(), which draws from the separate, fixed-size heap kmalloc_init() (M6) already carved out of PMM before stadium_boot_init() ever runs. Budgeting against PMM's leftover and allocating from the kmalloc heap are two different pools. Both the cell budget and the new VM-count budget now source from kmalloc_get_stats() instead. - stadium_owner[] (which VM's quota owns each cell) was uint8_t, capped at 255 slots by a compile-time assert tied to the old macro. Widened to uint16_t (65535 slots of headroom) with a runtime clamp + log if the computed count ever exceeds that, since there's no ceiling anymore. Three-arch QEMU acceptance: all clean to ok>, computed VM count genuinely differs by actual available RAM (amd64/riscv64: 50 slots at -m 1024, aarch64: 101 slots), Stadium conservation invariant identical across all three (resident_sum=43691 reservoir=21845 sum=65536). logs/20260815-080526/amd64, logs/20260815-080826/aarch64, logs/20260815-080952/riscv64. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
src/starkernel/vm/
Kernel-side StarForth VM subsystem.
vm_core.c— kernel port of the core interpreter loop.vm_runtime.c— kernel VM runtime support.vm_bootstrap.c— kernel VM bootstrap (distinct frombootstrap/sk_vm_bootstrap.c, which owns the higher-level subsystem wiring called fromkernel_main.c).arena.c— capsule arena allocator (fixed-region allocation for capsule payload data).parity.c— birth/execution parity logging (VM ID + capsule hash + dictionary hash), enabling offline determinism verification.alloc_kernel.c— the kernel-side implementation of the VM's allocator interface actually referenced byMakefile.starkernel's build (seesrc/platform/README.mdfor a note on a second, unwired copy).q48_stubs.c— deliberate no-op stubs forq48_from_double()/q48_to_double()in the freestanding kernel build, where floating point is unavailable; always returns zero, safe because shared VM code only uses these results for logging/diagnostic paths that are inactive in the kernel build.vm_internal.h— internal-only declarations shared across this directory's files.
Subdirectories:
bootstrap/sk_vm_bootstrap.c— owns VM init + capsule loading wiring, called fromkernel_main.c;kernel_main.citself only owns hardware milestones.host/shim.c— host-service shim bridging the kernel VM tosrc/starkernel/hal/host_services.c.