optee CA/TA flow

news2024/12/25 1:00:45

在这里插入图片描述

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

CA—normal world EL0

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

通过syscall陷入内核态driver

linux driver—normal world EL1

tee_ioctl  // drivers\tee\tee_core.c
  tee_ioctl_invoke
    ctx->teedev->desc->ops->invoke_func
      optee_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 OK
        optee_do_call_with_arg
          optee->invoke_fn  // get_invoke_func
            optee_smccc_smc
              arm_smccc_smc
                __arm_smccc_smc
                  SMCCC SMCCC_SMC
                    smc #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_exception
    smc_handler64
      // 根据x0计算出一个runtime service(opteed_smc_handler),然后跳转
      blr x15
      // el3_exit 函数最后调用 eret 从 el3 跳到 secure el1
      // 跳转到optee os的入口 fast_smc_entry、yield_smc_entry
      b el3_exit

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

opteed_smc_handler------Runtime Service
opteed_smc_handler
  // 保存non sercure world context
  cm_el1_sysregs_context_save(NON_SECURE);

  // Set appropriate entry for SMC.
  // fast_smc_entry or yield_smc_entry
  cm_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 context
  cm_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.S
  bl thread_handle_std_smc  // core\arch\arm\kernel\thread_optee_smc.c
    thread_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.S
        thread_std_smc_entry
          __thread_std_smc_entry
            std_smc_entry
              call_entry_std
                tee_entry_std
                  __tee_entry_std // core\tee\entry_std.c
                    case OPTEE_MSG_CMD_INVOKE_COMMAND:
                      entry_invoke_command(arg, num_params)
                        tee_ta_invoke_command
                           ts_ctx->ops->enter_invoke_cmd(&sess->ts_sess, cmd)
                             //core\kernel\user_ta.c
                             user_ta_enter_invoke_cmd
                               user_ta_enter
                                 //sercure world os space->user space
                                 //返回到user space中 参数 entry_func
                                 thread_enter_user_mode
  smc #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_exception
    smc_handler64
      // 根据x0计算出一个runtime service(opteed_smc_handler),然后跳转
      blr x15
      // el3_exit 函数最后调用 eret 从 el3 跳到 secure el1
      b el3_exit

opteed_smc_handler------Runtime Service

opteed_smc_handler
  // Returning from OPTEE
  switch (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侧的EL1
      SMC_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_A6
	b.ne	1f
	str	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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1452105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一些方便的记录

如何在ubutun上安装qq 在QQ官网选择QQ Linux版本,然后选择X86下的deb类型文件进行下载 sudo dpkg -i linuxqq_3.2.5-21453_amd64.deb64 根据下载的版本不同对其进行更改 运行上述命令后显示应用程序可以看到安装后的QQ面板如何卸载安装在gnuradio的lora组件 - 进入…

php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)

