16. OP-TEE中的中断处理(二)------系统FIQ事件的处理

2023-12-09 20:32

本文主要是介绍16. OP-TEE中的中断处理(二)------系统FIQ事件的处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   

  

当系统使用了ATF的时候,monitor态的中断向量表将会在bl31中被设置,本文将介绍不带ATF的情况下系统出现FIQ的时候,整个系统时如何处理的。从《15. OP-TEE中的中断处理(一)------中断配置和向量表的配置》文中的图上可以看出,FIQ只会在当系统处于secure world和monitor态的时候才会生效。下面将分别介绍两种状态下对FIQ的处理流程。在OP-TEE的文档资料中给出了FIQ的整个处理流程如下,包括monitor态和secure world态的处理流程:

1.monitor态下FIQ事件的处理

  由于不带ATF,所以当CPU处于monitor态时产生FIQ,则必然进入的是monitor的中断向量中去寻找处理函数。而monitor的中断向量是怎么样的呢?在monitor态下FIQ又是被如何才处理的呢?

  下图为在monitore态下整个FIQ事件的初始化流程图:

1.1 monitor态的中断处理向量表的配置

  在OP-TEE的启动的过程中,将会调用init_sec_mon函数来完成monitor态的相关初始化,该函数被定义在optee_os/core/arch/arm/kernel/thread.c文件中,从初始化的时候调用的流程如下:

_start--> b reset-->b reset_primary-->bl generic_boot_init_primary-->init_primary_helper-->init_sec_mon

  init_sec_mon函数的内容如下:

static void init_sec_mon(size_t pos __maybe_unused)
{
#if !defined(CFG_WITH_ARM_TRUSTED_FW)/* Initialize secure monitor */
/* 调用sm_init函数完成Monitor态的相关初始化 */sm_init(GET_STACK(stack_tmp[pos]));
#endif
}

该函数会调用sm_init来进行monitor的相关初始化,sm_init函数定义在optee_os/core/arch/arm/sm/sm_a32.S文件中,内容如下:

/* void sm_init(vaddr_t stack_pointer); */
FUNC sm_init , :
UNWIND(	.fnstart)/* Set monitor stack */mrs	r1, cpsr	//设置monitor的栈cps	#CPSR_MODE_MON/* Point just beyond sm_ctx.sec */sub	sp, r0, #(SM_CTX_SIZE - SM_CTX_NSEC)msr	cpsr, r1/* Set monitor vector (MVBAR) */ldr	r0, =sm_vect_table	//获取monitor态的中断向量表变量write_mvbar r0		//将中断向量表的地址写入到MVBAR寄存器中bx	lr
END_FUNC sm_init

  该函数将会将monitor态下的中断向量事件的处理地址写入到MVBAR寄存器中,以便在monitor态下产生中断时能够找到中断处理函数。而monitore的中断向量表就是sm_vect_table。该变量内容如下:

LOCAL_FUNC sm_vect_table , :
UNWIND(	.fnstart)
UNWIND(	.cantunwind)b	.		/* Reset			*/b	.		/* Undefined instruction	*/b	sm_smc_entry	/* Secure monitor call */b	.		/* Prefetch abort		*/b	.		/* Data abort			*/b	.		/* Reserved			*/b	.		/* IRQ				*/b	sm_fiq_entry	/* FIQ				*/
UNWIND(	.fnend)
END_FUNC sm_vect_table


  从sm_vect_tabl函数可知,当在monitor态下才产生smc时,将会调用sm_smc_entry函数来进行处理,而当在monitor下出现FIQ时,将会调用sm_fiq_entry函数来进行才处理。

1.2 monitor态下FIQ事件的处理过程

  当在monitor态下产生FIQ时,CPU将会调用存放在MVBAR寄存器中的的sm_smc_entry函数来进行处理。由于是产生了FIQ事件,故最终会调用sm_fiq_entry函数来进行处理。该函数定义在optee_os/core/arch/arm/sm/sm_a32.S文件中,内容如下:

