bl31中的runtime_svc_init函数会初始化OP-TEE对应的服务,通过调用该服务项的初始化函数来完成OP-TEE的启动。对于OP-TEE的服务项会通过DECLARE_RT_SVC宏在编译时被存放到rt_svc_des段中。
该段中的init成员会被初始化成opteed_setup函数,由此开始进入到OP-TEE OS的启动。整个流程如图下所示。
bl32执行流程
该函数是ATF启动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;
}
该函数的地址会被赋值给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;
}
全部0条评论
快来发表一下你的评论吧 !