0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATF中bl31函数介绍与使用

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-07 16:23 次阅读

runtime_svc_init函数

该函数主要用来建立安全监控模式调用处理函数的索引表,并执行EL3中提供的服务项的初始化操作,获取TEE OS的入口地址并赋值给bl32_init变量,以备启动TEE OS。

而这些处理函数是通过DECLARE_RT_SVC宏定义被编译到镜像文件的rt_svc_descs段中的。

void runtime_svc_init(void)

        {

            int rc = 0, index, start_idx, end_idx;

            /*判定rt_svc_descs段中service条数的是否超出MAX_RT_SVCS条*/

            assert((RT_SVC_DESCS_END >= RT_SVC_DESCS_START) &&

                    (RT_SVC_DECS_NUM < MAX_RT_SVCS));

            if (RT_SVC_DECS_NUM == 0)

                return;

            /* 初始化t_svc_descs_indices数组中的数据成-1,表示当前所有的service无效*/

            memset(rt_svc_descs_indices, -1, sizeof(rt_svc_descs_indices));

            /*  获取第一条EL3  service在RAM中的起始地址,通过获取RT_SVC_DESCS_START的值来确定,

            该值在链接文件中有定义 */

            rt_svc_descs = (rt_svc_desc_t *) RT_SVC_DESCS_START;

            /*  遍历整个rt_svc_des段,将其call  type与rt_svc_descs_indices中的index建立对应

            关系 */

            for (index = 0; index < RT_SVC_DECS_NUM; index++) {

            rt_svc_desc_t *service = &rt_svc_descs[index];

                /* 判定在编译时注册的service是否有效 */

                rc = validate_rt_svc_desc(service);

                if (rc) {

                    ERROR("Invalid runtime service descriptor %pn",

                        (void *) service);

                    panic();

                }

                /* 执行当前service的init的操作 */

                if (service- >init) {

                    rc = service- >init();

                    if (rc) {

                    ERROR("Error initializing runtime service %sn",

                                  service- >name);

                        continue;

                    }

                }

                /*  根据该service的call  type以及start  oen来确定唯一的index,并且将该service

                中支持的所有call type生成唯一的标识映射到同一个index中 */

                start_idx = get_unique_oen(rt_svc_descs[index].start_oen,

                        service- >call_type);

                assert(start_idx < MAX_RT_SVCS);

                  end_idx = get_unique_oen(rt_svc_descs[index].end_oen,

                          service- >call_type);

                  assert(end_idx < MAX_RT_SVCS);

                  for (; start_idx <= end_idx; start_idx++)

                      rt_svc_descs_indices[start_idx] = index;

              }

          }

DECLARE_RT_SVC

该宏用来在编译时将EL3中的service编译进rt_svc_descs段中。该宏定义如下:

#define DECLARE_RT_SVC(_name, _start, _end, _type, _setup, _smch) 

            static const rt_svc_desc_t __svc_desc_ ## _name 

                __section("rt_svc_descs") __used = { 

                    .start_oen = _start, 

                    .end_oen = _end, 

                    .call_type = _type, 

                    .name = #_name, 

                    .init = _setup, 

                    .handle = _smch }

该宏中的各种参数说明如下:

  • • □ start_oen:该service的起始内部编号;
  • • □ end.oen:该service的末尾编号;
  • • □ call_type:调用的smc的类型;
  • • □ name:该service的名字;
  • • □ init:该service在执行之前需要被执行的初始化操作;
  • • □ handle:当触发了call type的调用时调用的处理该请求的函数。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 监控
    +关注

    关注

    6

    文章

    2204

    浏览量

    55168
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62569
  • 宏定义
    +关注

    关注

    0

    文章

    50

    浏览量

    9005