可变函数 看可变函数的知识点之前,蒟蒻博主建议你先去看看php的可变变量,会更加方便理解,在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字(由函数命名规则可知该值必…

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2

Eclipse Version: 2023-03 (4.27.0) JDK19 Tomcat10.2

电子元器件基础5---二极管

除了电阻、电容和电感等线性元器件之外,还有二极管、三极管这些常用的非线性器件广泛应用于日常生活中。那么今天我们来介绍以下二极管这一常用的电子元器件。 一、二极管概念 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件 。二极管有两个电极,正极,又叫阳极;负…

07-k8s中secret资源02-玩转secret

一、回顾secret资源的简单实用 第一步:将想要的数据信息【key:value】中的value值,使用base64编码后,写入secret资源清单中; 第二步:创建secret资源; 第三步:pod资源引用secret资源&…

VMware Workstation 17.0 虚拟机安装MS-DOS 7.1完整详细步骤图文教程

VMware Workstation 17.0 虚拟机安装MS-DOS 7.1完整详细步骤图文教程 一、配置MS-DOS虚拟机机器环境二、安装MS-DOS磁盘操作系统 一、配置MS-DOS虚拟机机器环境 1.打开VMware Workstation Pro 2.新建虚拟机 3.建议选择【典型】,之后点击【下一步】 关于【自定义…

嵌入式Qt Qt中的信号处理

一.Qt中的信号处理 Qt消息模型: - Qt封装了具体操作系统的消息机制 - Qt遵循经典的GUI消息驱动事件模型 Qt中定义了与系统消息相关的概念; Qt中的消息处理机制: Qt的核心 QObject::cinnect函数: Qt中的“新”关键字: 实验1 初探…

[职场] 会计学专业学什么 #其他#知识分享#职场发展

会计学专业学什么 会计学专业属于工商管理学科下的一个二级学科,本专业培养具备财务、管理、经济、法律等方面的知识和能力,具有分析和解决财务、金融问题的基本能力,能在企、事业单位及政府部门从事会计实务以及教学、科研方面工作的工商管…

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。 本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板ATK-RK3568上的步骤。 主要是参考大佬博客: LVGL v8.2移植到IMX6ULL开发板_lvgl移植到linux-CSDN博客 一、环境 1、平台:rk3568 2、开发板:…

Java解决下降路径最小和

Java解决下降路径最小和 01 题目 给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列…

net6 core webapi部署到iis

1.設定發佈的選項 2.安裝Hosting Bundle .NET Core 託管捆綁包是 .NET Core 執行時期和ASP.NET Core 模組的安裝程式。該捆綁包允許 ASP.NET Core 應用程式與 IIS 一起運行。 3.設定網站

自动更改由VSCode调试器创建的默认launch.json文件

File -> Preference -> Settings 修改下面的部分

SpringCloud之Feign发送Http请求

文章目录 http客户端Feign使用步骤自定义Feign的配置Feign的性能优化Feign的性能优化-连接池配置 Feign的最佳实践 http客户端Feign Feign的介绍: Feign是一个声明式的http客户端,官方地址:https:/github.com/OpenFeign/feign 其作用就是帮助…

GPT-4对编程开发的支持

在编程开发领域,GPT-4凭借其强大的自然语言理解和代码生成能力,能够深刻理解开发者的意图,并基于这些需求提供精准的编程指导和解决方案。对于开发者来说,GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…

openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL

文章目录 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL220.1 操作步骤 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL 系统中有些SQL语句运行了很长时间还没有结束,这些语句会消耗很多的系统性能&…

Web项目利用MybatisPlus进行分页查询

之前在写博客系统前台页面的时候,遇到了利用mp进行分页查询的情况,由于涉及到的知识点相对较为重要,固写一篇博客以此巩固。 一、功能需求 在首页和分类页面都需要查询文章列表。 首页:查询所有的文章分类页面:查询…

网络原理-TCP_IP(6)

网络层 在复杂的网络环境中确定一个合适的路径. IP协议 与TCP协议并列,都是网络体系中最核心的协议. 基本概念 主机:配有IP地址,但是不进行路由控制的设备; 路由器:即配有IP地址,又能进行路由控制; 节点:主机和路由器的统称; 协议头格式 4位版本号(version):指定IP协议的版…

基于边缘计算的智能家居能源管理系统

一、项目背景 随着智能家居设备的普及,能源消耗问题日益凸显。为了更有效地管理家庭能源使用,减少浪费,并可能实现能源自给自足,我们提出了基于边缘计算的智能家居能源管理系统 该系统能够实时监控和分析家庭能源消耗数据&#xf…

java 线程安全介绍

所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改。总结java的内存模型,要解决两个主要的问题:可见性和有序性。 那么,何谓可见性? 多个线程之间是不能互相传递数据通信的,它们之间的沟通只能通过共享变量…

人工智能学习与实训笔记(一):零基础理解神经网络

目录 一、什么是神经网络模型 二、机器学习的类型 2.1 监督学习 2.2 无监督学习 2.3 半监督学习 2.4 强化学习 三、网络模型结构基础 3.1 单层网络 ​编辑 3.2 多层网络 3.3 非线性多层网络 四、 回归问题实操:使用Python和NumPy实现波士顿房价预测任务 一…