ATF中bl32的啟動
bl31中的runtime_svc_init函數(shù)會初始化OP-TEE對應(yīng)的服務(wù),通過調(diào)用該服務(wù)項(xiàng)的初始化函數(shù)來完成OP-TEE的啟動。對于OP-TEE的服務(wù)項(xiàng)會通過DECLARE_RT_SVC宏在編譯時(shí)被存放到rt_svc_des段中。
該段中的init成員會被初始化成opteed_setup函數(shù),由此開始進(jìn)入到OP-TEE OS的啟動。整個(gè)流程如圖下所示。
bl32執(zhí)行流程
1. opteed_setup函數(shù)
該函數(shù)是ATF啟動OP-TEE的入口函數(shù),該函數(shù)會
- ? 查找到OP-TEE鏡像的信息、
- ? 檢查OP-TEE的入口函數(shù)指針是否有效、
- ? 設(shè)置OP-TEE運(yùn)行的上下文,
- ? 然后調(diào)用OP-TEE的入口函數(shù),
- ? 開始執(zhí)行OP-TEE的啟動。
該函數(shù)的內(nèi)容如下:
int32_t opteed_setup(void)
{
entry_point_info_t *optee_ep_info;
uint32_t linear_id;
linear_id = plat_my_core_pos(); //獲取當(dāng)前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運(yùn)行時(shí)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中調(diào)用 */
bl31_register_bl32_init(&opteed_init);
return 0;
}
2. opteed_init函數(shù)
該函數(shù)的地址會被賦值給bl32_init變量,在bl31_main函數(shù)中會被調(diào)用,主要用來完成啟動OP-TEE的設(shè)置。該函數(shù)內(nèi)容如下:
static int32_t opteed_init(void)
{
uint32_t linear_id = plat_my_core_pos();
//獲取core的執(zhí)行上下文變量
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);
/* 開始設(shè)置CPU參數(shù),最終會調(diào)用opteed_enter_sp函數(shù)執(zhí)行跳轉(zhuǎn)到OP-TEE的操作 */
rc = opteed_synchronous_sp_entry(optee_ctx);
assert(rc ! = 0);
return rc;
}
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62633 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32873
發(fā)布評論請先 登錄
相關(guān)推薦
評論