收藏 人收藏

    评论

    相关推荐

    关于TF-A(ATF)固件的基本知识详解

    ATF定义的启动模型ATF将镜像进行了划分,BL1 BL2属于启动引导镜像,BL3属于runtime镜像。
    发表于 06-15 16:57

    S32g如何在ATF启用安全启动?

    /cortexa53-wrs-linux/atf-s32g/2.5-r0/build/batman/release /bl2/bl2_main.o:在函数
    发表于 04-03 07:12

    如何让BL31的调试信息输出到S32R45的uart?

    我用“DEBUG=1”构建 ATF 映像,uart 可以显示 BL2 的调试信息,但没有显示 BL31 的调试信息。 为什么?BL2到BL31
    发表于 04-11 08:20

    BL31未在Kirkstone上加载的原因?

    imx8mm_evk.h 和 imx8mm_evk.c 的设置时,SPL 打印 do uart3,但它应该显示:注意:BL31:v2.6(发布
    发表于 04-19 11:00

    ATF启动流程介绍

    Boot Firmware,一般为Trusted Bootloader。 • BL31 - EL3 Runtime Firmware,一般为SML,管理SMC执行处理和中断,运行在secure
    的头像 发表于 11-02 17:51 1240次阅读
    <b class='flag-5'>ATF</b>启动流程<b class='flag-5'>介绍</b>

    ATF的启动过程介绍

    ATF的启动过程根据ARMv8的运行模式(AArch32/AArch64)会有所不同,但基本一致。 在AArch32是不会去加载bl31而是将EL3或者Monitor模式的运行代码保存在bl
    的头像 发表于 11-07 15:48 1269次阅读
    <b class='flag-5'>ATF</b>的启动过程<b class='flag-5'>介绍</b>

    code层面 ATFbl1的启动

    系统上电之后首先会运行ChipRom,之后会跳转到ATFbl1继续执行。bl1主要初始化CPU、设定异常向量、将bl2的镜像加载到安全R
    的头像 发表于 11-07 15:53 1051次阅读
    code层面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的启动

    ATFbl2的启动

    bl2_entrypoint函数最终会触发安全监控模式调用(smc) ,通知bl1将CPU的控制权限转交给bl31,然后执行bl31。 该
    的头像 发表于 11-07 15:59 801次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>2的启动

    ATF如何用函数完成bl2的启动

    bl31加载到内存后会触发安全监控模式调用(smc)将CPU权限转交给bl31。 该函数的主要内容和相关注释如下: ** void bl2
    的头像 发表于 11-07 16:04 693次阅读

    ATFbl2到bl31的跳转介绍

    bl2到bl31的跳转 在bl2_main函数中最终会调用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next
    的头像 发表于 11-07 16:09 948次阅读

    ATFbl31的启动

    如下: func bl31 _entrypoint /* el3初始化操作,该el3_ entrypoint _common函数在上面已经介绍过,其中runtime_ exceptions为 el3 runtime softwa
    的头像 发表于 11-07 16:13 1169次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl31</b>的启动

    ATFbl32的启动方法

    ATFbl32的启动 bl31的runtime_svc_init函数会初始化OP-TEE对应
    的头像 发表于 11-07 16:32 628次阅读
    <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>32的启动方法

    Bl31断处理流程概述

    aarch64架构,在每个异常等级下都包含了四张异常等级表。 bl31的异常向量表定义在runtime_exceptions.S,其与下图的定义一致
    的头像 发表于 11-07 17:43 623次阅读
    <b class='flag-5'>Bl31</b><b class='flag-5'>中</b>断处理流程概述

    psci接口规范介绍

    由于psci是由linux内核调用bl31的安全服务,实现cpu电源管理功能的。因此其软件架构包含三个部分: (1)内核与bl31之间的调用接口规范 (2)内核的架构 (3)
    的头像 发表于 12-05 16:53 922次阅读

    bl31的psci架构介绍

    bl31的psci架构 bl31为内核提供了一系列运行时服务,psci作为其标准运行时服务的一部分,通过宏DECLARE_RT_SVC注册到系统。其相应的定义如下: DECLARE
    的头像 发表于 12-05 17:33 1061次阅读
    <b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架构<b class='flag-5'>介绍</b>