LOCAL_FUNC sm_fiq_entry , :
UNWIND(	.fnstart)
UNWIND(	.cantunwind)/* FIQ has a +4 offset for lr compared to preferred return address */sub	lr, lr, #4/* sp points just past struct sm_sec_ctx */srsdb	sp!, #CPSR_MODE_MONpush	{r0-r7}clrex		/* Clear the exclusive monitor *//** As we're coming from non-secure world the stack pointer points* to sm_ctx.nsec.r0 at this stage. After the instruction below the* stack pointer points to sm_ctx.*/sub	sp, sp, #(SM_CTX_NSEC + SM_NSEC_CTX_R0)/* Update SCR */read_scr r1bic	r1, r1, #(SCR_NS | SCR_FIQ) /* Clear NS and FIQ bit in SCR */write_scr r1/* Save non-secure context */add	r0, sp, #SM_CTX_NSECbl	sm_save_modes_regsstm	r0!, {r8-r12}/* Set FIQ entry */ldr	r0, =(thread_vector_table + THREAD_VECTOR_TABLE_FIQ_ENTRY)str	r0, [sp, #(SM_CTX_SEC + SM_SEC_CTX_MON_LR)]/* Restore secure context */add	r0, sp, #SM_CTX_SECbl	sm_restore_modes_regsadd	sp, sp, #(SM_CTX_SEC + SM_SEC_CTX_MON_LR)rfefd	sp!
UNWIND(	.fnend)
END_FUNC sm_fiq_entry

  上面的代码中的ldr r0, =(thread_vector_table + THREAD_VECTOR_TABLE_FIQ_ENTRY)就是用来获取在TEE中用来处理FIQ事件的handle地址,而thread_vector_table从上一章节中可以知道,该变量将会与TEE中真正的FIQ函数关联起来。所以最终会调用到main_fiq函数来进行处理该FIQ事件。等处理完之后,CPU将会重新回到处理前的状态。

1.3 main_fiq函数

  main_fiq函数函数是TEE用来处理FIQ事件的最终函数。该函数定义在optee_os/core/arch/rm/tee/entry_fast.c文件中,函数内如如下:

static void main_fiq(void)
{gic_it_handle(&gic_data);
}

  该函数根据具体的参数和FIQ时间的ID来判定具体需要执行哪些操作,至于具体的操作,以后如果碰到将会具体讲述。

2. OP-TEE中对FIQ事件的处理

  在OP-TEE的初始化的时候会调用thread_init_vbar函数来完成在seure world态的中断向量表的初始化,且在GIC中配置FIQ在secure world态时才有效。所以当在secure world态中产生了FIQ事件的时候,CPU将直接通过VBAR寄存器查找到中断向量表的地址,并命中FIQ的处理函数。整个处理过程如下:

2.1thread_fiq_handler函数

  当在secure world产生了FIQ事件的时候,通过查找中断向量表可以知道,CPU将调用thread_fiq_handler函数,该函数定义在optee_os/core/arch/arm/kernel/thread_a32.S文件中,其内容如下:

LOCAL_FUNC thread_fiq_handler , :
UNWIND(	.fnstart)
UNWIND(	.cantunwind)
#if defined(CFG_ARM_GICV3)foreign_intr_handler	fiq
#elsenative_intr_handler	fiq
#endif
UNWIND(	.fnend)
END_FUNC thread_fiq_handler

  由于没有开启CFG_ARM_GICV3的支持,所以该函数会调用native_intr_handler函数来完成FIQ事件的处理

2.2 native_intr_handle宏

  native_intr_handle宏是用汇编实现的,用来在secure world态中处理FIQ事件。该函数定义在optee_os/core/arch/arm/kernel/thread_a32.S文件中,内容如下:

.macro	native_intr_handler mode:req/** FIQ and IRQ have a +4 offset for lr compared to preferred return* address*/sub     lr, lr, #4/** We're saving {r0-r3}. The banked fiq registers {r8-r12} need to be* saved if the native interrupt is sent as FIQ because the secure* monitor doesn't save those. The treatment of the banked fiq* registers is somewhat analogous to the lazy save of VFP registers.*/.ifc	\mode\(),fiqpush	{r0-r3, r8-r12, lr}.elsepush	{r0-r3, lr}.endifbl	thread_check_canaries	//检查栈空间没被破坏ldr	lr, =thread_nintr_handler_ptr	//加载FIQ处理函数的地址到lr寄存器中ldr	lr, [lr]blx	lr	//跳转到thread_nintr_handler_ptr函数执行.ifc	\mode\(),fiqpop	{r0-r3, r8-r12, lr}.elsepop	{r0-r3, lr}.endifmovs	pc, lr
.endm

2.3 main_fiq函数

  在初始化的时候会调用init_handlers函数将thread_nintr_handler_ptr指向handlers->nintr变量,而handlers->nintr的值为main_fiq函数。所以最终会调用到main_fiq来对FIQ事件进行处理。

  main_fiq函数需要根据不同的板级的需要和板级需要处理的FIQ事件类型进行实际的编写和处理,在此就不做详细介绍。






 

这篇关于16. OP-TEE中的中断处理(二)------系统FIQ事件的处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.