optee CA/TA flow

2024-02-17 10:36
文章标签 ca flow ta optee

本文主要是介绍optee CA/TA flow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

在这里插入图片描述
TEEC_InvokeCommand 为例

CA—normal world EL0

//imx-optee-client\libteec\src\tee_client_api.c
TEEC_InvokeCommandioctl(session->ctx->fd, TEE_IOC_INVOKE, &buf_data)

通过syscall陷入内核态driver

linux driver—normal world EL1

tee_ioctl  // drivers\tee\tee_core.ctee_ioctl_invokectx->teedev->desc->ops->invoke_funcoptee_invoke_func  // drivers\tee\optee\call.c// Does and SMC to OP-TEE in secure world // and handles eventual resulting Remote // Procedure Calls (RPC) from OP-TEE.// Returns return code from secure world, 0 is OKoptee_do_call_with_argoptee->invoke_fn  // get_invoke_funcoptee_smccc_smcarm_smccc_smc__arm_smccc_smcSMCCC SMCCC_SMCsmc #0  //同步异常陷入EL3,执行bl31的中断向量表

其中 ops->invoke_func 在 linux\drivers\tee\optee\core.c 中注册

static const struct tee_driver_ops optee_ops = {.get_version = optee_get_version,.open = optee_open,.release = optee_release,.open_session = optee_open_session,.close_session = optee_close_session,.invoke_func = optee_invoke_func,.cancel_req = optee_cancel_req,.shm_register = optee_shm_register,.shm_unregister = optee_shm_unregister,
};

bl31—EL3

https://blog.csdn.net/orlando19860122/article/details/117034843

// atf\bl31\aarch64\runtime_exceptions.S
sync_exception_aarch64 //从EL1跳转到EL3,即从低到高handle_sync_exceptionsmc_handler64// 根据x0计算出一个runtime service(opteed_smc_handler),然后跳转blr x15// el3_exit 函数最后调用 eret 从 el3 跳到 secure el1// 跳转到optee os的入口 fast_smc_entry、yield_smc_entryb el3_exit

https://blog.csdn.net/yiyueming/article/details/72885273

opteed_smc_handler------Runtime Service
opteed_smc_handler// 保存non sercure world contextcm_el1_sysregs_context_save(NON_SECURE);// Set appropriate entry for SMC.// fast_smc_entry or yield_smc_entrycm_set_elr_el3(SECURE, (uint64_t)&optee_vector_table->fast_smc_entry);cm_set_elr_el3(SECURE, (uint64_t)&optee_vector_table->yield_smc_entry);// 保存 sercure world contextcm_el1_sysregs_context_restore(SECURE)SMC_RET4 // 返回smc_handler64继续执行 b el3_exit

optee os—secure world EL1

std

vector_std_smc_entry  //  core\arch\arm\kernel\thread_optee_smc_a64.Sbl thread_handle_std_smc  // core\arch\arm\kernel\thread_optee_smc.cthread_alloc_and_run__thread_alloc_and_run(a0, a1, a2, a3, a4, a5, 0, 0,thread_std_smc_entry)//core\arch\arm\kernel\thread_optee_smc_a64.Sthread_std_smc_entry__thread_std_smc_entrystd_smc_entrycall_entry_stdtee_entry_std__tee_entry_std // core\tee\entry_std.ccase OPTEE_MSG_CMD_INVOKE_COMMAND:entry_invoke_command(arg, num_params)tee_ta_invoke_commandts_ctx->ops->enter_invoke_cmd(&sess->ts_sess, cmd)//core\kernel\user_ta.cuser_ta_enter_invoke_cmduser_ta_enter//sercure world os space->user space//返回到user space中 参数 entry_functhread_enter_user_modesmc #0

uta—secure world EL0

thread_enter_user_mode 从 sercure world os space(EL1、optee os)返回到sercure world user space(EL0、uta),返回地址是该函数的入参entry_func,TA_InvokeCommandEntryPoint,去执行uta的函数。执行完返回,最后调用 smc #0,触发异常,跳转到EL3。

