IMX6UL EVK OP-TEE SET TZASC ENABLE
来源:互联网 发布:网络教育教学 编辑:程序博客网 时间:2024/06/11 21:04
一.准备工作
配置IMX6UL EVK平台并将OP-TEE移植到此平台中。
二.具体实现
1. 编写运行于linux非安全世界的地址访问程序,并将其放置到IMX6UL 文件系统/home/root路径下。
创建一个简单的程序test_mem.c,代码如下:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/mman.h>#define READ_REG32(reg) ( *((volatile int *) (reg)) ) #define ALLOC_SIZE (1024) static int read_type() { void * map_base; FILE *f; int type,fd; fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd) { printf("Success to open /dev/mem fd=%08x\n", fd); } else { printf("Fail to open /dev/mem fd=%08x\n", fd); } map_base = mmap(0, ALLOC_SIZE, PROT_READ, MAP_PRIVATE, fd, 0x9D010000); type = READ_REG32(map_base + 0x20); close(fd); munmap(map_base, ALLOC_SIZE); printf("reg32[%08x] = value[%08x] \n", map_base, type); type = (type & ( 1 << 27 )) >> 27 ; printf("reg32[%08x] = value[%08x] \n", map_base, type); return type; } void main(){ printf("test read lock memory-->\n"); read_type();}
这里简单使用了网上比较常见的物理内存访问方式,并使用arm-linux-gnueabihf-gcc交叉编译器进行编译,生成a.out文件,将其放置到文件系统/home/root路径下,用以测试内存是否成功锁定。
2. 检查ROM efuse的460[4]位(TZASC_ENABLE)是否设为1。
ROM efuse出厂默认是不加载TZASC module的,需要将如下几步将TZASC_ENABLE烧写为1:
(1)将BOOTMODE置为00,并将BOOTCFG及SW601设置为0000,这样将IMX6UL EVK设置为BOOT FROM FUSES模式,而出厂默认BT_FUSE_SEL为0,这也就是说可以对fuse进行编程。
(2)如(1)设置后,ROM将由Nor flash 启动,由于其中没有启动代码,将默认跳转到USB Download模式,可以将Bootloader下载到内存中,并可对fuse进行操作。
(3)使用Mfgtool2将u-boot.imx加载到内存RAM中,配置文件设置为:
<UCL> <CFG> <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/> </CFG> <LIST name="SDCard" desc="Choose SD Card as media"> <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot.imx" >Loading U-boot</CMD> <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD> </LIST></UCL>
(3)使用uboot命令,此命令将fuse 的0x460[28]即TZASC_ENABLE设置为1,也就是启动加载TZASC模块。
fuse prog 0 6 0x10000000
成功后显示效果如下:
3.检查tzasc时钟及IOMUXC_GPR_GPR9寄存器是否设为enable:
相关操作可以由静态TA完成,至于静态TA的编写不再累述,经检查IOMUXC_GPR_GPR9未被设置为enable,而TZASC时钟已经开启。注意:如果未将efuse中的TZASC_ENABLE设置为1,设置IOMUXC_GPR_GPR9将会导致内核崩溃。
4.编写tzasc驱动,配置寄存器初始值。
由于已经与u-boot中成功启动了TZASC1驱动,这里主要设置安全区的代码:
#include <drivers/imx_tzasc.h>#include <util.h>#include <io.h>#include <trace.h>#define TZASC_ACTION 0x004#define TZASC_LOCKDOWM_RANGE 0x008#define TZASC_LOCKDOWN_SELECT 0x00C#define TZASC_SPECULATION_CONTROL 0x030#define TZASC_SECURITY_INVERSION_EN 0x034#define TZASC_LOCK_RANGE_EN (1 << 31)#define TZASC_REGION_SETUP_LOW(n) (0x100 + (n) * 16)#define TZASC_REGION_SETUP_HIGH(n) (0x104 + (n) * 16)#define TZASC_REGION_ATTRIBUTES(n) (0x108 + (n) * 16) #define TZASC_REGION_0_ATTRIBUTE 0xF000003F#define TZASC_REGION_1_ATTRIBUTE 0xC0000031#define TZASC_REGION_1_BASE 0x9C000000#define TZASC_REGION_SET 0x1void imx_tzasc_init(vaddr_t base){ write32(TZASC_REGION_0_ATTRIBUTE, base + TZASC_REGION_ATTRIBUTES(0)); write32(TZASC_REGION_1_BASE, base + TZASC_REGION_SETUP_LOW(1)); write32(TZASC_REGION_1_ATTRIBUTE, base + TZASC_REGION_ATTRIBUTES(1));}void tzasc_region_set(struct tzasc_data *data, vaddr_t base){ uint32_t region_lock = (1 << data->region_num); write32(data->tzasc_region_base, base + TZASC_REGION_SETUP_LOW(data->region_num)); write32(data->tzasc_region_base + data->tzasc_region_size, base + TZASC_REGION_SETUP_HIGH(data->region_num)); write32(TZASC_LOCK_RANGE_EN | region_lock, base + TZASC_LOCKDOWM_RANGE);}
5.编写静态TA用以动态创建安全区。
三.测试
IMX6UL EVK重启加电后,进入普通世界命令行,运行处于/home/root路径下的a.out程序,进行测试,由于我们将此地址段配置为内存安全区,则会a.out程序进行地址映射将会产生数据中断,无法映射。测试结果如下:
- IMX6UL EVK OP-TEE SET TZASC ENABLE
- FSL i.MX6 UltraLite EVK OP-TEE的移植
- TEE: OP-TEE
- OP-TEE初探
- OP-TEE初探
- OP-TEE初探
- OP-TEE xtest 功能记录
- 1.OP-TEE代码结构
- OP-TEE笔记之OPTEE__OS文件结构
- OP-TEE设计结构(一)
- OP-TEE设计结构(二)
- OP-TEE TA:读写寄存器数据
- HIKEY OP-TEE切换UART运行状态
- 树莓派3B运行OP-TEE
- 0.使用Qemu运行OP-TEE
- 10.OP-TEE OS启动(一)
- 11.OP-TEE OS启动(二)
- trustzone与OP-TEE介绍导读
- 使用springboot集成jseesite
- PHP7新特性 简要笔记
- 【纽约】-C- Immortal Porpoises(矩阵)
- 创建表空间以及用户,授予权限,查看表空间名称及大小,物理文件的名称及大小,数据库的创建日期和归档方式,数据库的版本,数据库库对象,表空间的使用情况,表空间读写
- springboot学习(二) Spring Boot 快速入门
- IMX6UL EVK OP-TEE SET TZASC ENABLE
- iOS正则表达式(NSRegularExpression)
- 数据泵导入导出
- 【模板】 欧拉路 欧拉回路
- JVM性能调优参数整理
- uva12563 Jin Ge Jin Qu
- Struts2总结---ognl概念和原理详解 (7)
- 21点黑杰克
- android自定义view--温度计