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文章
2204浏览量
55168 -
函数
+关注
关注
3文章
4327浏览量
62569 -
宏定义
+关注
关注
0文章
50浏览量
9005
发布评论请先 登录
相关推荐
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
评论