HIKEY OP-TEE切换UART运行状态

2024-05-05 04:18

本文主要是介绍HIKEY OP-TEE切换UART运行状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

已经实现了UART的安全状态的切换。打算基于此继续开发OPTEE_OS相应的各类驱动。
一.资源准备

OPTEE工程源码:OPTEE官网
注意:根据说明下载hikey_debian的代码版本。

二.实现方法

1.Hikey_Debian的代码版本带有helloworld的样例TA,可以修改为调用静态TA,当然也可以自行编写TA调用静态TA,调用方法前文讲述过了,不再累述。

2.下载OPTEE工程源码后,本身不能支持静态TA的编译和调用,需修改配置文件,修改方法参见:静态TA配置

3.修改/devel/optee/optee_os/core/arch/arm/plat-hikey/platform_config.h文件,经过与OP-TEE官方咨询,确定Hikey TZPC的基地址为0xF8002000,大小为0x878,修改内容如下:

...
...
#define CONSOLE_UART_BASE       0xF7113000
#else
#error Unknown console UART
#endif+/* TZPC */
+#define TZPC_BASE          0xF8002000
+#define TZPC_SIZE          0x878#define CONSOLE_BAUDRATE    115200
#define CONSOLE_UART_CLK_IN_HZ  19200000...
...

4.修改/devel/optee/optee_os/core/arch/arm/plat-hikey/main.c文件,默认的OP-TEE的可访问硬件地址中不包含TZPC的地址,需要自行添加进去,TZPC的地址位于安全世界下,则地址空间属性为MEM_AREA_IO_SEC,由于需要切换UART的运行状态,同样需要修改UART的地址权限也为SEC,也就是访问EL1下的地址,修改内容如下:


...
....cpu_suspend = pm_do_nothing,.cpu_resume = pm_do_nothing,.system_off = pm_do_nothing,.system_reset = pm_do_nothing,
};-register_phys_mem(MEM_AREA_IO_SEC, CONSOLE_UART_BASE, PL011_REG_SIZE);
+register_phys_mem(MEM_AREA_IO_SEC, CONSOLE_UART_BASE, PL011_REG_SIZE);+register_phys_mem(MEM_AREA_IO_SEC, TZPC_BASE, TZPC_SIZE);const struct thread_handlers *generic_boot_get_handlers(void)
{return &handlers;
}
...
...

4.在/devel/optee/optee_os/core/arch/arm/sta/目录下,新建sta_reg.c文件,作为静态TA文件,内容如下:

#include <compiler.h>
#include <stdio.h>
#include <trace.h>
#include <kernel/static_ta.h>
#include <string.h>
#include <string_ext.h>
#include <mm/tee_pager.h>
#include <mm/core_memprot.h>#include <drivers/pl011.h>#include <io.h> #define TA_NAME     "sta_reg.ta"#define STA_REG_UUID \{ 0xd96a5b40, 0x12c7, 0x21af, \{ 0x87, 0x94, 0x10, 0x02, 0xa5, 0xd5, 0xc6, 0x1b } }#define STA_READ_STATS      0
#define STA_WRITE_STATS     1#define CONSOLE_UART_BASE       0xF7113000/* flag register */
/* TZPC */ 
#define TZPC_BASE          0xF8002000
#define TZPC_SIZE          0x878#define SLAVE_PROTX_STATE    0x830#define SLAVE_PROTX_SET    0x834#define SLAVE_PROTX_CLEAN    0x838/*
#define set_sec_uart0     (1 << 26) UART0 设置安全状态
#define set_sec_uart1     (1 << 27) UART1 设置安全状态
#define set_sec_uart2     (1 << 28) UART2 设置安全状态
#define set_sec_uart3     (1 << 29) UART3 设置安全状态
#define set_sec_uart4     (1 << 30) UART4 设置安全状态*/static vaddr_t console_base(void)
{static void *va;if (cpu_mmu_enabled()) {if (!va)va = phys_to_virt(CONSOLE_UART_BASE, MEM_AREA_IO_SEC);return (vaddr_t)va;}return CONSOLE_UART_BASE;
}static vaddr_t tzpc_base(void)
{static void *va;if (cpu_mmu_enabled()) {if (!va)va = phys_to_virt(TZPC_BASE, MEM_AREA_IO_SEC);return (vaddr_t)va;}return TZPC_BASE;
}static TEE_Result read_regs(uint32_t type __unused, TEE_Param p[4] __unused)
{  EMSG("TZPC_UART_STATE: 0x%x\n",read32(tzpc_base()+SLAVE_PROTX_STATE));   return TEE_SUCCESS;
}static TEE_Result write_regs(uint32_t type __unused, TEE_Param p[4] __unused)
{ vaddr_t uart_base = console_base();int ch;MSG("TZPC_WRITE_UART:on the write");write32(0xFF000000, tzpc_base()+SLAVE_PROTX_SET);DMSG("TZPC_WRITE_UART:on the write finish");DMSG("welcome into the secure world!\n");DMSG("please input 'a' to back the normal world!\n");DMSG("TZPC_UART_STATE: 0x%x\n",read32(tzpc_base()+SLAVE_PROTX_STATE)); do{ch = pl011_getchar(uart_base);}while(ch != 97)write32(0xFFFFFFFF, tzpc_base()+SLAVE_PROTX_CLEAN);DMSG("have been back to the normal world!\n");return TEE_SUCCESS;
}/** Trusted Application Entry Points*/static TEE_Result create_ta(void)
{return TEE_SUCCESS;
}static void destroy_ta(void)
{
}static TEE_Result open_session(uint32_t ptype __unused,TEE_Param params[4] __unused,void **ppsess __unused)
{return TEE_SUCCESS;
}static void close_session(void *psess __unused)
{
}static TEE_Result invoke_command(void *psess __unused,uint32_t cmd, uint32_t ptypes,TEE_Param params[4])
{switch (cmd) {case STA_READ_STATS:return read_regs(ptypes, params);case STA_WRITE_STATS:return write_regs(ptypes, params);default:break;}return TEE_ERROR_BAD_PARAMETERS;
}static_ta_register(.uuid = STA_REG_UUID, .name = TA_NAME,.create_entry_point = create_ta,.destroy_entry_point = destroy_ta,.open_session_entry_point = open_session,.close_session_entry_point = close_session,.invoke_command_entry_point = invoke_command);

这个静态TA的主要功能是配置TZPC,并使用设置寄存器对其进行修改,使UART0处于安全状态下,无法被普通世界下的DEBIAN系统访问,直到输入‘a‘,切换回非安全状态,具体的各寄存器功能可以参见Hi6210sft的相关寄存器接口的功能介绍。

这篇关于HIKEY OP-TEE切换UART运行状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/960794

相关文章

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见