From f446cf94e8bc12ba0482f8a22a122cfd047d7273 Mon Sep 17 00:00:00 2001 From: pete-lipeng Date: Sat, 9 Sep 2023 15:43:00 +0800 Subject: [PATCH 1/2] add tee guide Signed-off-by: pete-lipeng --- ...stee-new-platform-adaptation-guidelines.md | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md b/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md index 27c0053..62ac412 100644 --- a/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md +++ b/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md @@ -1,6 +1,6 @@ # OpenTrustee 新平台适配指南 -本章节介绍如何针对一款芯片适配OpenTrustee,包含TEE CLient、TEE Tzdriver、TEE Loader、TEE ATF的适配。 -## Tee Client的适配 +本章节介绍如何在新设备上使能OpenTrustee,目前OpenTrustee只支持运行在ARM TrustZone机制的芯片上,在新设备上使能OpenTrustee包含TEE CLient、Tzdriver、TEE Loader、ATF等部件的适配。 +## Tee Client适配 ### Tee Client使能实例 @@ -39,7 +39,7 @@ hdc file send libcadaemon.z.so /system/lib/ hdc file send tlogcat /system/bin/ ``` -## Tzdriver的适配和构建 +## Tzdriver适配 tzdriver是TEE的内核驱动,主要功能是在整个TEE子系统中起连接作用,是使用TEEOS服务的桥梁,tzdriver处理来自于tee\_client的ioctl命令,并通过smc指令从REE切换到TEE。 @@ -173,11 +173,8 @@ tzdriver部件跟随kernel一起编译,以rk3568为例,可以重编boot_linu ./build.sh --product-name rk3568 --ccache --build-target kernel --gn-args linux_kernel_version=\"linux-5.10\" ``` -## TEE 的适配指导 -芯片使能TEE时,需要对Loader和ATF进行适配。 - -### TEE Loader的适配 -TEE Loader主要负责加载安全镜像并将启动参数传递给TEEOS的功能。启动参数包含TEEOS用到的安全内存地址和大小,串口的地址,gic寄存器配置,以及其它拓展参数。 +## TEE Loader适配 +TEE Loader主要负责加载安全镜像并将启动参数传递给TEEOS。启动参数包含TEEOS用到的安全内存地址和大小,串口的地址,gic寄存器配置,以及其它拓展参数。 **表 2** 启动参数列表 @@ -339,14 +336,14 @@ uint64_t get_teeos_size(void) >![](public_sys-resources/icon-caution.gif) **注意:** 启动参数的适配方法可以按照产品的习惯要求采用不同的方法,例如结构体中直接填写相应的参数,或者增加配置文件的方法。启动参数也可以直接配置在TEEOS 中,以 RK3568 平台为例(详见 `base/tee/tee_os_kernel/kernel/arch/aarch64/plat/rk3568/machine.c`)。 -### TEE ATF适配指导 +## ATF适配 -- ARM从v6架构开始就引入了TrustZone技术,将AMR核的工作状态分为安全态和非安全态两种,在芯片级别对硬件资源提供保护和隔离。在实现了BL32(即安全OS)的平台,需要在ATF中添加SPD模块来实现安全世界和非安全世界的切换,对于TEEOS,我们提供了teed模块,位于 `base/tee/tee_os_framework/sample/teed`。**按照ATF的编译框架,在ATF根目录下的Makefile里面添加如下选项可以使能teed**。 +- ARM从v6架构开始就引入了TrustZone技术,将AMR核的工作状态分为安全态和非安全态两种,在芯片级别对硬件资源提供保护和隔离。在实现了BL32(即安全OS)的平台,需要在ATF中添加SPD模块来实现安全世界和非安全世界的切换,我们提供了teed模块示例代码,位于 `base/tee/tee_os_framework/sample/teed`。**按照ATF的编译框架,在ATF根目录下的Makefile里面添加如下选项可以使能teed**。 ```makefile SPD := teed ``` - 同时,TEEOS 需要适配 ATF 中的 teed,适配代码位于`base/tee/tee_os_kernel/kernel/arch/aarch64/trustzone/spd/teed`目录中,此代码开发者适配新平台时无需修改。 -- 另外,SMC在TEEOS中负责CA和TA的交互、ATF和TEE的交互,TEEOS的适配需要关注SMC通信参数。下表进行了具体介绍。 +- 另外,teed中支持的SMC交互指令如下。 **表 3** teed smc id管理列表 @@ -433,7 +430,7 @@ uint64_t get_teeos_size(void) #### 兼容opteed -对于无法修改ATF的单板,TEEOS提供了兼容opteed的方案,具体适配代码位于 `base/tee/tee_os_kernel/kernel/arch/aarch64/trustzone/spd/opteed` 目录中。 +有些单板的ATF中已经集成了opteed,对于这种情况,OpenTrustee提供了兼容opteed的方案,具体适配代码位于 `base/tee/tee_os_kernel/kernel/arch/aarch64/trustzone/spd/opteed` 目录中。 另外,若需要使能新的 TEED,可以在`spd`目录下添加相应 TEED 的适配代码,并且在 `base/tee/tee_os_kernel/config.mk` 中更新 CHCORE_SPD 配置. ```makefile -- Gitee From 90d047f8936fe892f0b98b91455adcce649d227f Mon Sep 17 00:00:00 2001 From: pete-lipeng Date: Mon, 11 Sep 2023 21:24:13 +0800 Subject: [PATCH 2/2] add tee guide Signed-off-by: pete-lipeng --- ...stee-new-platform-adaptation-guidelines.md | 203 ++++++++---------- 1 file changed, 88 insertions(+), 115 deletions(-) diff --git a/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md b/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md index 62ac412..cd12492 100644 --- a/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md +++ b/docs/opentrustee-guidelines/opentrustee-new-platform-adaptation-guidelines.md @@ -2,9 +2,9 @@ 本章节介绍如何在新设备上使能OpenTrustee,目前OpenTrustee只支持运行在ARM TrustZone机制的芯片上,在新设备上使能OpenTrustee包含TEE CLient、Tzdriver、TEE Loader、ATF等部件的适配。 ## Tee Client适配 -### Tee Client使能实例 +### Tee Client使能 -适配TEE Client,在相应配置json文件中增加tee_client部件即可。 +在一个新单板使能TEE Client,需要修改单板配置文件,增加TEE Client部件。 以RK3568芯片为例,在vendor/hihope/rk3568/config.json中增加以下内容: @@ -24,13 +24,16 @@ Tee Client代码位置:`base/tee/tee_client` -本模块支持单独编译,以RK3568芯片为例,运行以下命令编译TEE Client部件,产物路径:out/rk3568/tee/tee_client +本模块支持单独编译调试,以RK3568芯片为例,运行以下命令编译TEE Client部件: ```shell ./build.sh --product-name rk3568 --ccache --build-target tee_client ``` -单独编译的产物需要自行推入设备中。 +编译产物路径:out/rk3568/tee/tee_client + +可将编译产物自行推入设备中进行调试: + ```shell hdc file send cadaemon.json /system/profile/ hdc file send cadaemon.cfg /system/etc/init/ @@ -41,134 +44,104 @@ hdc file send tlogcat /system/bin/ ## Tzdriver适配 -tzdriver是TEE的内核驱动,主要功能是在整个TEE子系统中起连接作用,是使用TEEOS服务的桥梁,tzdriver处理来自于tee\_client的ioctl命令,并通过smc指令从REE切换到TEE。 - -### 适配指导以及适配实例 - -本章节中会讲述如何针对一款芯片适配tzdriver,此章节中以RK3568芯片为例。 - -Linux内核tzdriver代码位置:base/tee/tee\_tee\_tzdriver/linux。 - -tzdriver是内核中的一个字符设备驱动。tzdriver初始化时会创建一个字符设备文件,一般为/dev/tc\_ns\_client,用户态进程可以打开此节点,以及通过ioctl接口调用tzdriver相关功能。 - -#### 工程编译适配 - -tzdriver需要被编译到内核中作为内核驱动。 - -- Linux内核tzdriver编译适配 - - 在Linux内核可以通过defconfig文件中的CONFIG\_TZDRIVER选项控制tzdriver的编译使能。 - - 1. defconfig文件修改 - - defconfig文件在kernel/linux/config仓,每个芯片应当创建自己的defconfig文件,后面会介绍tzdriver中的所有defconfig配置项。 +Tzdriver是部署在REE侧的内核驱动,支持REE和TEE之间通信。Tzdriver处理来自于Tee Client的命令,并发送smc指令从REE切换到TEE。 - 2. kernel补丁 +Linux内核tzdriver代码位置:`base/tee/tee_tzdriver/linux` - 其他内核相关修改在kernel/linux/patches仓,以补丁方式提供。 +### Tzdriver使能 - RK3568芯片的patch在kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch,其他芯片平台也可以参考这个patch,每个芯片应该创建自己的patch文件。此patch补丁中应当包含以下内容: +1、修改linux内核代码仓中设备的defconfig文件,增加tzdriver的配置选项: - - 对于内核的根Makefile的修改(在其中引用tzdriver仓的子Makefile,其中tzdriver path需要修改为实际的相对路径,注意Linux kernel的编译是会将kernel仓代码拷贝到out目录打patch,因此这个相对路径是相对于out下的临时kernel仓的路径)。 - - ``` - obj-y += {tzdriver path} - ``` - - - 对于内核的根Kconfig的需改(在其中引用tzdriver仓的子Kconfig,其中tzdriver path需要修改为实际的相对路径,同上需要注意这个相对路径应当是在out目录下的临时kernel仓路径)。 +``` +# +# TEEOS +# +CONFIG_TZDRIVER=y +CONFIG_CPU_AFF_NR=1 +CONFIG_KERNEL_CLIENT=y +CONFIG_TEELOG=y +CONFIG_PAGES_MEM=y +CONFIG_THIRDPARTY_COMPATIBLE=y +``` - ``` - source "{tzdriver path}/Kconfig" - ``` +各选项其含义如下表所示: - - dtsi的修改:需要在相应芯片的disi文件中包含trusted\_core节点,对于RK3568芯片,需要修改patch中的/arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0.dtsi文件,新增以下内容 +**表 1** 配置选项说明 - ``` - /{ - trusted_core { - compatible = "trusted_core"; - interrupts = <0 73 4>; - }; - }; - ``` - 其中,Linux内核中tzdriver支持中断号的动态配置,上面的73为spi中断号 - >![](public_sys-resources/icon-caution.gif) **注意:** - >注意dtsi里面的spi中断号应该比实际的中断号小32,且需要保证不与其他组件的中断号冲突。 + + + + + + + + + + + + + + + + + + + + + + + +

