嵌入式开发论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 197|回复: 0

30. secure world对smc请求的处理------OP-TEE对fast smc请求的处理

[复制链接]

59

主题

64

帖子

255

积分

版主

Rank: 7Rank: 7Rank: 7

积分
255
发表于 2018-11-25 14:23:08 | 显示全部楼层 |阅读模式
  《29. secure world对smc请求的处理------monitor模式中的处理》一文中介绍了smc请求在monitor模式中的处理过程,在此过程中会在sm_from_nsec函数中对smc的类型进行判定。当判定结果为fast smc时会调用thread_vector_table.fast_smc_entry进行fast smc请求的处理。
  在sm_from_nsec中调用最终会调用到thread_vector_table向量表中的vector_fast_smc_entry函数来对fast smc进行处理。该函数使用汇编实现,定义在optee_os/core/arch/arm/kernel/thread_a32.S中,其内容如下:
  1. LOCAL_FUNC vector_fast_smc_entry , :
  2. UNWIND(        .fnstart)
  3. UNWIND(        .cantunwind)
  4.         push        {r0-r7}        //将r0~r7入栈
  5.         mov        r0, sp        //将栈地址赋值给r0
  6.         bl        thread_handle_fast_smc        //调用thread_handle_fast_smc进行处理,参数为r0中的数据
  7.         pop        {r1-r8}        //处理完成之后,执行出栈操作
  8.         ldr        r0, =TEESMC_OPTEED_RETURN_CALL_DONE         //r0存放fast smc处理操作的结果
  9.         smc        #0        //触发smc请求 切换到monitor模式,返回normal world中
  10.         b        .        /* SMC should not return */
  11. UNWIND(        .fnend)
  12. END_FUNC vector_fast_smc_entry

  13. void thread_handle_fast_smc(struct thread_smc_args *args)
  14. {
  15. /* 使用canaries原理检查栈空间是否存在溢出或者被破坏 */
  16.         thread_check_canaries();

  17. /* 调用thread_fast_smc_handler_ptr处理smc请求 */
  18.         thread_fast_smc_handler_ptr(args);
  19.         /* Fast handlers must not unmask any exceptions */
  20.         assert(thread_get_exceptions() == THREAD_EXCP_ALL);
  21. }
复制代码

  在OP-TEE启动的时候会执行init_handlers操作,该函数的主要作用是将真正的处理函数赋值给各种thread函数指针变量。关于init_handlers函数的调用和处理过程请查阅前期文章。thread_fast_smc_handler_ptr会被赋值成handlers->fast_smc,而在vxpress板级中handlers->fast_smc执行tee_entry_fast函数。该函数内容如下:
  1. void tee_entry_fast(struct thread_smc_args *args)
  2. {
  3.         switch (args->a0) {

  4.         /* Generic functions */
  5. /* 获取API被调用的次数,可以根据实际需求实现 */
  6.         case OPTEE_SMC_CALLS_COUNT:
  7.                 tee_entry_get_api_call_count(args);
  8.                 break;
  9. /* 获取OP-TEE API的UID值 */
  10.         case OPTEE_SMC_CALLS_UID:
  11.                 tee_entry_get_api_uuid(args);
  12.                 break;
  13. /* 获取OP-TEE中API的版本信息 */
  14.         case OPTEE_SMC_CALLS_REVISION:
  15.                 tee_entry_get_api_revision(args);
  16.                 break;
  17. /* 获取OP-TEE OS的UID值 */
  18.         case OPTEE_SMC_CALL_GET_OS_UUID:
  19.                 tee_entry_get_os_uuid(args);
  20.                 break;
  21. /* 获取OS的版本信息 */
  22.         case OPTEE_SMC_CALL_GET_OS_REVISION:
  23.                 tee_entry_get_os_revision(args);
  24.                 break;

  25.         /* OP-TEE specific SMC functions */
  26. /* 获取OP-TEE与驱动之间的共享内存配置信息 */
  27.         case OPTEE_SMC_GET_SHM_CONFIG:
  28.                 tee_entry_get_shm_config(args);
  29.                 break;
  30. /* 获取I2CC的互斥体信息 */
  31.         case OPTEE_SMC_L2CC_MUTEX:
  32.                 tee_entry_fastcall_l2cc_mutex(args);
  33.                 break;
  34. /* OP-TEE的capabilities信息 */
  35.         case OPTEE_SMC_EXCHANGE_CAPABILITIES:
  36.                 tee_entry_exchange_capabilities(args);
  37.                 break;
  38. /* 关闭OP-TEE与驱动的共享内存的cache */
  39.         case OPTEE_SMC_DISABLE_SHM_CACHE:
  40.                 tee_entry_disable_shm_cache(args);
  41.                 break;
  42. /* 使能OP-TEE与驱动之间共享内存的cache */
  43.         case OPTEE_SMC_ENABLE_SHM_CACHE:
  44.                 tee_entry_enable_shm_cache(args);
  45.                 break;
  46. /* 启动其他cortex的被使用 */
  47.         case OPTEE_SMC_BOOT_SECONDARY:
  48.                 tee_entry_boot_secondary(args);
  49.                 break;

  50.         default:
  51.                 args->a0 = OPTEE_SMC_RETURN_UNKNOWN_FUNCTION;
  52.                 break;
  53.         }
  54. }
复制代码

  从上面的函数可以看到,tee_entry_fast会根据不同的command ID来执行特定的操作。使用者也可以在此函数中添加自己需要fast smc实现的功能,只要在REE侧和OP-TEE中定义合法fast smc的command ID并实现具体操作就可以



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|TEE and Virtualization

GMT+8, 2019-5-25 20:05 , Processed in 0.118875 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表