SGS TrustZone Debug SOP¶
Revision History¶
| Revision NO. | Description |
Data |
|---|---|---|
| 1.0 | Initial release | 06/25/2025 |
1. 概述¶
在使用TrustZone的系统中,针对IP(RIU bank/register),IMI,以及DRAM会有硬件等级的保护功能。本文提供这些硬件等级保护的调试方式。
一般最常遇到的问题是,在未开启TrustZone的系统中某个功能可以正常运作,而一旦TrustZone开启后功能就会出错,本文提供排查是否为TrustZone所导致的程序。
2. 相关硬件¶
-
TZSP(TrustZone Security Property):TZSP实现IP硬件等级的保护机制。本文介绍排查是否为非法访问IP register而造成的问题。
-
TZIMI(TrustZone Internal Memory Interface):TZIMI实现IMI硬件等级的保护机制。本文介绍排查是否为非法访问IMI而造成的问题。
-
TZEMI(TrustZone External Memory Interface):TZEMI实现DRAM硬件等级的保护机制。本文介绍排查是否为非法访问DRAM而造成的问题。
3. 问题排查流程¶
3.1. 排查流程图¶

3.2. 步骤说明¶
| 流程节点 | 节点说明 |
出口 | 需提供的分析数据 |
|---|---|---|---|
| A | 确认TZ开关 | B H | - |
| B | 检查UART Log是否有OPTEE的TZ IP打印消息 | C E | TZ access violation |
| C | 在没有OPTEE消息的情况下,可以用T32来查看bank/register | D | - |
| D | 分析bank/register是否有非法访问 | E H | TZ access violation |
| E | 分析非法访问的消息并交由IP owner排除问题 | F | - |
| F | 看是否能定位出非法访问的原因 | G I | - |
| G | 非法访问的特殊案例 | I | - |
| H | 非TZ IP的问题 | - | - |
| I | 修正错误并结案 | - | - |
4. 确认TrustZone是否开启¶
TrustZone是开启的开关在OTP_TZ是否有烧录。OTP_TZ默认值为0,即关闭。当OTP_TZ烧录为1时,即开启。可以通过OTP_TZ的mirror register bank 0x101F_30[9]来确认。在OTP_TZ=0的系统上,硬件及软件驱动程序都不会开启,则问题与TrustZone无关。
5. TZSP的问题排查¶
5.1 记录消息的RIU_DBG bank¶
当RIU host在RIU bank中的register出现非法访问时,TZSP会将相关消息记录在RIU bank所属的在RIU_DBG bank中,如下表:
| RIU bridge | RIU_DBG bank |
|---|---|
| DIG bridge | 0x1001 |
| CMD bridge | 0x1201 |
| ISP0 bridge | 0x1678 |
| PM bridge | 0x0001 |
5.2 RIU master的ID¶
发生非法访问的RIU host, 其在每个RIU bridge中的代码会被记录下来,如下表:
| RIU host | RIU bridge and corresponding ID |
|---|---|
| RISV | DIG/CMD/ISP0/PM:1 |
| CA7 | DIG/CMD/ISP0:2,PM:3 |
| CMDQ0 | DIG/CMD/ISP0:3 |
| CMDQ1 | DIG/CMD/ISP0:4 |
| VEN1 | DIG/CMD:5 |
| DBUS | DIG/CMD/ISP0/PM:7 |
5.3 RIU_DBG bank中的消息¶
- 执行非法访问的RIU master
- RIU_DBG bank 0x41[15:12]
- 每个RIU master的编号可由4.2的表来查询对应关系
- 非法访问是read或write
- read:IU_DBG bank 0x41[9], write:RIU_DBG bank 0x41[8]
- 非法访问的种类
- Error type1:RIU_DBG bank 0x41[11], Error type2:RIU_DBG bank 0x41[10]
- Error type1为NS RIU master存取S RIU bank
- Error type2为TZ相关的bank被非S-CPU访问
- 被非法访问的bank
- RIU_DBG bank 0x41[7:0] | 0x40[15:8]
- 被非法访问的地址
- RIU_DBG bank 0x40[7:1]
- 格式为16-bit RIU addr
5.4 OPTEE收到TZSP非法访问的打印消息¶
当OPTEE已经初始化完毕,下来发生的TZSP非法访问,会打印消息,如下图:

