在linux、optee、ATF中的中断异常向量表
目录
- 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中的中断异常向量表相关推荐
- [ARM异常]-linux中(aarch/aarch64)异常向量表介绍
文章目录 1.ARM的异常向量表基地址寄存器--VBAR 1.1.armv8 : VBAR寄存器 1.2.armv7 : VBAR寄存器 2.ARM的异常向量表的定义 2.1 armv8 :异常向量表 ...
- [optee]-optee中的异常向量表的实现
Optee异常向量表 ARMV8-aarch64 1.optee中定义的异常向量表 2.optee中设置向量表基地址VBAR_EL1 ARMV8-aarch32.ARMV7-aarch32 1.opt ...
- Linux内核异常向量表在哪,ARM64的启动过程之(六):异常向量表的设定
ARM64的启动过程之(六):异常向量表的设定 作者:linuxer 发布于:2015-11-24 18:22 分类:ARMv8A Arch 一.前言 本文主要描述了4.1.10内核初始化过程中如何初 ...
- optee的异常向量表-(irq,fiq,svc...)
文章目录 1. optee中的异常向量表thread_excp_vect 1.1.异步异常elx_irq.elx_fiq中断的处理 1.2.同步异常el0_sync_a64.el0_sync_a32中 ...
- 【中断】异常和中断的关系、异常向量表和中断向量表的关系
Linux中断知识汇总: [深入理解Linux内核][中断]内容汇总帖 目录 什么是异常? 什么是中断? 异常和中断的关系 什么是异常向量表? 什么是中断向量表? 异常向量表和中断向量表的关系 什么是 ...
- [ATF]-ATF的异常向量表介绍-(irq,fiq,smc,hyc...)
文章目录 1.同步异常向量表-(smc) 1.1.handle_sync_exception调用smc_handler64处理同步异常 2.异类步异常向量表-(irq,fiq...) 2.1.get_ ...
- 中断向量表 异常相量表 中断向量(中断函数入口地址)ARM和X86异常向量表不同
STM32的中断向量表是干什么的?到底有什么用?它放在哪里? 一.中断向量表里有什么?它放在那里?到底有什么用? 1.中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x0 ...
- TEE OS中断篇(三):中断的向量表
REE侧.TEE侧以及Monitor模式或EL3都可接收中断信号. 在系统中存在两个VBAR寄存器和一个MVBAR寄存器,REE侧的VBAR寄存器中存放的是Linux内核的异常向量表基地址,OP-TE ...
- 【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )
一. 异常向量表 1. 异常相关概念 (1) 异常 (2) 异常类型简介 2. 异常处理 (1) 异常处理 二. 异常向量表代码编写 1. 初始化异常向量表模块代码 2. 链接器脚本 3. Makef ...
最新文章
- tar命令-压缩,解压缩文件
- UA OPTI570 量子力学34 Harmonic Perturbation简介
- Javacript Remove Elements from Array
- C++ 预备知识
- oracle性能调整的九大要点:四诊断latch竞争
- Kafka精华问答 | Kafka的主要应用场景有哪些?​
- MySQL binlog_error_action分析
- Web报表工具iReport 1.2.2 详解
- 【阳谋】学会这几招,年底晋升不慌了!
- MAT插件分析内存泄露之二
- 如果有人私信,吾看到后都会及时回答
- Tomcat修改端口号图文详解
- 显色指数(CRI)计算软件-升级版可视化界面这个人大家自己斟酌人品
- 《C语言程序设计》讲义
- 打印没反应/打印耗时长/not accessible
- Python实现求中位数
- scala 定义空的list_Scala List(列表)
- word模板填充数据,导出PDF
- 阿拉伯数字转化为中文大写
- 六边形算法java_六边形架构 Java 实现
热门文章
- python猜拳游戏三局两胜制_python石头剪刀布小游戏(三局两胜制)
- Paper之IEEERSJ:2009年~2019年机器人技术(IEEE机器人和自动化国际会议RSJ智能机器人与系统国际会议机器人技术:科学与系统机器人学报)历年最佳论文简介及其解读
- Python语言学习之时间那些事:python和时间的使用方法之详细攻略
- Paper:《Hidden Technical Debt in Machine Learning Systems—机器学习系统中隐藏的技术债》翻译与解读
- 路径选择算法|Floyd算法|Dijkstras算法(带GUI界面带实验报告)
- java计算两地距离(公里)
- loadrunner与事务有关的函数
- android中使用哪种方式解析XML比較好
- UVALive 3026 Period (KMP算法简介)
- Eclipse中查看没有源码的Class文件的方法