Arm架构非安全态向安全态发送SMC命令的流程正确性确认问询
Arm非安全侧SMC调用流程修正说明
原流程错误修正
- 非安全态EL1跳转EL2仅能使用
hvc指令,smc指令固定触发EL3级别的异常,无法跳转到EL2;若系统未部署非安全侧hypervisor,非安全EL1可直接调用smc进入EL3,无需经过EL2环节 - EL3始终处于安全态,不存在"EL3非安全态"的说法:世界切换由SCR_EL3寄存器的NS位控制,EL3作为安全世界最高特权级,接收非安全世界的
smc异常进入,返回非安全世界时将NS位置1后通过eret跳转即可,自身安全属性不会变化 - 非安全EL1返回EL0的特权级切换需使用
eret指令,普通ret仅用于同特权级的函数调用返回,无法完成特权级切换操作
空缺环节补全
原流程第4步(EL3安全态跳转安全EL1)使用eret指令:EL3先完成安全世界上下文配置,设置ELR_EL3为安全EL1的入口地址、SPSR_EL3配置为安全EL1的特权级状态、SCR_EL3.NS位设为0,随后执行eret完成跳转。
修正后完整流程(含非安全EL2部署场景)
- 非安全EL0 → 非安全EL1:执行
svc指令触发系统调用,陷入内核态 - 非安全EL1 → 非安全EL2:执行
hvc指令触发hypervisor调用,陷入EL2 - 非安全EL2 → EL3(安全态):执行
smc指令触发安全监视器调用,EL3接收异常进入 - EL3(安全态)→ 安全EL1:配置安全EL1上下文后执行
eret,跳转到TEE内核处理SMC请求 - 安全EL1 → EL3(安全态):SMC处理完成后执行
smc返回EL3,请求返回非安全世界 - EL3(安全态)→ 非安全EL2:配置非安全EL2上下文,SCR_EL3.NS位置1,执行
eret跳回非安全EL2 - 非安全EL2 → 非安全EL1:执行
eret返回非安全内核态 - 非安全EL1 → 非安全EL0:执行
eret返回用户态
内容的提问来源于stack exchange,提问作者sivandahan
相关产品推荐
相关产品推荐

