27#ifdef RA8_ENABLE_ROOT_OF_TRUST
55typedef enum : uint32_t {
56 k_ra8_rot_ar_erased = 0xFFFFFFFFU,
72static uint32_t s_fake_ar_counter = (uint32_t)k_ra8_rot_ar_erased;
84static const char*
s_tag =
"ROLLBACK";
89 if (image_version < stored_min_version) {
107volatile bool g_ra8_rot_ar_probing =
false;
115volatile bool g_ra8_rot_ar_faulted =
false;
121typedef enum : uint32_t {
122 k_ra8_ar_cfsr_addr = 0xE000ED28U,
123 k_ra8_ar_thumb_hw_msk = 0x0000F800U,
124 k_ra8_ar_thumb32_min = 0x0000E800U,
129 if (exc_frame ==
nullptr || !g_ra8_rot_ar_probing) {
132 g_ra8_rot_ar_probing =
false;
133 g_ra8_rot_ar_faulted =
true;
138 const uint16_t instr = *(
const volatile uint16_t*)(uintptr_t)exc_frame[6];
140 ((instr & (uint16_t)k_ra8_ar_thumb_hw_msk) >= (uint16_t)k_ra8_ar_thumb32_min) ? 4U : 2U;
145 volatile uint32_t*
const cfsr = (
volatile uint32_t*)(uintptr_t)k_ra8_ar_cfsr_addr;
146 const uint32_t cfsr_sticky = *cfsr;
148 __asm__
volatile(
"dsb 0xF\n isb 0xF\n" :::
"memory");
179RA8_INTERNAL static uint32_t internal_probe_counter(
bool* out_blank)
181 g_ra8_rot_ar_faulted =
false;
182 g_ra8_rot_ar_probing =
true;
183 __asm__
volatile(
"dsb 0xF\n isb 0xF\n" :::
"memory");
185 __asm__
volatile(
"dsb 0xF\n isb 0xF\n" :::
"memory");
186 g_ra8_rot_ar_probing =
false;
187 *out_blank = g_ra8_rot_ar_faulted;
188 return g_ra8_rot_ar_faulted ? (uint32_t)k_ra8_rot_ar_erased : raw;
224 const uint32_t raw = s_fake_ar_counter;
227 const uint32_t raw = internal_probe_counter(&blank);
229 *out_min_version = (raw == (uint32_t)k_ra8_rot_ar_erased) ? 0U : raw;
263 const uint32_t raw = s_fake_ar_counter;
264 const bool blank =
false;
267 const uint32_t raw = internal_probe_counter(&blank);
269 const uint32_t stored = (raw == (uint32_t)k_ra8_rot_ar_erased) ? 0U : raw;
270 if (new_version <= stored) {
275 s_fake_ar_counter = new_version;
278 uint8_t le[
sizeof(uint32_t)] = {};
279 (void)
memcpy(le, &new_version,
sizeof(le));
308 .read = internal_default_store_read,
309 .commit = internal_default_store_commit,
313 uint32_t image_version)
320 uint32_t stored_min = 0U;
static const char * s_tag
Logging / check tag.
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_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
DFU anti-rollback (downgrade protection) policy + storage seam.
const ra8_rot_antirollback_store_t * ra8_rot_antirollback_default_store(void)
Return the non-faking default store (reports "not provisioned").
ra8_err_t ra8_rot_antirollback_verify(const ra8_rot_antirollback_store_t *store, uint32_t image_version)
Read the stored minimum, apply the policy, and commit on accept.
bool ra8_rot_antirollback_on_probe_fault(uint32_t *exc_frame)
Recover a fault-tolerant counter probe from the app fault handler.
ra8_err_t ra8_rot_antirollback_check(uint32_t image_version, uint32_t stored_min_version)
Pure downgrade policy: accept iff the image is not older than stored.
@ k_ra8_err_validation_failed
Validation rule failed (caller-supplied invariant not satisfied).
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Code MRAM + Extra MRAM + Option-Setting driver – core API.
ra8_err_t ra8_flash_extra_mram_write(uint32_t mram_addr, const uint8_t *src, uint32_t len)
Program 1..32 contiguous bytes into the general-purpose extra-MRAM window.
Flash / MRAM controller register layout for the Renesas RA8D2.
@ k_ra8_flash_extra_start
First legal Program target (FSBL setting).
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
#define ra8_log_error(tag, message)
RA8 log error.
Dependency-injection vtable for the non-volatile version counter.
ra8_rot_antirollback_read_fn_t read
Read stored highest-accepted version.
ra8_rot_antirollback_commit_fn_t commit
Persist the newly-accepted version.