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主动切换出去。
mov w1, w0
ldr x0, =TEESMC_OPTEED_RETURN_CALL_DONE
smc #0
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的异常。