目录

  • 1、在linux中的异常向量表
    • (1)、arm64的异常向量表-(irq,fiq,svc......)
    • (2)、arm32的异常向量表-(irq,fiq,swi......)
  • 2、在optee中的异常向量表
  • 3、在ATF中的异常向量表
    • (1)、同步异常向量表-(smc)
      • handle_sync_exception调用smc_handler64处理同步异常
    • (2)、异类步异常向量表-(irq,fiq...)
      • get_interrupt_type_handler获取ATF注册的中断处理函数
      • handle_interrupt_exception调用ATF中注册的handler函数

1、在linux中的异常向量表

(1)、arm64的异常向量表-(irq,fiq,svc…)

armv8-arch64架构下,linux kernel的异常量表,再entry.S中:

/** Exception vectors.*/.align   11
ENTRY(vectors)kernel_ventry 1, sync_invalid         // Synchronous EL1tkernel_ventry    1, irq_invalid          // IRQ EL1tkernel_ventry    1, fiq_invalid          // FIQ EL1tkernel_ventry    1, error_invalid        // Error EL1tkernel_ventry  1, sync             // Synchronous EL1hkernel_ventry    1, irq              // IRQ EL1hkernel_ventry    1, fiq_invalid          // FIQ EL1hkernel_ventry    1, error_invalid        // Error EL1hkernel_ventry  0, sync             // Synchronous 64-bit EL0kernel_ventry  0, irq              // IRQ 64-bit EL0kernel_ventry  0, fiq_invalid          // FIQ 64-bit EL0kernel_ventry  0, error_invalid        // Error 64-bit EL0#ifdef CONFIG_COMPATkernel_ventry    0, sync_compat, 32      // Synchronous 32-bit EL0kernel_ventry  0, irq_compat, 32       // IRQ 32-bit EL0kernel_ventry  0, fiq_invalid_compat, 32   // FIQ 32-bit EL0kernel_ventry  0, error_invalid_compat, 32 // Error 32-bit EL0
#elsekernel_ventry  0, sync_invalid, 32     // Synchronous 32-bit EL0kernel_ventry  0, irq_invalid, 32      // IRQ 32-bit EL0kernel_ventry  0, fiq_invalid, 32      // FIQ 32-bit EL0kernel_ventry  0, error_invalid, 32        // Error 32-bit EL0
#endif
END(vectors)

我们这里讲解如下四行:

kernel_ventry    1, irq              // IRQ EL1h
kernel_ventry   0, irq              // IRQ 64-bit EL0
kernel_ventry   1, sync             // Synchronous EL1h
kernel_ventry   0, sync             // Synchronous 64-bit EL0

kernel_ventry是宏,翻译后的函数名分别是:
el1_irq
el0_riq
el1_sync
el0_sync
对应的函数入口我们就找到了,也就是说,当触发irq异常、或svc异常时会跳转到这几个函数中。

(2)、arm32的异常向量表-(irq,fiq,swi…)

在arch架构下,linux kernel的同步异常向量表__stubs_start 和 异步异常向量表__vectors_start,在entry-armv.S中:

 .section .stubs, "ax", %progbits
__stubs_start:@ This must be the first word.word   vector_swi.section .vectors, "ax", %progbits
__vectors_start:W(b)    vector_rstW(b)  vector_undW(ldr)    pc, __vectors_start + 0x1000W(b)   vector_pabtW(b) vector_dabtW(b) vector_addrexcptnW(b)   vector_irqW(b)  vector_fiq

2、在optee中的异常向量表

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

3、在ATF中的异常向量表

(1)、同步异常向量表-(smc)

smc同步异常调用的都是handle_sync_exception

sync_exception_aarch64:/* -----------------------------------------------------* This exception vector will be the entry point for* SMCs and traps that are unhandled at lower ELs most* commonly. SP_EL3 should point to a valid cpu context* where the general purpose and system register state* can be saved.* -----------------------------------------------------*/handle_sync_exceptioncheck_vector_size sync_exception_aarch64
sync_exception_aarch32:/* -----------------------------------------------------* This exception vector will be the entry point for* SMCs and traps that are unhandled at lower ELs most* commonly. SP_EL3 should point to a valid cpu context* where the general purpose and system register state* can be saved.* -----------------------------------------------------*/handle_sync_exceptioncheck_vector_size sync_exception_aarch32
handle_sync_exception调用smc_handler64处理同步异常
.macro   handle_sync_exception
/* Enable the SError interrupt */
msr daifclr, #DAIF_ABT_BITstr   x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
mrs x30, esr_el3
ubfx    x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTHcmp  x30, #EC_AARCH32_SMC
b.eq    smc_handler32cmp    x30, #EC_AARCH64_SMC
b.eq    smc_handler64/* -----------------------------------------------------* The following code handles any synchronous exception* that is not an SMC.* -----------------------------------------------------*/bl report_unhandled_exception
.endm
(2)、异类步异常向量表-(irq,fiq…)

irq/fiq异步异常调用的是handle_interrupt_exception