bl31—EL3

异常进入EL3以后,我们知道之前退出EL3的时候sp_el3指向的是secure context,因此再进入EL3了,用到sp_el3就是指向secure context的。前面的执行流程相同,只是到了opteed_smc_handler函数,跳过了前面caller is secure的分支,因为我们是从secure的环境进入的,直接到了后面 switch(smc_fid) 的逻辑。

// atf\bl31\aarch64\runtime_exceptions.S
sync_exception_aarch64 //从EL1跳转到EL3,即从低到高handle_sync_exceptionsmc_handler64// 根据x0计算出一个runtime service(opteed_smc_handler),然后跳转blr x15// el3_exit 函数最后调用 eret 从 el3 跳到 secure el1b el3_exit

opteed_smc_handler------Runtime Service

opteed_smc_handler// Returning from OPTEEswitch (smc_fid) {//...case TEESMC_OPTEED_RETURN_CALL_DONE:assert(handle == cm_get_context(SECURE));cm_el1_sysregs_context_save(SECURE);/* Get a reference to the non-secure context */ns_cpu_context = cm_get_context(NON_SECURE);assert(ns_cpu_context);/* Restore non-secure state */cm_el1_sysregs_context_restore(NON_SECURE);cm_set_next_eret_context(NON_SECURE);//返回到b el3_exit,然后通过eret返回到REE侧的EL1SMC_RET4(ns_cpu_context, x1, x2, x3, x4);

由于从secure el1返回的时候,x0带的参数是TEESMC_OPTEED_RETURN_CALL_DONE,即smc_fid = TEESMC_OPTEED_RETURN_CALL_DONE。所以我们直接看这个分支的处理函数。

  • 首先保存了secure el1的sys寄存器,用于下次secure调用
  • 获取non-secure的context,这个在之前是保过的
    然后恢复non-secure el1的sys寄存器
  • 设置non-secure的context,用于下次non-secure的调用,注意这里会配置sp_el3寄存器,指向了non-secure context,也就是为什么在最开始,我们从non-secure调用下来,默认使用的是non-secure context,就是每次使用完毕以后,在这里都会设置一下,供下次使用。
  • 设置了non-secure context的前4个变量a0~a3为x1, x2, x3, x4。其实就是thread_handle_fast_smc调用结束后的x0, x1, x2, x3。现在算是把原本的值填回到了本来的位置。然后return返回。

返回后的位置是smc_handler64最后一行,最后smc_handler64通过el3_exit返回到了REE侧的EL1。后面列一下SMC中断退出后硬件做的一些事情的伪代码。可以看到硬件从spsr_el3恢复了PSTATE,说明了此时unmask了fiq和irq。

linux driver—normal world EL1

又回到了REE侧的EL1,我们上次走到这里还是只调用了一个smc #0,我们继续看arm_smccc_smc在调用smc以后的逻辑,即SMCCC的宏:

	.macro SMCCC instr\instr	#0  /* 执行instr参数的内容,即执行smc切换 */ldr	x4, [sp]  /* 切换返回,出栈操作,恢复现场 */stp	x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]stp	x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]ldr	x4, [sp, #8]cbz	x4, 1f /* no quirk structure */ldr	x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]cmp	x9, #ARM_SMCCC_QUIRK_QCOM_A6b.ne	1fstr	x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
1:	ret  //返回到 el0 继续执行.endm

根据SMC CALL CONVENTION规则,参数前8个是通过x0x7传递,第9个通过栈传递,现在我们看到的sp就是保存返回结果的结构体地址。我们从前面的分析知道,目前,OPTEE返回的结果保存在x0x3的寄存器里,所以我们看到后的操作就是把x0~x3的值写到保存结果的结构体,即struct arm_smccc_res res;

这篇关于optee CA/TA flow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/717508