6. TZIMI的问题排查¶
6.1 记录消息的bank¶
当IMI client在IMI中出现非法访问时,TZIMI会将相关消息记录在(TZIMI bank 0x11DE)中
6.2 IMI client的ID¶
可由下列两个表格来查询代码与IMI client ID的对应关系
- IMI client table
- optee_os/core/drivers/sgs/tz/$(CHIP)/hal_tzimi.h中的enum imi_client
6.3 TZIMI bank中的消息¶
-
执行非法存取的IMI client
- bank 0x11DE_0x44,每一个bit代表一个IMI client,例如 bit[0]即代表client 0
- 每个IMI client的编号表如下, 可查询对应关系
RIU host RIU bridge and corresponding ID RISV DIG/CMD/ISP0/PM:1 CA7 DIG/CMD/ISP0:2,PM:3 CMDQ0 DIG/CMD/ISP0:3 CMDQ1 DIG/CMD/ISP0:4 VEN1 DIG/CMD:5 DBUS DIG/CMD/ISP0/PM:7 - 非法存取是read或write - bank 0x11DE_0x47[0],0为read,1为write - 被非法存取的region,0或1 - bank 0x11DE_0x47[2],0为region 0,1为region 1 - 非法存取的 IMI client的security属性,S或NS - bank 0x11DE_0x47[1],0为S,1为NS - 被非法存取的地址,此为IMI offset - bank 0x11DE_0x45~0x46,只会记录地址的前28 bits,后4 bits必为0 - 记录的地址 =(fail access addr - IMI base)& 0xFFFFFFF0 - 当存取超过IMI大小的地址时,TZIMI会拦截(先前没有TZIMI 的情况下,硬件会绕回),而此时记录fail的region为0
6.4 OPTEE收到TZIMI非法访问的打印消息¶
当OPTEE已经初始化完毕,下来发生的TZIMI非法访问,会打印消息,如下图:

7. TZEMI的问题排查¶
7.1 记录消息的bank¶
当MIU client在DRAM中出现非法访问时,TZEMI会将相关消息记录在(TZEMI bank 0x1618)中
7.2 MIU client的ID¶
可由下列两个表格来查询代码与MIU client ID的对应关系
- MIU client table
- optee_os/core/drivers/sgs/tz/$(CHIP)/hal_tzemi.h中的enum miu_wr_client或enum miu_rd_client
7.3 TZIMI bank中的消息¶
-
执行非法存取的MIU client
- write client:bank 0x1618_0x7A[8:0],read client:bank 0x1618_0x7B[8:0],bit[8:4]为group,bit[3:0]为group中的client
-
非法存取是 read或write
- write flag:bank 0x1618_0x7A[10],read flag:bank 0x1618_0x7B[10]
- 被非法存取的 region,0 ~ 16
- write region:bank 0x1618_0x7A[15:11],read region:bank 0x1618_7B[15:11]
- 非法存取的MIU client的security属性,S或NS
- write security:bank 0x1618_0x7A[9],read security:bank 0x1618_0x7B[9]
- 被非法存取的地址,此为 MIU offset
- write address:bank 0x1618_0x7C~0x7D,read address:bank 0x1618_0x7E~0x7F
- 此处记录的地址以32 bytes为单位
- 记录的地址 = (((fail access addr - MIU base) & 0xFFFFFFE0) >> 4)
- 当存取超过region 0大小的地址时,TZEMI 会拦截(先前没有TZEMI的情况下,硬件会绕回),而此时记录fail的region为0
7.4 OPTEE收到TZEMI非法访问的打印消息¶
当OPTEE已经初始化完毕,下来发生的TZEMI非法访问,会打印消息,如下图:

8. 非法访问的特殊案例¶
8.1 Case 1:U-Boot cache line prefetch issue¶
TZEMI 拦截到非法的存取,存取失败的消息为,Client 0x72为CPU,Region 0x1为TF-A,由NS-CPU进行非法读取,Address为0xFC47E/0xFC3FE/0xFC0D2/0xFC0D4/0xFC390/0xFC0D0...

- 原因
- 经debug后发现,一旦打开d-cache enable,就会立刻发生此消息,因此与cache有关系
- 这是因为d-cache enable后,CPU H/W就会自动进行cache line prefetch
- 而先前在执行TF-A时,CPU中已经有了TF-A的page table entry
- 解法
- 在U-Boot将TF-A的region设为non-cacheable,如此CPU H/W就不会自动进行cache line prefetch
8.2 Case 2:IMI access out-of-bound address issue¶
TZIMI拦截到非法的存取,存取失败消息为Read fail,Client 0x0为CPU,NS=0x1由NS-CPU进行非法读取,Region 0x0,Addr=0x0a3340由于此chip的IMI size为128KB,若addr大于128KB且region为0,此类型为越界存取

- 原因
- 关掉Linux VM后,仍会发生此状况,因此可知此问题发生在RTOS中
- MI及image pipeline都不会让CPU去存取IMI
- RTOS中的IMI的MMU属性为MEM_TYPE_MEMORY | MEM_TYPE_RW | MEM_TYPE_SECURE | MEM_TYPE_INIT_NORMAL,此为cacheable memory area
- 目前MMU page table设定单位为1MB,因此会超出IMI真实的大小
- 由于CPU在cache enable的情况下,H/W就会自动行进cache line prefetch,一旦对超出IMI 大小的地址prefetch,TZIMI就会发出错误消息
- 解法
- 修改RTOS中的IMI MMU属性,由MEM_TYPE_MEMORY改为MEM_TYPE_NON_CACHEABLE,如此CPU H/W就不会对IMI自动进行cache line prefetch