【简介】
之前的帖子介绍了S32K3 安全启动的配置流程,以及依赖的key 管理,SMR配置的服务,还有最后一个依赖的服务CR 表的配置。CR表的配置主要用于配置启动应用核依赖的SMR的配置,以及如果校验失败执行的动作。
以下是对CR 表进行配置的代码,实现是通过HSE 的 HSE_SRV_ID_CORE_RESET_ENTRY_INSTALL 服务来进行配置的。
hseSrvResponse_t HseFrm_SecureBoot_InstallCoreResetEntry
(
const uint8_t entryIndex,
const hseCrEntry_t *pCrEntry
)
{
hseSrvResponse_t hseSrvResponse = 0xFFFFFFFF;
hseSrvDescriptor_t hseSrvDesc ;
hseSrvDescriptor_t* pHseSrvDesc = &hseSrvDesc;
hseCrEntryInstallSrv_t *pCrEntryInstallSrv = &(pHseSrvDesc->hseSrv.crEntryInstallReq);
MEMSET(pHseSrvDesc, 0, sizeof(hseSrvDescriptor_t));
pHseSrvDesc->srvId = HSE_SRV_ID_CORE_RESET_ENTRY_INSTALL;
pCrEntryInstallSrv->crEntryIndex = entryIndex;
pCrEntryInstallSrv->pCrEntry = (HOST_ADDR)hsePort_Mem_AddrHandler((HOST_ADDR)(pCrEntry));
hseSrvResponse = gHsePort_HseIf.reqApi( pHseSrvDesc , NULL );
return hseSrvResponse;
}以下是CR配置的数据结构说明:

以下代码是本地配置的CR表和SMR 启动依赖关系,在上一篇介绍SMR的配置信息时我么定义了三个SMR区域,这三个SMR区域和CR表可以进行关联。本地的CORE0 的启动依赖SMR0和SMR2 core1 的启动依赖SMR1 和 SMR2,只有校验区域验证通过后才会启动应用核。
const hseCrEntry_t gHseBootCfg_CrEntry_Core_0 =
{
.coreId = HSE_APP_CORE0,
.crSanction = HSE_CR_SANCTION_DIS_INDIV_KEYS,
.preBootSmrMap = (uint32_t)(BOOT_SMR_MAP(0) | BOOT_SMR_MAP(2)),
.pPassReset = SMR_0_ADDR,
.altPreBootSmrMap = 0U,
.pAltReset = 0U,
.postBootSmrMap = 0U,
.startOption = HSE_CR_AUTO_START,
.reserved0 = {0U},
.reserved1 = {0U},
};
const hseCrEntry_t gHseBootCfg_CrEntry_Core_1 =
{
.coreId = HSE_APP_CORE1,
.crSanction = HSE_CR_SANCTION_DIS_INDIV_KEYS,
.preBootSmrMap = (uint32_t)(BOOT_SMR_MAP(1) | BOOT_SMR_MAP(2)),
.pPassReset = SMR_1_ADDR,
.altPreBootSmrMap = 0U,
.pAltReset = 0U,
.postBootSmrMap = 0U,
.startOption = HSE_CR_AUTO_START,
.reserved0 = {0U},
.reserved1 = {0U},
};
Key/SMR/CR 配置完成后就可以组合起来验证Secure Boot 的功能了,启动成功后我们可以通过HSE的服务来获取当前的启动状态信息,可以该服务来获取对应的状态信息 。


本地通过该服务来获取core0 core1 的启动状态及SMR区域的验证结果。

获取的结果为三个SMR 都校验成功了,并且两个核也成功通过secure boot启动。
我要赚赏金
