optee进入和退出方式的设计模型

文摘   科技   2024-10-18 22:15   陕西  

1、进入和退出TEE的设计模型

透过事务看本质,本文以直接写答案的方式总结其模型,就不再贴具体的代码了。

进入TEE的方式有两种:

  • (1)在启动阶段,设置optee的启动地址(这是物理地址)到ELR_EL3后,然后ERET到TEE -(2)在runtime阶段(启动多核时也属于runtime阶段),将 thread_vector_table的offset(这里是虚拟地址)设置到ELR_EL3寄存器,然后ERET到TEE

退出TEE的方式有两种:

  • (1)optee调用smc主动切换出optee 在optee干完活后(boot阶段初始化完成),设置 func_id=TEESMC_OPTEED_RETURN_ENTRY_DONE后,调用smc切回到ATF; 在optee干完活后(runtime阶段thread结束),设置 func_id=TEESMC_OPTEED_RETURN_CALL_DONE后,调用smc切回到ATF; 在optee活没干完的情况下,(产生想给外系统处理的中断)触发FIQ 或 该thread需要调用RPC去REE拿相关资源时,设置 func_id=xxxx,然后调用smc切回到ATF;

  • (2)触发了target到EL3的异常/中断。

2、boot启动时进入TEE

4、runtime时进入TEE

thread_vector_table中定义了9个向量:但只实现了4个向量,其余的皆返回0:

  • vector_std_smc_entry :smc yield call的调用,一般用于GP API接口的调用

  • vector_fasts_mc_entry :smc fast call的调用,一般用于启动阶段、初始化阶段,对TEE的调用。fast call调用期间,所有中断都是MASK的。

  • vector_cpuon__entry :用于多核的启动

  • vector_cpu_off_entry

  • vector_cpu_resume_entry

  • vector_cpu_suspend_entry

  • vector_fiq_entry :ATF转发过来的中断。将进入本系统的中断处理函数

  • vector_system_off_entry

  • vector_system_reset_entry

4.1、vector_fast_smc_entry

4.2、vector_std_smc_entry

4.3、vector_cpu_on_entry

4.4、vector_fiq_entry

5、退出TEE的方法

(1)退出TEE的方法,一般都是赋上func_id后,然后调用smc主动切换出去。

  1. mov w1, w0

  2. ldr x0, =TEESMC_OPTEED_RETURN_CALL_DONE

  3. smc #0

  4. b . /* SMC should not return */

以下详细展开了主动退出TEE的方法。

  • TEESMC_OPTEED_RETURN_ENTRY_DONE  // boot阶段的退出、fast call的退出

  • TEESMC_OPTEED_RETURN_CALL_DONE // yield call的退出,RPC也使用这个funcid

  • TEESMC_OPTEED_RETURN_FIQ_DONE //FIQ退出

  • TEESMC_OPTEED_RETURN_ON_DONE // 多核启动时的退出

  • TEESMC_OPTEED_RETURN_RESUME_DONE //当前未使用

  • TEESMC_OPTEED_RETURN_SUSPEND_DONE //当前未使用

  • TEESMC_OPTEED_RETURN_OFF_DONE //当前未使用

  • TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE //当前未使用

  • TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE //当前未使用

(2)另外一种,就是产生了直接target到EL3的异常。



Arm精选
ARMv8/ARMv9架构、SOC架构、Trustzone/TEE安全、终端安全、SOC安全、ARM安全、ATF、OPTEE等
 最新文章