ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
reader_vmem.c
Go to the documentation of this file.
1
17
18#include <stddef.h>
19#include <stdint.h>
20#include <string.h>
21
22#include "ra8_err.h"
23#include "ra8_log.h"
24#include "ra8_vmem.h"
25#include "ra8_vsource.h"
27
45
58
60typedef enum : uint64_t {
61 k_rv_rng_seed = 0x9E3779B97F4A7C15ULL,
62} rv_seed_t;
63
65typedef enum : uint64_t {
67 ((uint64_t)READER_VMEM_MAX_BUDGET *
68 ((uint64_t)k_rv_frame_bytes + sizeof(ra8_vmem_frame_t) + sizeof(ra8_vmem_key_t))) +
69 ((uint64_t)k_rv_bucket_count * sizeof(int32_t)) +
70 ((uint64_t)k_rv_workspace_pads * (_Alignof(max_align_t) - 1U)),
72
73static_assert(READER_VMEM_MAX_BUDGET > 0U);
74static_assert(k_rv_workspace_storage_bytes <= SIZE_MAX);
75
77typedef struct {
79 alignas(max_align_t) uint8_t bytes[k_rv_workspace_storage_bytes];
81
88
90typedef struct {
91 uint32_t first;
92 uint32_t count;
94
96typedef struct {
97 uint64_t bytes;
98} rv_book_t;
99
111
112void ra8_log_emit_error(const char* tag, const char* message)
113{
114 priv_rv_diag("[ra8_log] ");
115 priv_rv_diag(tag);
116 priv_rv_diag(": ");
117 priv_rv_diag(message);
118 priv_rv_diag("\n");
119}
120
121void ra8_log_emit_error_val(const char* tag, const char* message, uint32_t value)
122{
123 priv_rv_diag("[ra8_log] ");
124 priv_rv_diag(tag);
125 priv_rv_diag(": ");
126 priv_rv_diag(message);
127 priv_rv_diag(" =");
128 priv_rv_diag_u64(value);
129 priv_rv_diag("\n");
130}
131
145RA8_INTERNAL static uint64_t internal_rng(uint64_t* state)
146{
147 uint64_t value = *state;
148 value ^= value << (uint32_t)k_rv_xs_shift_a;
149 value ^= value >> (uint32_t)k_rv_xs_shift_b;
150 value ^= value << (uint32_t)k_rv_xs_shift_c;
151 *state = value;
152 return value;
153}
154
170RA8_INTERNAL static uint32_t internal_below(uint64_t* state, uint32_t span)
171{
172 return (span == 0U) ? 0U : (uint32_t)(internal_rng(state) % (uint64_t)span);
173}
174
194internal_book_read(void* context, uint64_t offset, uint8_t* buffer, uint32_t length)
195{
196 const rv_book_t* book = (const rv_book_t*)context;
197 if (book == nullptr || buffer == nullptr) {
198 return k_ra8_err_null_ptr;
199 }
200 if (offset > book->bytes || (uint64_t)length > (book->bytes - offset)) {
202 }
203 for (uint32_t i = 0U; i < length; ++i) {
204 const uint64_t absolute = offset + i;
205 buffer[i] = (uint8_t)((absolute * (uint64_t)k_rv_fill_mul) >> (uint32_t)k_rv_fill_shift);
206 }
207 return k_ra8_ok;
208}
209
222{
223 uint32_t cursor = (uint32_t)k_rv_header_frames;
224 for (uint32_t chapter = 0U; chapter < (uint32_t)k_rv_chapters; ++chapter) {
225 const uint32_t count =
226 (uint32_t)k_rv_chap_min_fr + internal_below(&driver->rng, (uint32_t)k_rv_chap_span_fr);
227 driver->chapters[chapter] = (rv_chapter_t){.first = cursor, .count = count};
228 cursor += count;
229 }
230 driver->total_frames = cursor;
231}
232
246RA8_INTERNAL static void internal_touch(rv_driver_t* driver, uint32_t frame)
247{
248 const uint64_t offset = (uint64_t)frame * (uint64_t)k_rv_frame_bytes;
249 void* page = nullptr;
250 const ra8_err_t get = ra8_vmem_get(driver->vm, driver->object_id, offset, &page);
251 if (get == k_ra8_ok) {
252 if (ra8_vmem_put(driver->vm, page) != k_ra8_ok) {
253 driver->failed = true;
254 }
255 } else {
256 priv_rv_diag("vm_get(frame ");
257 priv_rv_diag_u64(frame);
258 priv_rv_diag(") failed: ");
259 priv_rv_diag_u64(get);
260 priv_rv_diag("\n");
261 driver->failed = true;
262 }
263 if (!priv_rv_trace_reference(driver->trace, driver->object_id, frame)) {
264 driver->failed = true;
265 }
266 ++driver->accesses;
267}
268
281{
282 for (uint32_t frame = 0U; frame < (uint32_t)k_rv_header_frames; ++frame) {
283 internal_touch(driver, frame);
284 }
285}
286
300{
301 for (uint32_t chapter = 0U; chapter < (uint32_t)k_rv_chapters; ++chapter) {
302 const rv_chapter_t extent = driver->chapters[chapter];
303 for (uint32_t index = 0U; index < extent.count; ++index) {
304 const uint32_t frame = extent.first + index;
305 internal_touch_header(driver);
306 internal_touch(driver, frame);
307 const bool glance =
308 internal_below(&driver->rng, (uint32_t)k_rv_pct_base) < (uint32_t)k_rv_backglance_pct;
309 if (glance && index > 0U) {
310 internal_touch(driver, frame - 1U);
311 }
312 }
313 }
314}
315
328{
329 for (uint32_t round = 0U; round < (uint32_t)k_rv_toc_rounds; ++round) {
330 internal_touch_header(driver);
331 const uint32_t index = internal_below(&driver->rng, (uint32_t)k_rv_chapters);
332 const rv_chapter_t extent = driver->chapters[index];
333 for (uint32_t page = 0U; page < (uint32_t)k_rv_toc_read_fr && page < extent.count; ++page) {
334 internal_touch(driver, extent.first + page);
335 }
336 }
337}
338
351{
352 uint32_t scan_at = (uint32_t)k_rv_header_frames + (uint32_t)k_rv_sr_hot_fr;
353 for (uint32_t round = 0U; round < (uint32_t)k_rv_sr_rounds; ++round) {
354 for (uint32_t pass = 0U; pass < (uint32_t)k_rv_sr_hot_pass; ++pass) {
355 for (uint32_t hot = 0U; hot < (uint32_t)k_rv_sr_hot_fr; ++hot) {
356 internal_touch(driver, (uint32_t)k_rv_header_frames + hot);
357 }
358 }
359 for (uint32_t scan = 0U; scan < (uint32_t)k_rv_sr_scan_fr; ++scan) {
360 const uint32_t span = driver->total_frames - (uint32_t)k_rv_header_frames;
361 const uint32_t frame = (uint32_t)k_rv_header_frames + ((scan_at + scan) % span);
362 internal_touch(driver, frame);
363 }
364 scan_at += (uint32_t)k_rv_sr_scan_fr;
365 }
366}
367
383RA8_INTERNAL static bool internal_parse_budget(const char* text, uint32_t* budget)
384{
385 if (text == nullptr || text[0] == '\0') {
386 return false;
387 }
388 uint64_t value = 0U;
389 for (size_t i = 0U; text[i] != '\0'; ++i) {
390 if (text[i] < '0' || text[i] > '9') {
391 return false;
392 }
393 const uint32_t digit = (uint32_t)(text[i] - '0');
394 if (value > ((UINT32_MAX - digit) / (uint32_t)k_rv_decimal_base)) {
395 return false;
396 }
397 value = (value * (uint32_t)k_rv_decimal_base) + digit;
398 }
399 if (value == 0U) {
400 return false;
401 }
402 *budget = (uint32_t)value;
403 return true;
404}
405
424 const rv_workspace_t* workspace,
425 uint32_t budget,
426 ra8_vsource_t* sources)
427{
428 const ra8_vmem_cfg_t config = {.frame_mem = workspace->frame_mem,
429 .frame_bytes = (uint32_t)k_rv_frame_bytes,
430 .frame_count = budget,
431 .meta = workspace->meta,
432 .keys = workspace->keys,
433 .buckets = workspace->buckets,
434 .bucket_count = (uint32_t)k_rv_bucket_count,
435 .loader = ra8_vsource_loader,
436 .loader_ctx = sources};
437 return ra8_vmem_init(vm, &config) == k_ra8_ok;
438}
439
452RA8_INTERNAL static void internal_report_rate(uint32_t hits, uint64_t accesses)
453{
454 uint64_t scaled = 0U;
455 if (accesses != 0U) {
456 scaled = (((uint64_t)hits * (uint64_t)k_rv_rate_scale) + (accesses / 2U)) / accesses;
457 }
458 priv_rv_diag_u64(scaled / (uint64_t)k_rv_pct_base);
459 priv_rv_diag(".");
460 const uint64_t fraction = scaled % (uint64_t)k_rv_pct_base;
461 if (fraction < (uint64_t)k_rv_decimal_base) {
462 priv_rv_diag("0");
463 }
464 priv_rv_diag_u64(fraction);
465}
466
484RA8_INTERNAL static void internal_report(const rv_driver_t* driver,
485 const rv_book_t* book,
486 uint32_t budget,
487 const char* trace_path,
488 uint32_t hits,
489 uint32_t misses,
490 uint32_t evictions)
491{
492 priv_rv_diag("reader_vmem: book=");
494 priv_rv_diag(" frames (");
495 priv_rv_diag_u64(book->bytes);
496 priv_rv_diag(" bytes), budget=");
497 priv_rv_diag_u64(budget);
498 priv_rv_diag(" frames\n accesses=");
499 priv_rv_diag_u64(driver->accesses);
500 priv_rv_diag(" trace=");
501 priv_rv_diag(trace_path);
502 priv_rv_diag("\n ra8_vmem SLRU: hits=");
503 priv_rv_diag_u64(hits);
504 priv_rv_diag(" misses=");
505 priv_rv_diag_u64(misses);
506 priv_rv_diag(" evictions=");
507 priv_rv_diag_u64(evictions);
508 priv_rv_diag(" hit_rate=");
509 internal_report_rate(hits, driver->accesses);
510 priv_rv_diag("%\n");
511}
512
525RA8_INTERNAL static void internal_report_workspace(uint32_t budget, const rv_workspace_need_t* need)
526{
527 priv_rv_diag("reader_vmem: budget ");
528 priv_rv_diag_u64(budget);
529 priv_rv_diag(" requires ");
531 priv_rv_diag(" workspace bytes; compiled max budget ");
533 priv_rv_diag(" provides ");
535 priv_rv_diag(" bytes\n");
536}
537
559RA8_INTERNAL static bool internal_prepare(uint32_t budget,
560 const rv_book_t* book,
561 rv_workspace_t* workspace,
562 ra8_vsource_t* sources,
564 uint32_t* object_id,
566{
567 if (!priv_rv_workspace_require(budget, need)) {
568 priv_rv_diag("reader_vmem: invalid workspace requirement\n");
569 return false;
570 }
571 if (budget > (uint32_t)READER_VMEM_MAX_BUDGET ||
572 need->total_bytes > sizeof(s_reader_workspace.bytes)) {
573 internal_report_workspace(budget, need);
574 return false;
575 }
577 sizeof(s_reader_workspace.bytes),
578 need,
579 workspace) ||
580 ra8_vsource_init(sources, objects, (uint32_t)k_rv_max_objs) != k_ra8_ok ||
581 ra8_vsource_add_paged(sources, internal_book_read, (void*)book, 0U, book->bytes, object_id) !=
582 k_ra8_ok) {
583 priv_rv_diag("reader_vmem: cache workspace/source setup failed\n");
584 return false;
585 }
586 return true;
587}
588
607RA8_INTERNAL static bool internal_execute(const char* trace_path, uint32_t budget)
608{
609 rv_driver_t driver = {.rng = (uint64_t)k_rv_rng_seed};
610 internal_layout_book(&driver);
611 const rv_book_t book = {
612 .bytes = (uint64_t)driver.total_frames * (uint64_t)k_rv_frame_bytes,
613 };
614 rv_workspace_t workspace = {};
615 rv_workspace_need_t need = {};
616 ra8_vsource_obj_t objects[k_rv_max_objs] = {};
617 ra8_vsource_t sources = {};
618 if (!internal_prepare(budget, &book, &workspace, &sources, objects, &driver.object_id, &need)) {
619 return false;
620 }
621 ra8_vmem_t vm = {};
622 if (!internal_vmem_setup(&vm, &workspace, budget, &sources)) {
623 priv_rv_diag("reader_vmem: vmem setup failed\n");
624 return false;
625 }
626 rv_trace_t trace = {};
627 if (!priv_rv_trace_begin(trace_path, &trace)) {
628 priv_rv_diag("reader_vmem: cannot open trace file ");
629 priv_rv_diag(trace_path);
630 priv_rv_diag("\n");
631 return false;
632 }
633 driver.vm = &vm;
634 driver.trace = &trace;
635 internal_phase_linear(&driver);
636 internal_phase_toc(&driver);
637 internal_phase_scan(&driver);
638 uint32_t hits = 0U;
639 uint32_t misses = 0U;
640 uint32_t evictions = 0U;
641 const bool stats_ok = ra8_vmem_stats(&vm, &hits, &misses, &evictions) == k_ra8_ok;
642 const bool run_ok = !driver.failed && stats_ok;
643 if (!run_ok || !priv_rv_trace_commit(&trace)) {
644 priv_rv_trace_abort(&trace);
645 priv_rv_diag("reader_vmem: trace generation failed\n");
646 return false;
647 }
648 internal_report(&driver, &book, budget, trace_path, hits, misses, evictions);
649 return true;
650}
651
663{
664 priv_rv_diag("usage: reader_vmem [TRACE [FRAME_BUDGET]]\n");
665 priv_rv_diag("compiled maximum frame budget: ");
667 priv_rv_diag("\n");
668}
669
670int main(int argc, char** argv)
671{
672 if (argc > 3 || (argc > 1 && strcmp(argv[1], "--help") == 0)) {
674 return (argc > 3) ? 2 : 0;
675 }
676 const char* trace_path = (argc > 1) ? argv[1] : "reader_vmem.trace";
677 uint32_t budget = (uint32_t)k_rv_def_budget;
678 if (argc > 2 && !internal_parse_budget(argv[2], &budget)) {
680 return 2;
681 }
682 return internal_execute(trace_path, budget) ? 0 : 1;
683}
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Error Code Definitions for ra8-firmware.
@ k_ra8_err_out_of_range
Sensor or peripheral output out of valid range.
Definition ra8_err.h:337
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_null_ptr
Pointer was NULL where a valid pointer was required.
Definition ra8_err.h:478
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
int strcmp(const char *s1, const char *s2)
Compare two null-terminated strings.
Lightweight Logging Interface for ra8-firmware.
Byte-range page cache with SLRU eviction (Layer 2, #147).
ra8_err_t ra8_vmem_put(ra8_vmem_t *vm, void *page)
Release one pin on a frame previously returned by ra8_vmem_get.
Definition ra8_vmem.c:179
ra8_err_t ra8_vmem_get(ra8_vmem_t *vm, uint32_t object_id, uint64_t offset, void **out_page)
Get (and pin) the frame holding object object_id at offset.
Definition ra8_vmem.c:162
ra8_err_t ra8_vmem_init(ra8_vmem_t *vm, const ra8_vmem_cfg_t *cfg)
Initialise a page cache over caller-supplied storage.
Definition ra8_vmem.c:131
ra8_err_t ra8_vmem_stats(const ra8_vmem_t *vm, uint32_t *out_hits, uint32_t *out_misses, uint32_t *out_evictions)
Report the cache hit / miss / eviction counters.
Definition ra8_vmem.c:199
ra8_keycache_cell_t ra8_vmem_frame_t
Per-frame cache metadata (one caller-owned array entry per frame).
Definition ra8_vmem.h:122
Virtual-memory object sources – the page-cache storage seam (Layer 1, #147).
ra8_err_t ra8_vsource_loader(void *ctx, uint32_t object_id, uint64_t offset, uint8_t *frame, uint32_t frame_bytes)
Fill a page frame from an object – the ra8_vmem_loader_fn adapter.
Definition ra8_vsource.c:84
ra8_err_t ra8_vsource_add_paged(ra8_vsource_t *vs, ra8_vsource_read_fn read, void *ctx, uint64_t base, uint64_t size, uint32_t *out_id)
Register a storage-paged object; returns its object_id.
Definition ra8_vsource.c:42
ra8_err_t ra8_vsource_init(ra8_vsource_t *vs, ra8_vsource_obj_t *objs, uint32_t cap)
Initialise an empty source registry over a caller-owned object array.
Definition ra8_vsource.c:29
static uint64_t internal_rng(uint64_t *state)
Advance the driver's fixed-seed xorshift generator.
static void internal_report_rate(uint32_t hits, uint64_t accesses)
Print an integer percentage rounded to two fractional digits.
static void internal_report(const rv_driver_t *driver, const rv_book_t *book, uint32_t budget, const char *trace_path, uint32_t hits, uint32_t misses, uint32_t evictions)
Report the firmware cache counters in the legacy CLI format.
int main(int argc, char **argv)
rv_dimension_t
Book and workload model dimensions.
Definition reader_vmem.c:29
@ k_rv_toc_rounds
TOC jump rounds.
Definition reader_vmem.c:35
@ k_rv_pct_base
Percentage denominator.
Definition reader_vmem.c:41
@ k_rv_chap_span_fr
Random chapter-size span.
Definition reader_vmem.c:33
@ k_rv_chapters
Synthetic chapter count.
Definition reader_vmem.c:31
@ k_rv_chap_min_fr
Minimum frames per chapter.
Definition reader_vmem.c:32
@ k_rv_header_frames
Persistent header frames.
Definition reader_vmem.c:30
@ k_rv_def_budget
Default cache-frame budget.
Definition reader_vmem.c:42
@ k_rv_backglance_pct
Prior-page glance percent.
Definition reader_vmem.c:34
@ k_rv_max_objs
Source registry capacity.
Definition reader_vmem.c:43
@ k_rv_sr_hot_pass
Hot-set passes per round.
Definition reader_vmem.c:38
@ k_rv_sr_hot_fr
Hot-set frame count.
Definition reader_vmem.c:39
@ k_rv_sr_scan_fr
Scan frames per round.
Definition reader_vmem.c:40
@ k_rv_sr_rounds
Scan-resistance rounds.
Definition reader_vmem.c:37
@ k_rv_toc_read_fr
Frames read after a TOC jump.
Definition reader_vmem.c:36
static void internal_phase_scan(rv_driver_t *driver)
Run hot-set rereads interleaved with one-shot scan floods.
static bool internal_parse_budget(const char *text, uint32_t *budget)
Parse one strict non-zero decimal frame budget.
static rv_workspace_storage_t s_reader_workspace
Composition-root BSS cache memory, never used by reusable libraries.
Definition reader_vmem.c:87
static ra8_err_t internal_book_read(void *context, uint64_t offset, uint8_t *buffer, uint32_t length)
Generate exact synthetic source bytes directly at the read seam.
rv_constant_t
Deterministic generation and decimal constants.
Definition reader_vmem.c:47
@ k_rv_xs_shift_c
Third xorshift distance.
Definition reader_vmem.c:50
@ k_rv_rate_scale
Hundredths-percent scale.
Definition reader_vmem.c:54
@ k_rv_decimal_base
Decimal radix.
Definition reader_vmem.c:53
@ k_rv_workspace_pads
Maximum region padding count.
Definition reader_vmem.c:56
@ k_rv_xs_shift_a
First xorshift distance.
Definition reader_vmem.c:48
@ k_rv_fill_shift
Synthetic-byte shift.
Definition reader_vmem.c:52
@ k_rv_xs_shift_b
Second xorshift distance.
Definition reader_vmem.c:49
@ k_rv_fill_mul
Synthetic-byte multiplier.
Definition reader_vmem.c:51
@ k_rv_rate_digits
Printed fractional digits.
Definition reader_vmem.c:55
static bool internal_vmem_setup(ra8_vmem_t *vm, const rv_workspace_t *workspace, uint32_t budget, ra8_vsource_t *sources)
Initialise production vmem over already bound workspace views.
void ra8_log_emit_error(const char *tag, const char *message)
Emit an ERROR-level log line with only a tag and a message.
static bool internal_execute(const char *trace_path, uint32_t budget)
Execute one complete cache run and atomic trace transaction.
static bool internal_prepare(uint32_t budget, const rv_book_t *book, rv_workspace_t *workspace, ra8_vsource_t *sources, ra8_vsource_obj_t objects[k_rv_max_objs], uint32_t *object_id, rv_workspace_need_t *need)
Bind the workspace and register the generated book source.
static void internal_phase_linear(rv_driver_t *driver)
Run linear page-turns with hot furniture and back-glances.
static void internal_phase_toc(rv_driver_t *driver)
Run TOC-driven chapter jumps.
static void internal_layout_book(rv_driver_t *driver)
Lay out deterministic variable-size chapters.
static void internal_usage(void)
Print CLI usage and the explicit compiled cache ceiling.
void ra8_log_emit_error_val(const char *tag, const char *message, uint32_t value)
Emit an ERROR log line with a uint32_t companion value.
static void internal_touch(rv_driver_t *driver, uint32_t frame)
Access one production cache frame and append its trace record.
static uint32_t internal_below(uint64_t *state, uint32_t span)
Draw one deterministic value below a non-negative span.
rv_seed_t
Fixed deterministic RNG seed.
Definition reader_vmem.c:60
@ k_rv_rng_seed
Reproducible xorshift seed.
Definition reader_vmem.c:61
static void internal_touch_header(rv_driver_t *driver)
Re-reference the hot header and TOC region.
static void internal_report_workspace(uint32_t budget, const rv_workspace_need_t *need)
Report an exact compiled-workspace capacity failure.
rv_storage_size_t
Compile-time bytes reserved by the standalone composition root.
Definition reader_vmem.c:65
@ k_rv_workspace_storage_bytes
BSS bytes.
Definition reader_vmem.c:66
Private host sink and caller-owned workspace contracts for reader_vmem.
bool priv_rv_workspace_require(uint32_t budget, rv_workspace_need_t *need)
Query exact split-region requirements for one frame budget.
bool priv_rv_trace_reference(rv_trace_t *trace, uint32_t object_id, uint32_t frame)
Append one exact object/frame reference to a trace transaction.
void priv_rv_diag_u64(uint64_t value)
Write one unsigned decimal diagnostic without stdio.
void priv_rv_diag(const char *text)
Write one best-effort diagnostic fragment to standard error.
#define READER_VMEM_MAX_BUDGET
Maximum frames reserved by the standalone composition root.
bool priv_rv_trace_begin(const char *path, rv_trace_t *trace)
Begin one unpublished same-directory trace transaction.
@ k_rv_frame_bytes
Bytes per cache frame.
@ k_rv_bucket_count
Cache hash-bucket count.
void priv_rv_trace_abort(rv_trace_t *trace)
Close and unlink an unpublished trace.
bool priv_rv_trace_commit(rv_trace_t *trace)
Durably and atomically publish a complete trace.
bool priv_rv_workspace_bind(void *backing, size_t backing_bytes, const rv_workspace_need_t *need, rv_workspace_t *workspace)
Bind typed cache views into an aligned caller-owned backing.
Caller-supplied storage + loader for ra8_vmem_init.
Definition ra8_vmem.h:151
The (object_id, frame-aligned offset) key the page cache hashes on.
Definition ra8_vmem.h:136
Page-cache state (caller-owned; treat as private).
Definition ra8_vmem.h:179
One registered object's backing (paged or XIP).
Definition ra8_vsource.h:90
Object-source registry (caller-owned; treat as private).
Statelessly generated book extent.
Definition reader_vmem.c:96
uint64_t bytes
Total addressable synthetic bytes.
Definition reader_vmem.c:97
Per-chapter frame extent.
Definition reader_vmem.c:90
uint32_t first
First frame.
Definition reader_vmem.c:91
uint32_t count
Frame count.
Definition reader_vmem.c:92
Workload state shared by all navigation phases.
rv_chapter_t chapters[k_rv_chapters]
Deterministic chapter extents.
rv_trace_t * trace
Atomic raw-fd trace sink.
uint64_t rng
Xorshift state.
ra8_vmem_t * vm
Production cache instance.
uint32_t object_id
Registered book object.
uint32_t total_frames
Total synthetic book frames.
uint64_t accesses
References attempted.
bool failed
Sticky cache/trace failure.
Caller-owned atomic trace-publication state.
Exact byte regions required for one cache budget.
size_t total_bytes
Exact workspace high-water.
Explicit aligned storage owned only by this single-process CLI.
Definition reader_vmem.c:77
uint8_t bytes[k_rv_workspace_storage_bytes]
Cache workspace backing.
Definition reader_vmem.c:79
Typed views carved from a caller's workspace.
ra8_vmem_key_t * keys
Per-frame key storage.
ra8_vmem_frame_t * meta
Per-frame metadata.
uint8_t * frame_mem
Page-frame pool.
int32_t * buckets
Hash-bucket index heads.