ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_bkup_security.c
Go to the documentation of this file.
1
34
35#include <stdint.h>
36
37#include "ra8_attributes.h"
38#include "ra8_bkup.h"
39#include "ra8_bkup_internal.h"
40#include "ra8_bkup_regs.h"
41#include "ra8_check.h"
42#include "ra8_err.h"
44
45/* =============================================================================
46 * Internal helpers
47 * =============================================================================
48 */
49
71{
72 if ((addr & k_ra8_bkup_saba_align_mask) != 0U) {
74 }
75 if (addr > k_ra8_bkup_saba_max) {
77 }
78 return k_ra8_ok;
79}
80
102{
103 if ((cfg->bbfsar & ~k_ra8_bkup_bbfsar_mask_all) != 0U) {
105 }
107 RA8_RETURN_ON_ERROR(err, g_bkup_tag, "security_apply: saba bad");
109 RA8_RETURN_ON_ERROR(err, g_bkup_tag, "security_apply: pabas bad");
111 RA8_RETURN_ON_ERROR(err, g_bkup_tag, "security_apply: pabans bad");
112 return k_ra8_ok;
113}
114
115/* =============================================================================
116 * TrustZone partitioning
117 * =============================================================================
118 */
119
121{
122 RA8_CHECK_NULL_PTR(cfg, g_bkup_tag, "security cfg must not be nullptr");
123 const ra8_err_t v_err = internal_validate_security_cfg(cfg);
124 RA8_RETURN_ON_ERROR(v_err, g_bkup_tag, "security_apply: cfg bad");
125
126 /* BBFSAR / VBRSABAR / VBRPABARS / VBRPABARNS are security-attribution
127 * registers, so they sit behind PRC4 -- not the PRC1 that guards the rest
128 * of this block (HUM Ch 13.1 Table 13.1 p 521). */
130 {
131 /* HUM Ch 12.2.1 "BBFSAR : Battery Backup Function Security Attribute Register", p 500 */
132 *ra8_bkup_bbfsar() = (uint32_t)(cfg->bbfsar & k_ra8_bkup_bbfsar_mask_all);
133 /* HUM Ch 12.2.2 "VBRSABAR : VBATT Backup Register Security Attribute Boundary Address Register", p 502 */
134 *ra8_bkup_vbrsabar() = cfg->saba;
135 /* HUM Ch 12.2.3 "VBRPABARS : VBATT Backup Register Privilege Attribute Boundary Address Register for Secure Region", p 502 */
136 *ra8_bkup_vbrpabars() = cfg->pabas;
137 /* HUM Ch 12.2.4 "VBRPABARNS : VBATT Backup Register Privilege Attribute Boundary Address Register for Non-secure Region", p 503 */
138 *ra8_bkup_vbrpabarns() = cfg->pabans;
139 }
140 return k_ra8_ok;
141}
142
144{
145 RA8_CHECK_NULL_PTR(cfg, g_bkup_tag, "security cfg must not be nullptr");
146 /* HUM Ch 12.2.1 "BBFSAR : Battery Backup Function Security Attribute Register", p 500 */
147 cfg->bbfsar = (uint32_t)(*ra8_bkup_bbfsar() & k_ra8_bkup_bbfsar_mask_all);
148 /* HUM Ch 12.2.2 "VBRSABAR : VBATT Backup Register Security Attribute Boundary Address Register", p 502 */
149 cfg->saba = *ra8_bkup_vbrsabar();
150 /* HUM Ch 12.2.3 "VBRPABARS : VBATT Backup Register Privilege Attribute Boundary Address Register for Secure Region", p 502 */
151 cfg->pabas = *ra8_bkup_vbrpabars();
152 /* HUM Ch 12.2.4 "VBRPABARNS : VBATT Backup Register Privilege Attribute Boundary Address Register for Non-secure Region", p 503 */
153 cfg->pabans = *ra8_bkup_vbrpabarns();
154 return k_ra8_ok;
155}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
const char * g_bkup_tag
Log tag used for this driver's diagnostics.
Definition ra8_bkup.c:88
Battery Backup Function (VBATT) HAL driver – public API.
Cross-TU shared surface for the ra8_bkup driver split.
Battery Backup Function (VBATT / BAT*) register layout for the RA8D2.
@ k_ra8_bkup_saba_align_mask
Lower-5-bits-must-be-zero mask.
@ k_ra8_bkup_saba_max
Maximum boundary address (last 32-byte slot).
static volatile uint32_t * ra8_bkup_bbfsar(void)
Pointer to 32-bit BBFSAR (HUM Ch 12.2.1 p 500).
static volatile uint16_t * ra8_bkup_vbrsabar(void)
Pointer to 16-bit VBRSABAR (HUM Ch 12.2.2 p 502).
@ k_ra8_bkup_bbfsar_mask_all
All NONSEC bits.
static volatile uint16_t * ra8_bkup_vbrpabars(void)
Pointer to 16-bit VBRPABARS (HUM Ch 12.2.3 p 502).
static volatile uint16_t * ra8_bkup_vbrpabarns(void)
Pointer to 16-bit VBRPABARNS (HUM Ch 12.2.4 p 503).
ra8_err_t ra8_bkup_security_get(ra8_bkup_security_config_t *cfg)
Read back the four security partition registers.
static ra8_err_t internal_validate_security_cfg(const ra8_bkup_security_config_t *cfg)
Validate every field of an ra8_bkup_security_config_t.
static ra8_err_t internal_validate_boundary(uint16_t addr)
Validate one boundary-address register value.
ra8_err_t ra8_bkup_security_apply(const ra8_bkup_security_config_t *cfg)
Apply BBFSAR + VBRSABAR + VBRPABAR{S,NS} from one descriptor.
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Definition ra8_check.h:184
#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_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
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Scoped PRCR unlock helper.
#define RA8_PROTECTED_WRITE(unlock_val)
Scoped PRCR unlock block.
@ k_ra8_prcr_unlock_sar
RA8 prcr unlock sar.
BBFSAR + backup-register boundary descriptor.
Definition ra8_bkup.h:219
uint16_t pabans
VBRPABARNS.PABANS (32-byte aligned).
Definition ra8_bkup.h:223
uint16_t saba
VBRSABAR.SABA (32-byte aligned).
Definition ra8_bkup.h:221
uint32_t bbfsar
OR of k_ra8_bkup_bbfsar_mask_* bits.
Definition ra8_bkup.h:220
uint16_t pabas
VBRPABARS.PABAS (32-byte aligned).
Definition ra8_bkup.h:222