文章目录

  • 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...)相关推荐

  1. 在linux、optee、ATF中的中断异常向量表

    目录 1.在linux中的异常向量表 (1).arm64的异常向量表-(irq,fiq,svc......) (2).arm32的异常向量表-(irq,fiq,swi......) 2.在optee中 ...

  2. [ATF]-ATF的异常向量表介绍-(irq,fiq,smc,hyc...)

    文章目录 1.同步异常向量表-(smc) 1.1.handle_sync_exception调用smc_handler64处理同步异常 2.异类步异常向量表-(irq,fiq...) 2.1.get_ ...

  3. [optee]-optee中的异常向量表的实现

    Optee异常向量表 ARMV8-aarch64 1.optee中定义的异常向量表 2.optee中设置向量表基地址VBAR_EL1 ARMV8-aarch32.ARMV7-aarch32 1.opt ...

  4. u-boot分析(四)---设置异常向量表|设置SVC模式

    u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...

  5. [ARM异常]-linux中(aarch/aarch64)异常向量表介绍

    文章目录 1.ARM的异常向量表基地址寄存器--VBAR 1.1.armv8 : VBAR寄存器 1.2.armv7 : VBAR寄存器 2.ARM的异常向量表的定义 2.1 armv8 :异常向量表 ...

  6. Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定

    ARM64的启动过程之(六):异常向量表的设定 作者:linuxer 发布于:2015-11-24 18:22 分类:ARMv8A Arch 一.前言 本文主要描述了4.1.10内核初始化过程中如何初 ...

  7. 【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

    一. 异常向量表 1. 异常相关概念 (1) 异常 (2) 异常类型简介 2. 异常处理 (1) 异常处理 二. 异常向量表代码编写 1. 初始化异常向量表模块代码 2. 链接器脚本 3. Makef ...

  8. inside uboot (三) 异常向量表

    1. 异常向量表概述 从上面的地址映射来看,中断向量表的地址为0xD0037400,因此如果我们想在SRAM中,也就是BL1中处理异常的话, 就需要把我们的异常向量表拷贝到这个地址上.或者我们可以在链 ...

  9. 中断向量表 异常相量表 中断向量(中断函数入口地址)ARM和X86异常向量表不同

    STM32的中断向量表是干什么的?到底有什么用?它放在哪里? 一.中断向量表里有什么?它放在那里?到底有什么用? 1.中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x0 ...

最新文章

  1. 了解你所不知道的SMON功能(三):清理obj$基表
  2. Solaris 性能基础
  3. 1.数据库和表的创建
  4. 【转】蓝牙物理链路类型:SCO和ACL链路
  5. 扎哈遗作:北京大兴机场,耗资800亿,被英国《卫报》评为新世界七大奇迹!...
  6. 三态输出门实验报告注意事项_数电基础知识:各种IO输出的类型
  7. 硬盘:协议-总线-接口
  8. 压缩ppt文件大小的方法
  9. Lumion 9.0 建筑日景快速渲染实例教程
  10. linux mint 搜狗 乱码,解决linux mint wine微信字体显示问题
  11. Datastage数据装载报错:Consumed more than 1000000 bytes looking for record delimiter
  12. Mac系统运行“exe”文件最简单的解决办法
  13. 吴海燕C语言真题,基于APP的智能婴儿床系统的设计与实现开题报告
  14. 本软件仅供学习交流,如作他用所承受的法律责任一概与作者无关(下载使用即代表你同意上述观点)
  15. 2022最新独立版智狐聚合支付v1.0.5.21_聚合支付系统源码
  16. strace命令用法详解
  17. Java将project设置为Maven项目,并配置
  18. ArcGIS教程:多面体
  19. 用什么擦地最干净脑筋急转弯_27个有意思的脑筋急转弯(含答案)
  20. 送给PUB所有MM《Silent love 微笑的弧度 》 三颗猫饼干

热门文章

  1. 如何利用传感器控制数据中心能耗
  2. c# npoi 2.5版本设置字体加粗_巨巨巨巨推荐:SCI翻译神器,大版本更新来了
  3. Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
  4. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 0-1: malformed
  5. AI:2020年6月22日北京智源大会演讲分享之机器感知专题论坛—14:50-15:30吴玺宏教授《一种具身自监督学习框架:面向任何语种语音的音系构建任务》
  6. 成功解决ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
  7. CV之face_recognition:Py之face_recognition库安装、介绍、使用方法详细攻略
  8. BlockChain:BlockChain周边概念详解+个人理解
  9. Dataset之谷歌地图数据集:谷歌地图数据集的简介、安装、使用方法之详细攻略
  10. 解决问题ImportError: HDFStore requires PyTables, quot;No module named 'tables'quot; problem importing