/* SPDX-License-Identifier: LicenseRef-Starship-1.0 * Copyright (c) 2023-2026 Robert A. James */ /* test_stadium_node.c -- kernel/src/vm/stadium.c and session.c on the host (#189, plan * 2026-11-13-engine-step4-phase1, Task 1): the Stadium keyed by a v4 node's number (Captain Bob, * 2026-11-13: "A new node key"). A node's key is none of v3's (not Hera's all-zero, not "none"); the * Stadium can be made with that key in its first quota; the node is born on cell 0, its session * registered and pinned, its whole share in its reservoir -- as Hera is on v3's path, which keeps * vm_uuid_hera() and stadium_birth_hera(). * * What the sources call outside themselves is defined here. */ #include "harness.h" #include "starkernel/vm/stadium.h" #include "starkernel/session.h" #include "starkernel/vm_uuid.h" #include "starkernel/kmalloc.h" #include "starkernel/q48_16.h" #include #include #include #include void *kmalloc(size_t size) { return calloc(1, size); } void kfree(void *ptr) { free(ptr); } kmalloc_stats_t kmalloc_get_stats(void) { kmalloc_stats_t s; memset(&s, 0, sizeof s); s.free_bytes = 16u * 1024u * 1024u; /* a small heap: the Stadium takes its percentage of it */ return s; } void log_message(int level, const char *fmt, ...) { (void)level; (void)fmt; } void sk_hal_panic(const char *message) { printf("PANIC: %s\n", message); exit(2); } int blk_flush(uint32_t block_num) { (void)block_num; return 0; } int main(void) { VMUuid key = stadium_node_key(10), other = stadium_node_key(11); Session *s; CHECK(!vm_uuid_is_hera(key) && !vm_uuid_is_none(key), "a node's key is neither Hera's (all-zero) nor none"); CHECK(!vm_uuid_equal(key, other), "two nodes, two keys"); CHECK(vm_uuid_equal(key, stadium_node_key(10)), "a node's key is the same each time"); CHECK(stadium_boot_init_for(key) == 0 && stadium_is_initialized(), "the Stadium is made with the node's key first"); CHECK(session_boot_init() == 0, "the sessions"); CHECK(stadium_quota_slot_for_vm(key) == 0, "the node holds the first quota"); CHECK(stadium_quota_slot_for_vm(vm_uuid_hera()) < 0, "and Hera's all-zero key none"); CHECK(stadium_reservoir_peek(key) == Q48_ONE, "its reservoir holds the whole share, 1.0"); CHECK(stadium_birth_node(key, "Hera") == 0, "the node is born"); s = session_find(key); CHECK(s != 0 && s->stadium_cell == 0, "on cell 0, patron zero, its session registered"); CHECK(session_is_pinned(key), "and pinned"); CHECK(stadium_conserved(key), "conservation holds: resident heat and reservoir sum to 1.0"); CHECK(stadium_birth_node(key, "Hera") == 0 && session_find(key) == s, "born twice is born once"); return DONE(); }