参数

+

说明

+

CONFIG_TZDRIVER

+

模块开关,使能tzdriver必须打开

+

CONFIG_CPU_AFF_NR

+

CA绑核功能,非零值代表限制仅cpuid小于CONFIG_CPU_AFF_NR的CPU可以进入TEE,0代表无限制,当前只支持在0核运行,所以值为1

+

CONFIG_KERNEL_CLIENT

+

内核CA支持,默认建议开启

+

CONFIG_TEELOG

+

TEE日志开关,默认建议开启

+

CONFIG_PAGES_MEM

+

tlogger使用的内存类型,默认需要开启

+

CONFIG_THIRDPARTY_COMPATIBLE

+

兼容第三方opteed的适配,例如适配RK3568芯片需要开启此选项

+
+2、其他内核相关修改在kernel/linux/patches仓,以补丁方式提供。 -#### 驱动初始化 +RK3568芯片的patch在kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch,其他芯片平台也可以参考这个patch,每个芯片应该创建自己的patch文件。此patch补丁中应当包含以下内容: -- Linux内核中tzdriver驱动初始化方式 +- 对于内核的根Makefile的修改(在其中引用tzdriver仓的子Makefile,其中tzdriver path需要修改为实际的相对路径,注意Linux kernel的编译是会将kernel仓代码拷贝到out目录打patch,因此这个相对路径是相对于out下的临时kernel仓的路径)。 - 自动初始化,无需适配修改。 + ``` + obj-y += {tzdriver path} + ``` -#### 配置选项 +- 对于内核的根Kconfig的需改(在其中引用tzdriver仓的子Kconfig,其中tzdriver path需要修改为实际的相对路径,同上需要注意这个相对路径应当是在out目录下的临时kernel仓路径)。 -tzdriver有一些特性或者选项,可以选择配置,控制这些选项的地方如下: + ``` + source "{tzdriver path}/Kconfig" + ``` -- Linux内核tzdriver配置选项 +- dtsi的修改:需要在相应芯片的disi文件中包含trusted\_core节点,对于RK3568芯片,需要修改patch中的/arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0.dtsi文件,新增以下内容 - tzdriver选项应该写在kernel/linux/config仓,修改芯片的defconfig文件: + ``` + /{ + trusted_core { + compatible = "trusted_core"; + interrupts = <0 73 4>; + }; + }; + ``` - ``` - # - # TEEOS - # - CONFIG_TZDRIVER=y - CONFIG_CPU_AFF_NR=1 - CONFIG_KERNEL_CLIENT=y - CONFIG_TEELOG=y - CONFIG_PAGES_MEM=y - CONFIG_THIRDPARTY_COMPATIBLE=y - - ``` + 其中,Linux内核中tzdriver支持中断号的动态配置,上面的73为spi中断号 - 各选项其含义如下表所示: +>![](public_sys-resources/icon-caution.gif) **注意:** +>注意dtsi里面的spi中断号应该比实际的中断号小32,且需要保证不与其他组件的中断号冲突。 - **表 1** 配置选项说明 +### Tzdriver编译命令 - - - - - - - - - - - - - - - - - - - - - - - - -

