The host node starts in its ROM (entry 12), and the boot feeds it the system's source through the console: capsules/v4/sys/map-64.f18, the fourteen .f18 blobs and end.f18, each found, hash-checked and signature-checked as any capsule, then EOT. The ROM assembles the system and starts it at (IDLE); the host reads the image record (v4_image_from_node) for what only the assembled system knows. A ROM error is reported with its blob, line and meaning, then PARITY:FAIL. Deleted: v4/tools/mkimage.c, capsules/v4/nucleus-64.f18, v4/capsule/*.v4, v4/tools/v4tof18.py. The .f18 files are the source now. - text.c speaks the rest of the ROM's language (set, here, store, start; v4_text_value, v4_text_start), so the oracle reads the same source: test_host_rom_nucleus compares the ROM against text.c on the .f18 files, word for word, image record included. Host tests load the .f18 files. - mkmap image writes v4_map_image (the map's description of the system); hosted and the kernel link the ROM and the map instead of v4_image_64.c. - Hera (Captain Bob's ruling, option 1): births stream the system the ROM assembled, as assembled code; hera.4th is unchanged. test_host_unit's host builds the system with the ROM. - New parity lines: PARITY:V4_F18 per blob, PARITY:V4_ROM words=2049 rom_hash=0xa6c792b5821010b7 instructions=60725216. Acceptance: amd64, aarch64, riscv64 boot to ok> with PARITY:V4_POST tests=538 pass=538 fail=0, POST: PASSED, and PARITY:V4_SYSTEM word_count=317 dict_hash=0xe5a57f3eb72ff94a on all three -- the same hash as the prebuilt nucleus gave. make -C v4 test test-32 hosted-check: all pass. Logs: logs/20261015-141648, -141938, -142350. Startup cost under QEMU TCG, the ROM's assembly (last V4_F18 line to V4_ROM): amd64 26.7 s of 132 s to ok>; aarch64 41.0 s of 195 s; riscv64 20.5 s of 101 s. Hosted native: +0.85 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
2.8 KiB
C
66 lines
2.8 KiB
C
/* message.h -- a message, as it is written to a port and read from one.
|
|
* docs/v4.0.0/MESH.md section 6.
|
|
*
|
|
* The ports are the transport; the message is what is transported. It is
|
|
* v3's Hermes message with what it carries, a word at a time:
|
|
*
|
|
* word 0 to: the node it is for
|
|
* word 1 from: the node that sent it
|
|
* word 2 type
|
|
* word 3 heat and TTL
|
|
* word 4 ACL tag: the sender's identity fingerprint
|
|
* word 5 sequence
|
|
* word 6 how many characters of text follow, 0 to 1024
|
|
* word 7.. the text, four characters to a word, the first lowest
|
|
*
|
|
* Words 3, 4 and 5 are carried and not yet used: checking them is the
|
|
* router's, and awaits rulings (MESH.md section 3).
|
|
*
|
|
* This is for whatever is on the other end of a node's port and is not a
|
|
* node -- a console, a host -- to speak what the nodes speak (v4/capsule/
|
|
* core.f18 and quit.f18 are the same thing in the node). Nothing here uses
|
|
* the C library.
|
|
*/
|
|
#ifndef V4_MESSAGE_H
|
|
#define V4_MESSAGE_H
|
|
|
|
#include "v4/cell.h"
|
|
|
|
#define V4_MSG_HEADER 7u
|
|
#define V4_MSG_MAX_CHARS 1024u /* a block */
|
|
#define V4_MSG_MAX_WORDS (V4_MSG_HEADER + V4_MSG_MAX_CHARS / 4u)
|
|
|
|
#define V4_MSG_TEXT 1 /* text to be interpreted */
|
|
#define V4_MSG_OUTPUT 2 /* what a node printed */
|
|
#define V4_MSG_DONE 3 /* how the text ended: one word, V4_TEXT_* */
|
|
#define V4_MSG_NACK 4 /* a message was refused: one word, the node it was for (MESH.md 7b) */
|
|
#define V4_MSG_GONE 5 /* a node is gone: one word, its number */
|
|
|
|
/* how text ended */
|
|
#define V4_TEXT_QUIT 0 /* QUIT: nothing is to be said */
|
|
#define V4_TEXT_COMPLETED 1 /* a console says " ok" */
|
|
#define V4_TEXT_ERROR 2 /* the message is printed; a console says " ERROR" */
|
|
|
|
typedef struct {
|
|
v4_cell word[V4_MSG_MAX_WORDS];
|
|
unsigned count; /* words in it */
|
|
} v4_message;
|
|
|
|
/* A message of `len` characters, at most V4_MSG_MAX_CHARS. Returns how many
|
|
* words it is, or 0 if `len` is too many. */
|
|
unsigned v4_message_text(v4_message *m, v4_cell to, v4_cell from, v4_cell type, const char *chars, unsigned len);
|
|
|
|
/* A message arriving a word at a time. Start with m->count = 0 and give
|
|
* each word as it comes: returns 1 when the message is whole, 0 if there is
|
|
* more to come. A length that is not 0 to V4_MSG_MAX_CHARS is taken as 0. */
|
|
int v4_message_word(v4_message *m, v4_cell word);
|
|
|
|
/* Its parts. */
|
|
#define v4_message_to(m) ((m)->word[0])
|
|
#define v4_message_from(m) ((m)->word[1])
|
|
#define v4_message_type(m) ((m)->word[2])
|
|
unsigned v4_message_length(const v4_message *m); /* characters of text */
|
|
char v4_message_char(const v4_message *m, unsigned i); /* the i-th of them */
|
|
|
|
#endif /* V4_MESSAGE_H */
|