ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
reader_vmem_workspace.c
Go to the documentation of this file.
1
14
15#include <stddef.h>
16#include <stdint.h>
17
19
36RA8_INTERNAL static bool internal_size_mul(size_t left, size_t right, size_t* result)
37{
38 if (left != 0U && right > (SIZE_MAX / left)) {
39 return false;
40 }
41 *result = left * right;
42 return true;
43}
44
62RA8_INTERNAL static bool internal_region(size_t cursor, size_t bytes, size_t* offset, size_t* next)
63{
64 const size_t alignment = _Alignof(max_align_t);
65 const size_t remainder = cursor % alignment;
66 const size_t padding = (remainder == 0U) ? 0U : alignment - remainder;
67 if (cursor > (SIZE_MAX - padding) || (cursor + padding) > (SIZE_MAX - bytes)) {
68 return false;
69 }
70 *offset = cursor + padding;
71 *next = *offset + bytes;
72 return true;
73}
74
76{
77 if (budget == 0U || need == nullptr) {
78 return false;
79 }
80 rv_workspace_need_t result = {};
81 if (!internal_size_mul((size_t)budget, (size_t)k_rv_frame_bytes, &result.frame_bytes) ||
82 !internal_size_mul((size_t)budget, sizeof(ra8_vmem_frame_t), &result.meta_bytes) ||
83 !internal_size_mul((size_t)budget, sizeof(ra8_vmem_key_t), &result.key_bytes) ||
84 !internal_size_mul((size_t)k_rv_bucket_count, sizeof(int32_t), &result.bucket_bytes)) {
85 return false;
86 }
87 size_t cursor = 0U;
88 if (!internal_region(cursor, result.frame_bytes, &result.frame_offset, &cursor) ||
89 !internal_region(cursor, result.meta_bytes, &result.meta_offset, &cursor) ||
90 !internal_region(cursor, result.key_bytes, &result.key_offset, &cursor) ||
91 !internal_region(cursor, result.bucket_bytes, &result.bucket_offset, &cursor)) {
92 return false;
93 }
94 result.total_bytes = cursor;
95 *need = result;
96 return true;
97}
98
115RA8_INTERNAL static bool internal_region_valid(size_t offset, size_t bytes, size_t total)
116{
117 return (offset <= total) && (bytes <= (total - offset)) &&
118 ((offset % _Alignof(max_align_t)) == 0U);
119}
120
121bool priv_rv_workspace_bind(void* backing,
122 size_t backing_bytes,
123 const rv_workspace_need_t* need,
124 rv_workspace_t* workspace)
125{
126 if (backing == nullptr || need == nullptr || workspace == nullptr || need->total_bytes == 0U ||
127 need->total_bytes > backing_bytes || (((uintptr_t)backing % _Alignof(max_align_t)) != 0U) ||
132 return false;
133 }
134 if ((need->frame_offset + need->frame_bytes) > need->meta_offset ||
135 (need->meta_offset + need->meta_bytes) > need->key_offset ||
136 (need->key_offset + need->key_bytes) > need->bucket_offset) {
137 return false;
138 }
139 uint8_t* const bytes = (uint8_t*)backing;
140 *workspace = (rv_workspace_t){
141 .frame_mem = &bytes[need->frame_offset],
142 .meta = (ra8_vmem_frame_t*)&bytes[need->meta_offset],
143 .keys = (ra8_vmem_key_t*)&bytes[need->key_offset],
144 .buckets = (int32_t*)&bytes[need->bucket_offset],
145 };
146 return true;
147}
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
ra8_keycache_cell_t ra8_vmem_frame_t
Per-frame cache metadata (one caller-owned array entry per frame).
Definition ra8_vmem.h:122
Private host sink and caller-owned workspace contracts for reader_vmem.
@ k_rv_frame_bytes
Bytes per cache frame.
@ k_rv_bucket_count
Cache hash-bucket count.
static RA8_INTERNAL bool internal_region_valid(size_t offset, size_t bytes, size_t total)
Check one region lies wholly inside a workspace high-water.
bool priv_rv_workspace_require(uint32_t budget, rv_workspace_need_t *need)
Query exact split-region requirements for one frame budget.
static RA8_INTERNAL bool internal_size_mul(size_t left, size_t right, size_t *result)
Multiply two sizes without wrapping.
static RA8_INTERNAL bool internal_region(size_t cursor, size_t bytes, size_t *offset, size_t *next)
Place one maximally aligned region after a prior high-water.
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.
The (object_id, frame-aligned offset) key the page cache hashes on.
Definition ra8_vmem.h:136
Exact byte regions required for one cache budget.
size_t meta_offset
Metadata region offset.
size_t bucket_offset
Hash-bucket region offset.
size_t frame_bytes
Frame-pool region size.
size_t meta_bytes
Metadata region size.
size_t bucket_bytes
Hash-bucket region size.
size_t total_bytes
Exact workspace high-water.
size_t key_offset
Key region offset.
size_t frame_offset
Frame-pool region offset.
size_t key_bytes
Key region size.
Typed views carved from a caller's workspace.