==> tests/layout.c <==1/* The Rust const asserts that span packages and call functions, the FRAMES guard, and the Rust's
2 * layout_tests::regions_have_no_aliased_fields, over the whole contract. */
3#include "mesh/abi.h"
4#include "mesh/check.h"
5
6int main(void) {
7 CHECK(mesh_disjoint(MESH_HEADER_FIELDS, MESH_HEADER_FIELDS_LEN)); /* disjoint(&HEADER_FIELDS) */
8 CHECK(mesh_disjoint(MESH_EXT_FIELDS, MESH_EXT_FIELDS_LEN)); /* disjoint(&EXT_FIELDS) */
9 CHECK(mesh_disjoint(MESH_HOST_FIELDS, MESH_HOST_FIELDS_LEN)); /* disjoint(&HOST_FIELDS) */
10 CHECK(mesh_disjoint(MESH_MEMBER_FIELDS, MESH_MEMBER_FIELDS_LEN)); /* disjoint(&MEMBER_FIELDS) */
11 CHECK(mesh_disjoint(MESH_LINK_FIELDS, MESH_LINK_FIELDS_LEN)); /* disjoint(&LINK_FIELDS) */
12 CHECK(mesh_disjoint(MESH_NIC_FIELDS, MESH_NIC_FIELDS_LEN)); /* disjoint(&NIC_FIELDS) */
13 CHECK(mesh_disjoint(MESH_CTL_FIELDS, MESH_CTL_FIELDS_LEN)); /* disjoint(&CTL_FIELDS) */
14 CHECK(mesh_fields_end(MESH_CTL_FIELDS, MESH_CTL_FIELDS_LEN) <= MESH_LINE); /* fields_end(&CTL_FIELDS) <= LINE */
15 CHECK(mesh_disjoint(MESH_NODE_FIELDS, MESH_NODE_FIELDS_LEN)); /* disjoint(&NODE_FIELDS) */
16 CHECK(mesh_fields_end(MESH_NODE_FIELDS, MESH_NODE_FIELDS_LEN) <= MESH_NODE_STRIDE); /* fields_end(&NODE_FIELDS) <= NODE_STRIDE */
17 CHECK(mesh_disjoint(MESH_NODE_LOAD_FIELDS, MESH_NODE_LOAD_FIELDS_LEN)); /* disjoint(&NODE_LOAD_FIELDS) */
18 CHECK(mesh_fields_end(MESH_NODE_LOAD_FIELDS, MESH_NODE_LOAD_FIELDS_LEN) <= MESH_NL_STRIDE); /* fields_end(&NODE_LOAD_FIELDS) <= NL_STRIDE */
19 CHECK(mesh_disjoint(MESH_MLOAD_FIELDS, MESH_MLOAD_FIELDS_LEN)); /* disjoint(&MLOAD_FIELDS) */
20 CHECK(mesh_fields_end(MESH_MLOAD_FIELDS, MESH_MLOAD_FIELDS_LEN) <= MESH_MLOAD_BYTES); /* fields_end(&MLOAD_FIELDS) <= MLOAD_BYTES */
21 CHECK(mesh_disjoint(MESH_PLOAD_FIELDS, MESH_PLOAD_FIELDS_LEN)); /* disjoint(&PLOAD_FIELDS) */
22 CHECK(mesh_fields_end(MESH_PLOAD_FIELDS, MESH_PLOAD_FIELDS_LEN) <= MESH_PLOAD_BYTES); /* fields_end(&PLOAD_FIELDS) <= PLOAD_BYTES */
23 CHECK(mesh_prog_ext(MESH_PROG_SLOTS ) + 0x8000 <= MESH_NODE_LOAD); /* prog_ext(PROG_SLOTS as u32) + 0x8000 <= NODE_LOAD */
24 CHECK(mesh_node_load(MESH_PROG_SLOTS , 0) <= MESH_LOAD_PAGE); /* node_load(PROG_SLOTS as u32, 0) <= LOAD_PAGE */
25 CHECK(mesh_load_page(MESH_S_LOAD_END) <= MESH_PIPE_TABLE); /* load_page(S_LOAD_END) <= PIPE_TABLE */
26 CHECK(mesh_pipe_entry(MESH_PROG_SLOTS ) <= MESH_VIEW_HEAP); /* pipe_entry(PROG_SLOTS as u32) <= VIEW_HEAP */
27 CHECK(mesh_disjoint(MESH_PIPE_FIELDS, MESH_PIPE_FIELDS_LEN)); /* disjoint(&PIPE_FIELDS) */
28 CHECK(mesh_fields_end(MESH_PIPE_FIELDS, MESH_PIPE_FIELDS_LEN) <= MESH_PP_BYTES); /* fields_end(&PIPE_FIELDS) <= PP_BYTES */
29 CHECK(mesh_nic(MESH_MAX_NICS) <= MESH_S_LOAD); /* nic(MAX_NICS) <= S_LOAD */
30 CHECK(mesh_mload(MESH_MAX_SYSTEMS) <= 0x1400); /* mload(MAX_SYSTEMS) <= 0x1400 */
31 CHECK(mesh_pload(MESH_PROG_SLOTS ) == MESH_S_LOAD_END); /* pload(PROG_SLOTS as u32) == S_LOAD_END */
32 CHECK(mesh_mload(MESH_MAX_SYSTEMS) <= MESH_S_FLEET); /* mload(MAX_SYSTEMS) <= S_FLEET */
33 CHECK(mesh_fmember(MESH_MAX_SYSTEMS) <= MESH_S_GROUP); /* fmember(MAX_SYSTEMS) <= S_GROUP */
34 CHECK(mesh_placed(MESH_PROG_SLOTS ) <= MESH_S_SCHED_END); /* placed(PROG_SLOTS as u32) <= S_SCHED_END */
35 CHECK(mesh_frame_kind(MESH_F_JOB_STATE) == MESH_KIND_LOAD); /* frame_kind(F_JOB_STATE) == KIND_LOAD */
36 CHECK(mesh_frame_kind(MESH_F_RESULT) == MESH_KIND_LOAD); /* frame_kind(F_RESULT) == KIND_LOAD */
37 CHECK(mesh_frame_kind(MESH_F_VIEW) == MESH_KIND_LOAD); /* frame_kind(F_VIEW) == KIND_LOAD */
38 CHECK(mesh_frame_kind(MESH_F_BLOB) == MESH_KIND_LOAD); /* frame_kind(F_BLOB) == KIND_LOAD */
39 CHECK(mesh_disjoint(MESH_FMEMBER_FIELDS, MESH_FMEMBER_FIELDS_LEN)); /* disjoint(&FMEMBER_FIELDS) */
40 CHECK(mesh_fields_end(MESH_FMEMBER_FIELDS, MESH_FMEMBER_FIELDS_LEN) <= MESH_FMEMBER_BYTES); /* fields_end(&FMEMBER_FIELDS) <= FMEMBER_BYTES */
41 CHECK(mesh_fields_end(MESH_HEADER_FIELDS, MESH_HEADER_FIELDS_LEN) <= MESH_H_BYTES); /* fields_end(&HEADER_FIELDS) <= H_BYTES */
42 CHECK(mesh_fields_end(MESH_EXT_FIELDS, MESH_EXT_FIELDS_LEN) <= MESH_PX_BYTES); /* fields_end(&EXT_FIELDS) <= PX_BYTES */
43 CHECK(mesh_fields_end(MESH_HOST_FIELDS, MESH_HOST_FIELDS_LEN) <= MESH_SNAP_HOST); /* fields_end(&HOST_FIELDS) <= SNAP_HOST */
44 CHECK(mesh_fields_end(MESH_MEMBER_FIELDS, MESH_MEMBER_FIELDS_LEN) <= MESH_MEMBER_BYTES); /* fields_end(&MEMBER_FIELDS) <= MEMBER_BYTES */
45 CHECK(mesh_fields_end(MESH_LINK_FIELDS, MESH_LINK_FIELDS_LEN) <= MESH_LINK_BYTES); /* fields_end(&LINK_FIELDS) <= LINK_BYTES */
46 CHECK(mesh_fields_end(MESH_NIC_FIELDS, MESH_NIC_FIELDS_LEN) <= MESH_NIC_BYTES); /* fields_end(&NIC_FIELDS) <= NIC_BYTES */
47 CHECK(mesh_member(MESH_MAX_SYSTEMS) <= MESH_S_NET_AT_MS); /* member(MAX_SYSTEMS) <= S_NET_AT_MS */
48 CHECK(mesh_link(MESH_MAX_SYSTEMS) <= MESH_S_NICS); /* link(MAX_SYSTEMS) <= S_NICS */
49 CHECK(mesh_nic(MESH_MAX_NICS) <= MESH_SNAP_HOST); /* nic(MAX_NICS) <= SNAP_HOST */
50 CHECK(mesh_frame_kind(MESH_F_ROUND) == MESH_KIND_ROUND); /* frame_kind(F_ROUND) == KIND_ROUND */
51 CHECK(mesh_frame_kind(MESH_F_FRAME) == MESH_KIND_PLACE); /* frame_kind(F_FRAME) == KIND_PLACE */
52 CHECK(mesh_frame_kind(MESH_F_STATE) == MESH_KIND_LOAD); /* frame_kind(F_STATE) == KIND_LOAD */
53 CHECK(mesh_frame_kind(MESH_F_BEAT) == MESH_KIND_CTL); /* frame_kind(F_BEAT) == KIND_CTL */
54 CHECK(mesh_frame_kind(MESH_F_JOIN) == MESH_KIND_CTL); /* frame_kind(F_JOIN) == KIND_CTL */
55 CHECK(mesh_prog_entry(MESH_PROG_SLOTS ) <= MESH_PROG_CTL); /* prog_entry(PROG_SLOTS as u32) <= PROG_CTL */
56 CHECK(mesh_prog_ctl(MESH_PROG_SLOTS ) <= MESH_PROG_NODES); /* prog_ctl(PROG_SLOTS as u32) <= PROG_NODES */
57 CHECK(mesh_trace_rec(MESH_PROG_SLOTS - 1, MESH_TRACE_PER_PROG - 1) + MESH_TRACE_BYTES <= MESH_EX_BASE); /* trace_rec(PROG_SLOTS as u32 - 1, TRACE_PER_PROG - 1) + TRACE_BYTES <= EX_BASE */
58 CHECK(mesh_ex_counter(MESH_MAX_SYSTEMS) <= mesh_ex_slots(0)); /* ex_counter(MAX_SYSTEMS) <= ex_slots(0) */
59 CHECK(mesh_ex_slots(MESH_MAX_SYSTEMS - 1) + MESH_EX_REGION_BYTES <= MESH_EX_BASE + MESH_EX_BYTES); /* ex_slots(MAX_SYSTEMS - 1) + EX_REGION_BYTES <= EX_BASE + EX_BYTES */
60 CHECK(mesh_prog_ext(MESH_PROG_SLOTS ) <= MESH_VIEW_HEAP); /* prog_ext(PROG_SLOTS as u32) <= VIEW_HEAP */
61 CHECK(mesh_member(MESH_MAX_SYSTEMS) <= MESH_SNAP_HOST); /* member(MAX_SYSTEMS) <= SNAP_HOST */
62 /* Every peer frame type, in id order: unique and dense (1..=32). */
63 for (size_t i = 0; i < MESH_FRAMES_LEN; i++) CHECK_U(MESH_FRAMES[i], i + 1);
64 /* regions_have_no_aliased_fields */
65 struct { const char *name; const mesh_field *f; size_t n; } regions[] = {
66 {"header", MESH_HEADER_FIELDS, MESH_HEADER_FIELDS_LEN}, {"extension", MESH_EXT_FIELDS, MESH_EXT_FIELDS_LEN},
67 {"host", MESH_HOST_FIELDS, MESH_HOST_FIELDS_LEN}, {"member", MESH_MEMBER_FIELDS, MESH_MEMBER_FIELDS_LEN},
68 {"link", MESH_LINK_FIELDS, MESH_LINK_FIELDS_LEN}, {"nic", MESH_NIC_FIELDS, MESH_NIC_FIELDS_LEN},
69 {"node", MESH_NODE_FIELDS, MESH_NODE_FIELDS_LEN}, {"node load", MESH_NODE_LOAD_FIELDS, MESH_NODE_LOAD_FIELDS_LEN},
70 {"member load", MESH_MLOAD_FIELDS, MESH_MLOAD_FIELDS_LEN}, {"program load", MESH_PLOAD_FIELDS, MESH_PLOAD_FIELDS_LEN},
71 {"control", MESH_CTL_FIELDS, MESH_CTL_FIELDS_LEN}, {"pipe", MESH_PIPE_FIELDS, MESH_PIPE_FIELDS_LEN},
72 {"fleet member", MESH_FMEMBER_FIELDS, MESH_FMEMBER_FIELDS_LEN},
73 };
74 for (size_t i = 0; i < sizeof regions / sizeof regions[0]; i++)
75 if (!CHECK(mesh_disjoint(regions[i].f, regions[i].n))) fprintf(stderr, "%s: two fields overlap\n", regions[i].name);
76 return mesh_check_done();
77}