ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_arena.c
Go to the documentation of this file.
1
15
16#include "ra8_arena.h"
17
18#include <stdint.h>
19
20#include "ra8_attributes.h"
21#include "ra8_check.h"
22#include "ra8_err.h"
23
25static const char* const s_tag = "ra8_arena";
26
48RA8_INTERNAL static bool internal_is_pow2(uint32_t v)
49{
50 if (v == 0U) {
51 return false;
52 }
53 return (v & (v - 1U)) == 0U;
54}
55
56ra8_err_t ra8_arena_init(ra8_arena_t* arena, void* base, uint32_t size)
57{
58 RA8_CHECK_NULL_PTR(arena, s_tag, "arena must not be nullptr");
59 RA8_CHECK_NULL_PTR(base, s_tag, "base must not be nullptr");
60 if (size == 0U) {
62 }
63 arena->base = (uint8_t*)base;
64 arena->size = size;
65 arena->used = 0U;
66 return k_ra8_ok;
67}
68
69ra8_err_t ra8_arena_carve(ra8_arena_t* arena, uint32_t bytes, uint32_t align, void** out_ptr)
70{
71 RA8_CHECK_NULL_PTR(arena, s_tag, "arena must not be nullptr");
72 RA8_CHECK_NULL_PTR(out_ptr, s_tag, "out_ptr must not be nullptr");
73 if (bytes == 0U) {
75 }
76 if (!internal_is_pow2(align)) {
78 }
79 const uintptr_t cur = (uintptr_t)arena->base + (uintptr_t)arena->used;
80 const uintptr_t mask = (uintptr_t)align - 1U;
81 const uintptr_t aligned = (cur + mask) & ~mask;
82 const uintptr_t end = (uintptr_t)arena->base + (uintptr_t)arena->size;
83 if (aligned > end) {
84 return k_ra8_err_no_mem;
85 }
86 if ((uintptr_t)bytes > (end - aligned)) {
87 return k_ra8_err_no_mem;
88 }
89 *out_ptr = (void*)aligned;
90 arena->used = (uint32_t)((aligned + (uintptr_t)bytes) - (uintptr_t)arena->base);
91 return k_ra8_ok;
92}
93
94ra8_err_t ra8_arena_remaining(const ra8_arena_t* arena, uint32_t* out_remaining)
95{
96 RA8_CHECK_NULL_PTR(arena, s_tag, "arena must not be nullptr");
97 RA8_CHECK_NULL_PTR(out_remaining, s_tag, "out_remaining must not be nullptr");
98 *out_remaining = arena->size - arena->used;
99 return k_ra8_ok;
100}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
static bool internal_is_pow2(uint32_t v)
Test whether v is a power of two.
Definition ra8_arena.c:48
ra8_err_t ra8_arena_carve(ra8_arena_t *arena, uint32_t bytes, uint32_t align, void **out_ptr)
Carve an aligned sub-block from the arena (bump; no free).
Definition ra8_arena.c:69
ra8_err_t ra8_arena_remaining(const ra8_arena_t *arena, uint32_t *out_remaining)
Report the bytes still available in the arena.
Definition ra8_arena.c:94
ra8_err_t ra8_arena_init(ra8_arena_t *arena, void *base, uint32_t size)
Bind a bump arena over a caller-owned tier region.
Definition ra8_arena.c:56
Init-time bump arena – carves per-tier slab backing, zero-heap.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_no_mem
Static buffer exhausted (no dynamic memory on this project).
Definition ra8_err.h:142
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_invalid_size
Invalid size parameter (too large, too small, or misaligned).
Definition ra8_err.h:167
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Caller-owned bump-arena state over one tier region.
Definition ra8_arena.h:56
uint32_t size
Region length in bytes.
Definition ra8_arena.h:58
uint8_t * base
First byte of the tier region.
Definition ra8_arena.h:57
uint32_t used
High-water mark (bytes carved so far).
Definition ra8_arena.h:59