您的位置:首页 > 其它

ATF EL3 Runtime Service

2017-06-06 17:08 316 查看
1. 介绍

什么叫运行时服务了?干了写啥?下面听我慢慢道来.

在正常世界和安全世界中执行的软件低于EL3的级别将使用安全监视器请求运行时服务呼叫(SMC)指令。

运行时服务的接口和操作在很大程度上取决于[SMCCC]中描述的概念和定义,特别是SMC功能ID,所有实体号码(OEN),快速和标准呼叫以及SMC32和SMC64调用约定。常见的运行时服务框架确保将SMC功能调度到其各自的服务的实现。

SMC 功能表示符号包含一个ONE字段, 见下图,具体可以参考SMCC手册中有所描述。快速调用不可中断,而标准调用可以抢占。 大多数所有者实

体仅分配了快速调用的范围,标准调用仅为受信任的操作系统提供程序保留。

Type        OEN        Service
Fast     0      ARM Architecture calls
Fast     1      CPU Service calls
Fast     2      SiP Service calls
Fast     3      OEM Service calls
Fast     4      Standard Service calls
Fast    5-47    Reserved for future use
Fast   48-49    Trusted Application calls
Fast   50-63    Trusted OS calls

Std     0- 1    Reserved for existing ARMv7 calls
Std     2-63    Trusted OS Standard Calls


EL3 运行时服务框架使用调用类型和 OEN 来标识每个 SMC 调用的特定处理程序。

2. 揭开神秘面纱

ARM 可信固件在源树中有一个 services 目录,每个拥有实体可以在其中放置其运行时服务的实现。 PSCI 实现位于 lib / psci 目录中。运行时服务源将需要包括 runtime_svc.h 头文件。

3. 注册运行时服务

使用
DECLARE_RT_SVC()
宏指定运行时服务服务的名称,所覆盖的OEN的范围,服务的类型和初始化和调用处理函数。

该宏用来在编译的时候将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 }

1. `_name` is used to identify the data structure declared by this macro, and is also used for diagnostic purposes
2. `_start` and `_end` values must be based on the `OEN_*` values defined in [`smcc_helpers.h`]
3. `_setup` is the initialization function with the `rt_svc_init` signature:
typedef int32_t (*rt_svc_init)(void);
4. _smch` is the SMC handler function with the `rt_svc_handle` signature:
typedef uint64_t (*rt_svc_handle)(
uint32_t smc_fid,
uint64_t x1, uint64_t x2,
uint64_t x3, uint64_t x4,
void *cookie,
void *handle,
uint64_t flags);

start_oen:该service的起始内部number

end.oen: 该service的末尾number

call_type: 调用的smc的类型

name: 该service的名字

init: 该service在执行之前需要被执行的初始化操作

handle: 当触发了call type的调用时调用的handle该请求的函数


在初始化期间,服务框架验证每个声明的服务,以确保满足以下条件:

1. _start OEN 不大于_end OEN

2. _end OEN 不超过最大 OEN 值(63)

3. _type 是 SMC_TYPE_FAST 或 SMC_TYPE_STD 之一

4. 指定了_setup 和_smch 例程

std_svc_setup.c 提供了注册运行时服务的示例:

/* 将标准服务注册到运行时服务*/
DECLARE_RT_SVC(
std_svc,
OEN_STD_START,
OEN_STD_END,
SMC_TYPE_FAST,
std_svc_setup,
std_svc_smc_handler
);


ps: 先写到这里把,有时间在接着写完成,并且持续更新
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  trustzone
相关文章推荐