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文章
2175瀏覽量
55096 -
函數
+關注
關注
3文章
4307瀏覽量
62433 -
宏定義
+關注
關注
0文章
50瀏覽量
9001
發布評論請先 登錄
相關推薦
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
ATF的啟動過程介紹
ATF的啟動過程根據ARMv8的運行模式(AArch32/AArch64)會有所不同,但基本一致。 在AArch32中是不會去加載bl31而是將EL3或者Monitor模式的運行代碼保存在bl
ATF中如何用函數完成bl2的啟動
bl31加載到內存中后會觸發安全監控模式調用(smc)將CPU權限轉交給bl31。 該函數的主要內容和相關注釋如下: ** void bl2
ATF中bl2到bl31的跳轉介紹
bl2到bl31的跳轉 在bl2_main函數中最終會調用smc(BL1_SMC_RUN_IMAGE,(unsigned long)next
ATF中bl31的啟動
如下: func bl31 _entrypoint /* el3初始化操作,該el3_ entrypoint _common函數在上面已經介紹過,其中runtime_ exceptions為 el3 runtime softwa
psci接口規范介紹
由于psci是由linux內核調用bl31中的安全服務,實現cpu電源管理功能的。因此其軟件架構包含三個部分: (1)內核與bl31之間的調用接口規范 (2)內核中的架構 (3)
bl31中的psci架構介紹
bl31中的psci架構 bl31為內核提供了一系列運行時服務,psci作為其標準運行時服務的一部分,通過宏DECLARE_RT_SVC注冊到系統中。其相應的定義如下: DECLARE
評論