set_svc_retval(regs, tee_svc_do_call(regs, scf)) tee_svc_do_call // 跳转到optee os 中的 syscall entry /* Call the svc function */ ldr x16, [x19, #SC_REC_X1] blr x16 根据 scn 从 tee_svc_syscall_table 中找到入口函数。tee_svc_syscall_table定义如下 // core\arch\arm\tee\arch_svc.c static const struct syscall_entry tee_svc_syscall_table[] = { ///… SYSCALL_ENTRY(syscall_open_ta_session) ///… };
例子:
触发方式,linux终端输入以下命令
xtest 1011 TA_InvokeCommandEntryPoint //imx-optee-test\ta\rpc_test\ta_entry.c switch (nCommandID) { case TA_RPC_CMD_CRYPT_SHA256: return rpc_sha256(false, nParamTypes, pParams); // imx-optee-test\ta\rpc_test\ta_rpc.c rpc_call_cryp(sec_mem, nParamTypes, pParams, TA_CRYPT_CMD_SHA256); TEE_OpenTASession(&cryp_uuid, TEE_TIMEOUT_INFINITE, types, params, &cryp_session, &origin); 以上,在uta中打开另外一个 CRYPT pta。
总结:
最总会调用 tee_svc_do_call
来执行 tee_svc_syscall_table[scn]
中定义的函数。在真正执行tee_svc_syscall_table[scn]
之前会保存相关寄存器以便执行完成之后恢复到 userspace
,而且还需要将userspcae
中带入的数据拷贝到kernel space
供tee_svc_syscall_table[scn]
中的函数使用。