irq_aarch64:handle_interrupt_exception irq_aarch64check_vector_size irq_aarch64.align    7
fiq_aarch64:handle_interrupt_exception fiq_aarch64check_vector_size fiq_aarch64
get_interrupt_type_handler获取ATF注册的中断处理函数
interrupt_type_handler_t get_interrupt_type_handler(uint32_t type)
{if (validate_interrupt_type(type))return NULL;return intr_type_descs[type].handler;
}
handle_interrupt_exception调用ATF中注册的handler函数
 .macro  handle_interrupt_exception label/* Enable the SError interrupt */msr    daifclr, #DAIF_ABT_BITstr   x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]bl save_gp_registers/** Save the EL3 system registers needed to return from* this exception.*/mrs  x0, spsr_el3mrs x1, elr_el3stp  x0, x1, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]/* Switch to the runtime stack i.e. SP_EL0 */ldr  x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]mov x20, spmsr  spsel, #0mov    sp, x2/** Find out whether this is a valid interrupt type. If the* interrupt controller reports a spurious interrupt then* return to where we came from.*/bl    plat_ic_get_pending_interrupt_typecmp   x0, #INTR_TYPE_INVALb.eq    interrupt_exit_\label/** Get the registered handler for this interrupt type. A* NULL return value could be 'cause of the following* conditions:** a. An interrupt of a type was routed correctly but a*    handler for its type was not registered.** b. An interrupt of a type was not routed correctly so*    a handler for its type was not registered.** c. An interrupt of a type was routed correctly to EL3,*    but was deasserted before its pending state could*    be read. Another interrupt of a different type pended*    at the same time and its type was reported as pending*    instead. However, a handler for this type was not*    registered.** a. and b. can only happen due to a programming error.* The occurrence of c. could be beyond the control of* Trusted Firmware. It makes sense to return from this* exception instead of reporting an error.*/bl   get_interrupt_type_handlercbz   x0, interrupt_exit_\labelmov    x21, x0mov  x0, #INTR_ID_UNAVAILABLE/* Set the current security state in the 'flags' parameter */mrs  x2, scr_el3ubfx x1, x2, #0, #1/* Restore the reference to the 'handle' i.e. SP_EL3 */mov  x2, x20/*  x3 will point to a cookie (not used now) */mov   x3, xzr/* Call the interrupt type handler */blr x21interrupt_exit_\label:/* Return from exception, possibly in a different security state */b   el3_exit.endm

剖析该段汇编的关键代码:

bl   get_interrupt_type_handler   //获取注册的中断处理函数, 返回函数地址,保存在X0中
cbz x0, interrupt_exit_\label
mov x21, x0  //X0保存到了X21中
.....
blr x21  //跳转到X21,就是跳转到ATF中的中断处理函数

在linux、optee、ATF中的中断异常向量表相关推荐

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

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

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

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

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

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

  4. optee的异常向量表-(irq,fiq,svc...)

    文章目录 1. optee中的异常向量表thread_excp_vect 1.1.异步异常elx_irq.elx_fiq中断的处理 1.2.同步异常el0_sync_a64.el0_sync_a32中 ...

  5. 【中断】异常和中断的关系、异常向量表和中断向量表的关系

    Linux中断知识汇总: [深入理解Linux内核][中断]内容汇总帖 目录 什么是异常? 什么是中断? 异常和中断的关系 什么是异常向量表? 什么是中断向量表? 异常向量表和中断向量表的关系 什么是 ...

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

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

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

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

  8. TEE OS中断篇(三):中断的向量表

    REE侧.TEE侧以及Monitor模式或EL3都可接收中断信号. 在系统中存在两个VBAR寄存器和一个MVBAR寄存器,REE侧的VBAR寄存器中存放的是Linux内核的异常向量表基地址,OP-TE ...

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

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

最新文章

  1. tar命令-压缩,解压缩文件
  2. UA OPTI570 量子力学34 Harmonic Perturbation简介
  3. Javacript Remove Elements from Array
  4. C++ 预备知识
  5. oracle性能调整的九大要点:四诊断latch竞争
  6. Kafka精华问答 | Kafka的主要应用场景有哪些?​
  7. MySQL binlog_error_action分析
  8. Web报表工具iReport 1.2.2 详解
  9. 【阳谋】学会这几招,年底晋升不慌了!
  10. MAT插件分析内存泄露之二
  11. 如果有人私信,吾看到后都会及时回答
  12. Tomcat修改端口号图文详解
  13. 显色指数(CRI)计算软件-升级版可视化界面这个人大家自己斟酌人品
  14. 《C语言程序设计》讲义
  15. 打印没反应/打印耗时长/not accessible
  16. Python实现求中位数
  17. scala 定义空的list_Scala List(列表)
  18. word模板填充数据,导出PDF
  19. 阿拉伯数字转化为中文大写
  20. 六边形算法java_六边形架构 Java 实现

热门文章

  1. python猜拳游戏三局两胜制_python石头剪刀布小游戏(三局两胜制)
  2. Paper之IEEERSJ:2009年~2019年机器人技术(IEEE机器人和自动化国际会议RSJ智能机器人与系统国际会议机器人技术:科学与系统机器人学报)历年最佳论文简介及其解读
  3. Python语言学习之时间那些事:python和时间的使用方法之详细攻略
  4. Paper:《Hidden Technical Debt in Machine Learning Systems—机器学习系统中隐藏的技术债》翻译与解读
  5. 路径选择算法|Floyd算法|Dijkstras算法(带GUI界面带实验报告)
  6. java计算两地距离(公里)
  7. loadrunner与事务有关的函数
  8. android中使用哪种方式解析XML比較好
  9. UVALive 3026 Period (KMP算法简介)
  10. Eclipse中查看没有源码的Class文件的方法