PSCI CPU 启动函数: psci_cpu_on() 解释
这段代码是 PSCI(Power State Coordination Interface)中的一个函数,名为 'psci_cpu_on()',用于启动一个处于关机状态的 CPU 核心。
函数 'psci_cpu_on()' 的作用是将指定的 CPU 核心软重置,然后设置该核心的 NS(Non-Secure)入口地址和上下文 ID,最后启动该核心,使其开始执行代码。
函数步骤:
- 验证参数: 函数首先对输入的参数进行验证,确保要启动的 CPU 核心编号合法。
- 设置 NS 入口地址和上下文 ID: 函数设置该核心的 NS 入口地址和上下文 ID,这些信息将在启动核心时被用来配置其安全状态。
- 等待核心进入 WFEI 状态: 函数等待该核心进入 WFEI(Wait For Event Interrupt)状态,即等待该核心处于空闲等待事件的状态,以保证安全地进行软重置。
- 软重置核心: 函数向 CRU(Clock and Reset Unit)寄存器写入指令,使该核心被软重置。
- 等待核心重新启动: 函数等待该核心再次进入 WFEI 状态,以确保核心已经重新启动。
- 设置安全入口地址和锁定标记: 函数设置该核心的安全入口地址和锁定标记。
- 发送启动事件: 函数通过 SEV(Send Event)指令向该核心发送事件,以使其开始执行安全代码。
返回值:
- PSCI_RET_SUCCESS (0): 启动操作成功。
- 其他错误码: 启动操作失败。
代码解释:
int psci_cpu_on(uint32_t core_idx, uint32_t entry,
uint32_t context_id)
{
bool wfei;
vaddr_t cru_base = (vaddr_t)phys_to_virt_io(CRU_BASE, CRU_SIZE);
vaddr_t isram_base = (vaddr_t)phys_to_virt_io(ISRAM_BASE, ISRAM_SIZE);
core_idx &= MPIDR_CPU_MASK;
if ((core_idx == 0) || (core_idx >= CFG_TEE_CORE_NB_CORE))
return PSCI_RET_INVALID_PARAMETERS;
DMSG('core_id: %' PRIu32, core_idx);
/* set secondary cores' NS entry addresses */
boot_set_core_ns_entry(core_idx, entry, context_id);
/* wait */
if (!core_held_in_reset(core_idx)) {
wfei = wait_core_wfe_i(core_idx);
if (!wfei) {
EMSG('Can't wait cpu%' PRIu32 ' wfei before softrst',
core_idx);
return PSCI_RET_DENIED;
}
}
/* soft reset core */
io_write32(cru_base + CRU_SOFTRST_CON(0), CORE_SOFT_RESET(core_idx));
dsb();
udelay(2);
/* soft release core */
io_write32(cru_base + CRU_SOFTRST_CON(0), CORE_SOFT_RELEASE(core_idx));
dsb();
/* wait */
wfei = wait_core_wfe_i(core_idx);
if (!wfei) {
EMSG('Can't wait cpu%' PRIu32 ' wfei after softrst', core_idx);
return PSCI_RET_DENIED;
}
/* set secondary secure entry address and lock tag */
io_write32(isram_base + BOOT_ADDR_OFFSET, TEE_LOAD_ADDR);
io_write32(isram_base + LOCK_ADDR_OFFSET, LOCK_TAG);
dsb();
sev();
dsb();
return PSCI_RET_SUCCESS;
}
代码说明:
cru_base: CRU 寄存器的基地址。isram_base: ISRAM(内部 SRAM)的基地址。boot_set_core_ns_entry(): 设置核心 NS 入口地址和上下文 ID 的函数。core_held_in_reset(): 检查核心是否处于重置状态的函数。wait_core_wfe_i(): 等待核心进入 WFEI 状态的函数。io_write32(): 向内存地址写入 32 位数据的函数。dsb(): 数据同步屏障指令,确保写入操作完成。udelay(): 延时函数。CORE_SOFT_RESET(): 软重置核心的 CRU 寄存器值。CORE_SOFT_RELEASE(): 释放核心的 CRU 寄存器值。TEE_LOAD_ADDR: 安全启动代码的地址。LOCK_TAG: 安全启动的锁定标记。sev(): 发送事件指令。
总结:
函数 'psci_cpu_on()' 是 PSCI 中用于启动 CPU 核心的重要函数,它通过软重置、设置入口地址和发送启动事件来完成启动操作。该函数的实现细节涉及到硬件架构和安全启动机制,需要深入了解 PSCI 规范和相关硬件文档才能完全理解。
原文地址: https://www.cveoy.top/t/topic/nmhw 著作权归作者所有。请勿转载和采集!