参数

-

说明

-

CONFIG_TZDRIVER

-

模块开关,使能tzdriver必须打开

-

CONFIG_CPU_AFF_NR

-

CA绑核功能,非零值代表限制仅cpuid小于CONFIG_CPU_AFF_NR的CPU可以进入TEE,0代表无限制,当前只支持在0核运行,所以值为1

-

CONFIG_KERNEL_CLIENT

-

内核CA支持,默认建议开启

-

CONFIG_TEELOG

-

TEE日志开关,默认建议开启

-

CONFIG_PAGES_MEM

-

tlogger使用的内存类型,默认需要开启

-

CONFIG_THIRDPARTY_COMPATIBLE

-

兼容第三方opteed的适配,例如适配RK3568芯片需要开启此选项

-
- -### TEE Tzdriver编译命令 -tzdriver部件跟随kernel一起编译,以rk3568为例,可以重编boot_linux.img,编译命令如下 +Tzdriver部件跟随kernel一起编译,以rk3568为例,可以单独编译boot_linux.img,编译命令如下 ```Bash ./build.sh --product-name rk3568 --ccache --build-target kernel --gn-args linux_kernel_version=\"linux-5.10\" ``` @@ -338,7 +311,7 @@ uint64_t get_teeos_size(void) ## ATF适配 -- ARM从v6架构开始就引入了TrustZone技术,将AMR核的工作状态分为安全态和非安全态两种,在芯片级别对硬件资源提供保护和隔离。在实现了BL32(即安全OS)的平台,需要在ATF中添加SPD模块来实现安全世界和非安全世界的切换,我们提供了teed模块示例代码,位于 `base/tee/tee_os_framework/sample/teed`。**按照ATF的编译框架,在ATF根目录下的Makefile里面添加如下选项可以使能teed**。 +- ARM从v6架构开始就引入了TrustZone技术,将AMR核的工作状态分为安全态和非安全态两种,在芯片级别对硬件资源提供保护和隔离。在实现了BL32(即安全OS)的平台,需要在ATF中添加SPD模块来实现安全世界和非安全世界的切换,我们提供了teed模块示例代码,位于 `base/tee/tee_os_framework/sample/teed`。按照ATF的编译框架,在ATF根目录下的Makefile里面添加如下选项可以使能teed。 ```makefile SPD := teed ``` @@ -437,7 +410,7 @@ uint64_t get_teeos_size(void) CHCORE_SPD=new_teed ``` -## TEEOS镜像的构建指导 +## TEEOS镜像构建指导 以RK3568芯片为例,TEEOS的二进制文件(bl32.bin)被打包在uboot.img中,以下是构建TEEOS镜像的指导。 -- Gitee