optee的异常向量表-(irq,fiq,svc...)
文章目录
- 1、 optee中的异常向量表thread_excp_vect
- 1.1、异步异常elx_irq、elx_fiq中断的处理
- 1.2、同步异常el0_sync_a64、el0_sync_a32中断的处理
★★★ 友情链接 : 个人博客导读首页—点击此处 ★★★
以thread_a64.S为例,thread_a32.S暂不分析
1、 optee中的异常向量表thread_excp_vect
其中el0_sync_a64和el0_sync_a32是同步异常处理函数,当执行svc指令是会调用该函数;
#define INV_INSN 0.section .text.thread_excp_vect.align 11, INV_INSN
FUNC thread_excp_vect , :/* -----------------------------------------------------* EL1 with SP0 : 0x0 - 0x180* -----------------------------------------------------*/.align 7, INV_INSN
el1_sync_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b el1_sync_abortcheck_vector_size el1_sync_sp0.align 7, INV_INSN
el1_irq_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b elx_irqcheck_vector_size el1_irq_sp0.align 7, INV_INSN
el1_fiq_sp0:store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 3b elx_fiqcheck_vector_size el1_fiq_sp0.align 7, INV_INSN
el1_serror_sp0:b el1_serror_sp0check_vector_size el1_serror_sp0/* -----------------------------------------------------* Current EL with SP1: 0x200 - 0x380* -----------------------------------------------------*/.align 7, INV_INSN
el1_sync_sp1:b el1_sync_sp1check_vector_size el1_sync_sp1.align 7, INV_INSN
el1_irq_sp1:b el1_irq_sp1check_vector_size el1_irq_sp1.align 7, INV_INSN
el1_fiq_sp1:b el1_fiq_sp1check_vector_size el1_fiq_sp1.align 7, INV_INSN
el1_serror_sp1:b el1_serror_sp1check_vector_size el1_serror_sp1/* -----------------------------------------------------* Lower EL using AArch64 : 0x400 - 0x580* -----------------------------------------------------*/.align 7, INV_INSN
el0_sync_a64:restore_mappingmrs x2, esr_el1mrs x3, sp_el0lsr x2, x2, #ESR_EC_SHIFTcmp x2, #ESR_EC_AARCH64_SVCb.eq el0_svcb el0_sync_abortcheck_vector_size el0_sync_a64.align 7, INV_INSN
el0_irq_a64:restore_mappingb elx_irqcheck_vector_size el0_irq_a64.align 7, INV_INSN
el0_fiq_a64:restore_mappingb elx_fiqcheck_vector_size el0_fiq_a64.align 7, INV_INSN
el0_serror_a64:b el0_serror_a64check_vector_size el0_serror_a64/* -----------------------------------------------------* Lower EL using AArch32 : 0x0 - 0x180* -----------------------------------------------------*/.align 7, INV_INSN
el0_sync_a32:restore_mappingmrs x2, esr_el1mrs x3, sp_el0lsr x2, x2, #ESR_EC_SHIFTcmp x2, #ESR_EC_AARCH32_SVCb.eq el0_svcb el0_sync_abortcheck_vector_size el0_sync_a32.align 7, INV_INSN
el0_irq_a32:restore_mappingb elx_irqcheck_vector_size el0_irq_a32.align 7, INV_INSN
el0_fiq_a32:restore_mappingb elx_fiqcheck_vector_size el0_fiq_a32.align 7, INV_INSN
el0_serror_a32:b el0_serror_a32check_vector_size el0_serror_a32
中断向量表的注册:
static vaddr_t get_excp_vect(void)
{#ifdef CFG_CORE_WORKAROUND_SPECTRE_BP_SECuint32_t midr = read_midr();if (get_midr_implementer(midr) != MIDR_IMPLEMENTER_ARM)return (vaddr_t)thread_excp_vect;switch (get_midr_primary_part(midr)) {#ifdef ARM32case CORTEX_A8_PART_NUM:case CORTEX_A9_PART_NUM:case CORTEX_A17_PART_NUM:
#endifcase CORTEX_A57_PART_NUM:case CORTEX_A72_PART_NUM:case CORTEX_A73_PART_NUM:case CORTEX_A75_PART_NUM:return select_vector((vaddr_t)thread_excp_vect_workaround);
#ifdef ARM32case CORTEX_A15_PART_NUM:return select_vector((vaddr_t)thread_excp_vect_workaround_a15);
#endifdefault:return (vaddr_t)thread_excp_vect;}
#endif /*CFG_CORE_WORKAROUND_SPECTRE_BP_SEC*/return (vaddr_t)thread_excp_vect;
}
当中断来时,根据向量表中的跳转 ,会调用到elx_irq和elx_fiq函数
1.1、异步异常elx_irq、elx_fiq中断的处理
foreign是外部中断处理和native内部中断处理:
LOCAL_FUNC elx_irq , :
#if defined(CFG_ARM_GICV3)native_intr_handler irq
#elseforeign_intr_handler irq
#endif
END_FUNC elx_irqLOCAL_FUNC elx_fiq , :
#if defined(CFG_ARM_GICV3)foreign_intr_handler fiq
#elsenative_intr_handler fiq
#endif
END_FUNC elx_fiq
gicv3和gicv2的中断处理有什么不同呢?
- 在gicv2中,IRQ固定是给REE用的,FIQ固定是给TEE用的,所以如果在TEE中来了一个IRQ,则会调用foreign_intr_handler irq,foreign前缀是外部的意思,TEE中的处理,就是该函数中调用SMC,切回到REE,让REE来处理这个中断;
- 在gicv3中,在TEE中响应的IRQ是给TEE用的,在TEE中响应的FIQ是给REE用的,所以如果在TEE中来了一个FIQ,则会调用foreign_intr_handler fiq,foreign前缀是外部的意思,TEE中的处理,就是该函数中调用SMC,切回到REE,让REE来处理这个中断;
1.2、同步异常el0_sync_a64、el0_sync_a32中断的处理
.align 7, INV_INSN
el0_sync_a64:restore_mappingmrs x2, esr_el1mrs x3, sp_el0lsr x2, x2, #ESR_EC_SHIFTcmp x2, #ESR_EC_AARCH64_SVCb.eq el0_svcb el0_sync_abortcheck_vector_size el0_sync_a64LOCAL_FUNC el0_svc , :/* get pointer to current thread context in x0 */get_thread_ctx sp, 0, 1, 2/* load saved kernel sp */ldr x0, [x0, #THREAD_CTX_KERN_SP]/* Keep pointer to initial recod in x1 */mov x1, sp/* Switch to SP_EL0 and restore kernel sp */msr spsel, #0mov x2, sp /* Save SP_EL0 */mov sp, x0/* Make room for struct thread_svc_regs */sub sp, sp, #THREAD_SVC_REG_SIZEstp x30,x2, [sp, #THREAD_SVC_REG_X30]/* Restore x0-x3 */ldp x2, x3, [x1, #THREAD_CORE_LOCAL_X2]ldp x0, x1, [x1, #THREAD_CORE_LOCAL_X0]/* Prepare the argument for the handler */store_xregs sp, THREAD_SVC_REG_X0, 0, 14mrs x0, elr_el1mrs x1, spsr_el1store_xregs sp, THREAD_SVC_REG_ELR, 0, 1mov x0, sp/** Unmask native interrupts, Serror, and debug exceptions since we have* nothing left in sp_el1. Note that the SVC handler is excepted to* re-enable foreign interrupts by itself.*/
#if defined(CFG_ARM_GICV3)msr daifclr, #(DAIFBIT_IRQ | DAIFBIT_ABT | DAIFBIT_DBG)
#elsemsr daifclr, #(DAIFBIT_FIQ | DAIFBIT_ABT | DAIFBIT_DBG)
#endif/* Call the handler */bl tee_svc_handler/* Mask all maskable exceptions since we're switching back to sp_el1 */msr daifset, #DAIFBIT_ALL/** Save kernel sp we'll had at the beginning of this function.* This is when this TA has called another TA because* __thread_enter_user_mode() also saves the stack pointer in this* field.*/msr spsel, #1get_thread_ctx sp, 0, 1, 2msr spsel, #0add x1, sp, #THREAD_SVC_REG_SIZEstr x1, [x0, #THREAD_CTX_KERN_SP]/* Restore registers to the required state and return*/load_xregs sp, THREAD_SVC_REG_ELR, 0, 1msr elr_el1, x0msr spsr_el1, x1load_xregs sp, THREAD_SVC_REG_X2, 2, 14mov x30, spldr x0, [x30, #THREAD_SVC_REG_SP_EL0]mov sp, x0b_if_spsr_is_el0 w1, 1fldp x0, x1, [x30, THREAD_SVC_REG_X0]ldr x30, [x30, #THREAD_SVC_REG_X30]eret1: ldp x0, x1, [x30, THREAD_SVC_REG_X0]ldr x30, [x30, #THREAD_SVC_REG_X30]msr spsel, #1store_xregs sp, THREAD_CORE_LOCAL_X0, 0, 1b eret_to_el0
END_FUNC el0_svc
optee的异常向量表-(irq,fiq,svc...)相关推荐
- 在linux、optee、ATF中的中断异常向量表
目录 1.在linux中的异常向量表 (1).arm64的异常向量表-(irq,fiq,svc......) (2).arm32的异常向量表-(irq,fiq,swi......) 2.在optee中 ...
- [ATF]-ATF的异常向量表介绍-(irq,fiq,smc,hyc...)
文章目录 1.同步异常向量表-(smc) 1.1.handle_sync_exception调用smc_handler64处理同步异常 2.异类步异常向量表-(irq,fiq...) 2.1.get_ ...
- [optee]-optee中的异常向量表的实现
Optee异常向量表 ARMV8-aarch64 1.optee中定义的异常向量表 2.optee中设置向量表基地址VBAR_EL1 ARMV8-aarch32.ARMV7-aarch32 1.opt ...
- u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...
- [ARM异常]-linux中(aarch/aarch64)异常向量表介绍
文章目录 1.ARM的异常向量表基地址寄存器--VBAR 1.1.armv8 : VBAR寄存器 1.2.armv7 : VBAR寄存器 2.ARM的异常向量表的定义 2.1 armv8 :异常向量表 ...
- Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定
ARM64的启动过程之(六):异常向量表的设定 作者:linuxer 发布于:2015-11-24 18:22 分类:ARMv8A Arch 一.前言 本文主要描述了4.1.10内核初始化过程中如何初 ...
- 【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )
一. 异常向量表 1. 异常相关概念 (1) 异常 (2) 异常类型简介 2. 异常处理 (1) 异常处理 二. 异常向量表代码编写 1. 初始化异常向量表模块代码 2. 链接器脚本 3. Makef ...
- inside uboot (三) 异常向量表
1. 异常向量表概述 从上面的地址映射来看,中断向量表的地址为0xD0037400,因此如果我们想在SRAM中,也就是BL1中处理异常的话, 就需要把我们的异常向量表拷贝到这个地址上.或者我们可以在链 ...
- 中断向量表 异常相量表 中断向量(中断函数入口地址)ARM和X86异常向量表不同
STM32的中断向量表是干什么的?到底有什么用?它放在哪里? 一.中断向量表里有什么?它放在那里?到底有什么用? 1.中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x0 ...
最新文章
- 了解你所不知道的SMON功能(三):清理obj$基表
- Solaris 性能基础
- 1.数据库和表的创建
- 【转】蓝牙物理链路类型:SCO和ACL链路
- 扎哈遗作:北京大兴机场,耗资800亿,被英国《卫报》评为新世界七大奇迹!...
- 三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型
- 硬盘:协议-总线-接口
- 压缩ppt文件大小的方法
- Lumion 9.0 建筑日景快速渲染实例教程
- linux mint 搜狗 乱码,解决linux mint wine微信字体显示问题
- Datastage数据装载报错:Consumed more than 1000000 bytes looking for record delimiter
- Mac系统运行“exe”文件最简单的解决办法
- 吴海燕C语言真题,基于APP的智能婴儿床系统的设计与实现开题报告
- 本软件仅供学习交流,如作他用所承受的法律责任一概与作者无关(下载使用即代表你同意上述观点)
- 2022最新独立版智狐聚合支付v1.0.5.21_聚合支付系统源码
- strace命令用法详解
- Java将project设置为Maven项目,并配置
- ArcGIS教程:多面体
- 用什么擦地最干净脑筋急转弯_27个有意思的脑筋急转弯(含答案)
- 送给PUB所有MM《Silent love 微笑的弧度 》 三颗猫饼干
热门文章
- 如何利用传感器控制数据中心能耗
- c# npoi 2.5版本设置字体加粗_巨巨巨巨推荐:SCI翻译神器,大版本更新来了
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
- 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
- AI:2020年6月22日北京智源大会演讲分享之机器感知专题论坛—14:50-15:30吴玺宏教授《一种具身自监督学习框架:面向任何语种语音的音系构建任务》
- 成功解决ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
- CV之face_recognition:Py之face_recognition库安装、介绍、使用方法详细攻略
- BlockChain:BlockChain周边概念详解+个人理解
- Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略
- 解决问题ImportError: HDFStore requires PyTables, quot;No module named 'tables'quot; problem importing