Session.parent now comes from the actual birthing VM's own stadium_vm_id, not a hardcoded vm_uuid_hera(). Added a VMUuid parent parameter to capsule_birth_baby() and, one level up, to capsule_console_birth()/capsule_runcap_birth() (neither had a VM* in their own signature, but every caller did). Updated all 6 real call sites: BIRTH, CAPSULE-BIRTH, CONNECT-ARTEMIS, CONNECT-HERMES, RUNCAP-TEST, PAIR-TEST (mama_forth_words.c) and the console+user birth pair in capsule_wirebind_try_attach() (capsule_wirebind.c). Two functions had their vm parameter marked __attribute__((unused)), now genuinely used -- attribute removed. Steps 8 (Session.name from capsule name) and 9 (identity defaults to installed=0) were already satisfied by step 5's existing session_register() call and its identity-zeroing -- confirmed by inspection, no further code needed. Verified 3-arch boot to ok> (amd64/aarch64/riscv64). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
89 lines
3.1 KiB
C
89 lines
3.1 KiB
C
/*
|
||
StarForth — Steady-State Virtual Machine Runtime
|
||
|
||
Copyright (c) 2023–2025 Robert A. James
|
||
All rights reserved.
|
||
|
||
Licensed under the StarForth License, Version 1.0
|
||
*/
|
||
|
||
#ifndef __STARKERNEL__
|
||
#error "capsule_console.c is kernel-only"
|
||
#endif
|
||
|
||
#include "starkernel/capsule_console.h"
|
||
#include "starkernel/capsule.h"
|
||
#include "starkernel/capsule_birth.h"
|
||
#include "starkernel/xxhash64.h"
|
||
#include "starkernel/kmalloc.h"
|
||
#include <string.h>
|
||
|
||
/* Real, minimal, working content -- just enough vocabulary to send/
|
||
* receive messages (common:messaging.4th, same as every other VM).
|
||
* No COMMON-CH subscription: a console's own traffic is direct 1:1
|
||
* with its paired user VM (CONSOLE-CMD-EVENT), not broadcast, so
|
||
* there's no need to resolve an index in Hermes's own routing table
|
||
* for it. Needs the "Block NNNN" header capsule_exec_payload()
|
||
* requires (§F.18) -- not optional. 4997 is an unused block number. */
|
||
static const char CONSOLE_IDENTITY_SRC[] =
|
||
"Block 4997\n"
|
||
"S\" common:messaging.4th\" EXEC\n"
|
||
"MSG-CD-INIT\n";
|
||
|
||
CapsuleRunResult capsule_console_birth(const char *console_name, VMUuid parent,
|
||
VMUuid *out_vm_id, void **out_vm_ctx)
|
||
{
|
||
if (!console_name) return CAPSULE_RUN_ERR_INVALID;
|
||
|
||
size_t source_len = sizeof(CONSOLE_IDENTITY_SRC) - 1u;
|
||
uint8_t *arena = (uint8_t *)kmalloc(source_len);
|
||
if (!arena) return CAPSULE_RUN_ERR_STILLBORN;
|
||
memcpy(arena, CONSOLE_IDENTITY_SRC, source_len);
|
||
|
||
/* Heap-built single-entry directory -- same shape RUNCAP already
|
||
* established (§F.6/§F.18); never freed, matches that precedent
|
||
* (a VM's IDENTITY exec reads directly from this arena). */
|
||
CapsuleNameEntry name_entry;
|
||
memset(name_entry.name, 0, sizeof(name_entry.name));
|
||
{
|
||
size_t n = strlen(console_name);
|
||
if (n >= CAPSULE_NAME_MAX) n = CAPSULE_NAME_MAX - 1u;
|
||
memcpy(name_entry.name, console_name, n);
|
||
}
|
||
|
||
CapsuleDesc desc;
|
||
memset(&desc, 0, sizeof(desc));
|
||
desc.magic = CAPSULE_MAGIC_PACK(CAPSULE_VERSION_0, CAPSULE_HASH_XXHASH64);
|
||
desc.content_hash = xxhash64_capsule(arena, source_len);
|
||
desc.capsule_id = desc.content_hash;
|
||
desc.offset = 0;
|
||
desc.length = source_len;
|
||
desc.flags = CAPSULE_FLAG_ACTIVE | CAPSULE_FLAG_PRODUCTION;
|
||
desc.owner_vm = 0;
|
||
desc.birth_count = 0;
|
||
desc.created_ns = 0;
|
||
|
||
CapsuleDirHeader dir;
|
||
memset(&dir, 0, sizeof(dir));
|
||
dir.magic = CAPSULE_DIR_MAGIC;
|
||
dir.arena_base = (uint64_t)(uintptr_t)arena;
|
||
dir.arena_size = source_len;
|
||
dir.desc_count = 1;
|
||
dir.desc_capacity = 1;
|
||
dir.name_count = 1;
|
||
dir.dir_hash = 0;
|
||
|
||
CapsuleRunResult r = capsule_birth_baby(
|
||
console_name, &dir, &desc, &name_entry, arena, parent,
|
||
1 /* skip_pki_sig -- not build-time content, same rationale as RUNCAP */,
|
||
out_vm_id, out_vm_ctx);
|
||
|
||
/* capsule_birth_baby() never sets the registry entry's own .name --
|
||
* found live in RUNCAP (§F.18), same fix needed here. */
|
||
if (r == CAPSULE_RUN_OK && out_vm_id) {
|
||
capsule_vm_registry_set_name(*out_vm_id, console_name);
|
||
}
|
||
|
||
return r;
|
||
}
|