相关文章

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试,然后在测试中遇到了一些问题,去寻找CTS源码(/cts/tests/tests/location/src/android/locat

Understanding the GitHub Flow

这里看下Github的入门介绍    --链接 GitHub Flow is a lightweight, branch-based workflow that supports teams and projects where deployments are made regularly. This guide explains how and why GitHub Flow works

Versioned Staged Flow-Sensitive Pointer Analysis

VSFS 1.Introduction2.Approach2.1.相关概念2.2.VSFS 3.Evaluation参考文献 1.Introduction 上一篇blog我介绍了目前flow-sensitive pointer analysis常用的SFS算法。相比IFDS-based方法,SFS显著通过稀疏分析提升了效率,但是其内部依旧有许多冗余计算,留下了很大优化空间。 以

Salt Function Flow:深度解析复杂网关编排的优势与实践

系列文章索引: Salt Function Flow 系列文章 在业务流程编排中,处理条件逻辑、并行任务、以及复杂的流程分支是常见的挑战。对于需要高度灵活性和扩展性的项目,Salt Function Flow 提供了强大的网关编排能力,使开发者能够轻松定义和管理复杂的业务流程。本文将深入探讨Salt Function Flow中的复杂网关编排功能,展示其如何通过排他网关、并行执行等功能应对复杂的

Salt Function Flow 系列文章

Salt Function Flow 是一款Java开发、轻量级、内存级的业务流程编排框架,旨在帮助开发者通过函数式编程的方式定义和管理复杂的业务流程。它以高效、灵活的流程处理为核心,适用于多种业务场景,从简单任务自动化到复杂业务逻辑处理。 系列文章: Salt Function Flow:深度研发经验的沉淀,打造轻量级高效流程编排框架 Salt Function Flow:深度解析复杂网关编排

openssl之数字证书签名,CA认证原理及详细操作

http://blog.sina.com.cn/s/blog_cfee55a70102wn3h.html openssl之数字证书签名,CA认证原理及详细操作   (2016-03-23 09:42:39) 转载▼ 标签:  rsa   ca认证   php签名   非对称加密技术 分类: 软件设计 1 公钥密码体系(Public-key Crypt

Kotlin 流 Flow

挂起函数可以异步地返回一个值,而对于返回多个值,可以使用流,使用 emit(x) 发射多个值, collect { } 来收集值。 默认 流是冷的,只有 收集(collect) 时才会执行。 1. 流的创建 flow {} 生成流,emit(x) 来发射值;xxx.asFlow() 集合转成Flow;flowOf(1, 2, 3) 生成固定值的流。 1.1 flow {} flow {}

CSS-标准文档流(Normal Flow)

目录 1 定义2 脱离文档流3 相对定位文章参考 1 定义 文档流中:内联元素默认从左到右流,遇到阻碍或者宽度不够自动换行,继续按照从左到右的方式布局。块级元素单独占据一行,并按照从上到下的方式布局。 2 脱离文档流 文档一旦脱离文档流,则元素不再按照文档流的排列方式进行排列,如块级元素脱离文档流后,该块级元素不再接着上个元素从上到下排列,而是成为第一个元素,从顶部开始排列

Salt Function Flow:深度研发经验的沉淀,打造轻量级高效流程编排框架

在开发者的世界里,业务流程编排是一个既复杂又关键的环节。如何高效地管理和编排这些流程,直接影响着系统的性能和可维护性。本次介绍一款基于大量研发实践经验而打造的流程编排框架——Salt Function Flow。它不仅轻量、强大,更是将多年实践中的最佳经验沉淀于其中,为开发者提供了一套经过验证的可靠解决方案。 为什么选择Salt Function Flow? 深厚的研发积淀 Salt Fun

CA证书说明与使用

一、CA证书说明 1、介绍 什么是CA? CA全称为Certificate Authority,可以翻译为证书颁发机构。主要功能为:证书发放、证书更新、证书撤销和证书验证。 什么是证书? 证书指数字证书。 数字证书又称为数字标识。其作用是对计算机网络交流中的信息和数据进行加密和解密保证信息和数据的机密性、完整性、可用性和不可抵赖性。 2、CA证书下发流程 图1 CA证书下发流程