IMX6UL EVK OP-TEE SET TZASC ENABLE

2024-05-05 04:18
文章标签 set op enable evk tee imx6ul tzasc

本文主要是介绍IMX6UL EVK OP-TEE SET TZASC ENABLE,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.准备工作
配置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程序进行地址映射将会产生数据中断,无法映射。测试结果如下:
fail to get the value

这篇关于IMX6UL EVK OP-TEE SET TZASC ENABLE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960797

相关文章

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Android set Tag, findViewWithTag使用

设置了tag为“principal”的view ImageView principal = (ImageView) findViewById(R.id.imagen_home_0);principal.setTag("principal"); 在其它地方获取,获取已经设置了tag为“principal”的view LayoutInflater inflater = LayoutInflate

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Eclipse或MyEclipse中Java Working Set管理项目

随着学习JAVA的时间的越来越久,项目也越来越多,Eclipse或MyEclipse界面中显示一堆! 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使用的, 必须大规模的滚动滚动条...... 图片一   Project Explorer中:    图片二:Package Explorer中: 这样就好找很多了,分类放!

STL set整理

#include<set>#include<cstdio>#include<iterator>#include<iostream>#include<algorithm>using namespace std;//set 集合的操作//multisetset<int>Set1;set<int>Set2;set<int>Set3;/*begin() 返回指向第一个元素的迭代器

解决PHP Warning: strftime(): It is not safe to rely on the system's timezone set

当运行一些程序时,在httpd日志中会有如下警告日志: PHP Warning:  strftime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set(

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对