runtime_svc_init函數(shù)
該函數(shù)主要用來建立安全監(jiān)控模式調(diào)用處理函數(shù)的索引表,并執(zhí)行EL3中提供的服務(wù)項的初始化操作,獲取TEE OS的入口地址并賦值給bl32_init變量,以備啟動TEE OS。
而這些處理函數(shù)是通過DECLARE_RT_SVC宏定義被編譯到鏡像文件的rt_svc_descs段中的。
void runtime_svc_init(void)
{
int rc = 0, index, start_idx, end_idx;
/*判定rt_svc_descs段中service條數(shù)的是否超出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數(shù)組中的數(shù)據(jù)成-1,表示當(dāng)前所有的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建立對應(yīng)
關(guān)系 */
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();
}
/* 執(zhí)行當(dāng)前service的init的操作 */
if (service- >init) {
rc = service- >init();
if (rc) {
ERROR("Error initializing runtime service %sn",
service- >name);
continue;
}
}
/* 根據(jù)該service的call type以及start oen來確定唯一的index,并且將該service
中支持的所有call type生成唯一的標(biāo)識映射到同一個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 }
該宏中的各種參數(shù)說明如下:
- ? □ start_oen:該service的起始內(nèi)部編號;
- ? □ end.oen:該service的末尾編號;
- ? □ call_type:調(diào)用的smc的類型;
- ? □ name:該service的名字;
- ? □ init:該service在執(zhí)行之前需要被執(zhí)行的初始化操作;
- ? □ handle:當(dāng)觸發(fā)了call type的調(diào)用時調(diào)用的處理該請求的函數(shù)。
-
監(jiān)控
+關(guān)注
關(guān)注
6文章
2240瀏覽量
55390 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4346瀏覽量
63024 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9059
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于TF-A(ATF)固件的基本知識詳解
S32g如何在ATF中啟用安全啟動?
如何讓BL31的調(diào)試信息輸出到S32R45的uart?
BL31未在Kirkstone上加載的原因?
ATF啟動流程介紹
![<b class='flag-5'>ATF</b>啟動流程<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/AD/EE/wKgZomVDbbaAEWu4AAQ4p5VY664451.jpg)
ATF的啟動過程介紹
![<b class='flag-5'>ATF</b>的啟動過程<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/AC/D8/wKgaomVJ5oiAVyqCAARE1EfQ2uc433.jpg)
code層面 ATF中bl1的啟動
![code層面 <b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>1的啟動](https://file1.elecfans.com/web2/M00/AC/DB/wKgaomVJ69uAY4peAALjTJA6NFo855.jpg)
ATF中bl2的啟動
![<b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl</b>2的啟動](https://file1.elecfans.com/web2/M00/AE/A8/wKgZomVJ7RCAb8ygAAIWfxK47aU906.jpg)
ATF中如何用函數(shù)完成bl2的啟動
ATF中bl2到bl31的跳轉(zhuǎn)介紹
ATF中bl31的啟動
![<b class='flag-5'>ATF</b><b class='flag-5'>中</b><b class='flag-5'>bl31</b>的啟動](https://file1.elecfans.com/web2/M00/AC/DC/wKgaomVJ8KaAM_dEAAJ1Lv_7AeQ050.jpg)
psci接口規(guī)范介紹
bl31中的psci架構(gòu)介紹
![<b class='flag-5'>bl31</b><b class='flag-5'>中</b>的psci架構(gòu)<b class='flag-5'>介紹</b>](https://file1.elecfans.com/web2/M00/B2/B1/wKgaomVu7IKAHCo9AAIO3tTVm-Y546.jpg)
評論