ATF中bl32的启动方法

描述

ATF中bl32的启动

bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。

该段中的init成员会被初始化成opteed_setup函数,由此开始进入到OP-TEE OS的启动。整个流程如图下所示。

编译
bl32执行流程

1. opteed_setup函数

该函数是ATF启动OP-TEE的入口函数,该函数会

  • • 查找到OP-TEE镜像的信息、
  • • 检查OP-TEE的入口函数指针是否有效、
  • • 设置OP-TEE运行的上下文,
  • • 然后调用OP-TEE的入口函数,
  • • 开始执行OP-TEE的启动。

该函数的内容如下:

int32_t opteed_setup(void)

        {

            entry_point_info_t *optee_ep_info;

            uint32_t linear_id;

            linear_id = plat_my_core_pos();  //获取当前core的ID

            /* 获取bl32(OP-TEE)镜像的描述信息 */

            optee_ep_info = bl31_plat_get_next_image_ep_info(SECURE);

            if (! optee_ep_info) {

                WARN("No OPTEE provided by BL2 boot loader, Booting device"

                    " without OPTEE initialization. SMC's destined for OPTEE"

                    " will return SMC_UNKn");

                return 1;

            }

            /* 检查OP-TEE镜像指定的PC地址是否有效 */

            if (! optee_ep_info- >pc)

                return 1;

            opteed_rw = OPTEE_AARCH64;

            /* 初始化OP-TEE运行时CPU的smc上下文 */

            opteed_init_optee_ep_state(optee_ep_info,

                        opteed_rw,

                        optee_ep_info- >pc,

                        &opteed_sp_context[linear_id]);

            /* 使用opteed_init初始化bl32_init变量,以备在bl31中调用 */

            bl31_register_bl32_init(&opteed_init);

            return 0;

        }

2. opteed_init函数

该函数的地址会被赋值给bl32_init变量,在bl31_main函数中会被调用,主要用来完成启动OP-TEE的设置。该函数内容如下:

static int32_t opteed_init(void)

        {

            uint32_t linear_id = plat_my_core_pos();

            //获取core的执行上下文变量

            optee_context_t *optee_ctx = &opteed_sp_context[linear_id];

            entry_point_info_t *optee_entry_point;

            uint64_t rc;

            /* 获取OPTEE image的信息 */

            optee_entry_point = bl31_plat_get_next_image_ep_info(SECURE);

            assert(optee_entry_point);

            /* 使用optee image的entry point信息初始化CPU的上下文 */

            cm_init_my_context(optee_entry_point);

            /* 开始设置CPU参数,最终会调用opteed_enter_sp函数执行跳转到OP-TEE的操作 */

            rc = opteed_synchronous_sp_entry(optee_ctx);

            assert(rc ! = 0);

            return rc;

        }
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分