ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常
1.前言
本文介绍异常相关内容,包括异常类型,异常进入,异常返回,异常层次结构,异常的路由等
2. RESET
- ARMV8体系结构支持两种类型的RESET
Cold reset:Reset PE所有的逻辑,包括集成的debug功能
Warm reset:Reset PE所有的逻辑,不包括集成的debug功能
注:ARMV8也支持外部debug reset
- Reset时pe进入最高的异常级别
- 运行状态
(1)Reset后最高异常级别可以选用任何一种运行状态
(2)cold reset由输入信号配置,warm reset由RMR_ELx.AA64配置
(3)如果reset后最高异常级别选用A64,则
a).选用SP_ELx
b).Reset向量的执行地址由厂商定义,RVBAR持有向量地址
3. 异常处理
3.1 AArch64 state异常处理流程
|
流程 |
说明 |
|
1、保存PSTATE 数据到SPSR_ELx,(x = 1,2,3) |
异常返回时需要从SPSR_ELx中恢复PSTATE |
|
2、保存异常进入地址到ELR_ELx,同步异常(und/abt等)是当前地址,而异步异常(irq/fiq等)是下一条指令地址 |
64位架构LR和ELR是独立分开的,这点和32位架构有所差别 |
|
3、保存异常原因信息到ESR_ELx |
ESR_ELx.EC代表Exception Class,关注这个bit |
|
4、PE根据目标EL的异常向量表中定义的异常地址强制跳转到异常处理程序 |
跳转到哪个EL使用哪个向量偏移地址又路由关系决定 |
|
5、堆栈指针SP的使用由目标EL决定 |
(SPSR_ELx.M[0] == 1) ? h(ELx): t(EL0) |
3.2 AArch32 state异常处理流程
|
流程 |
说明 |
|
1、PE根据异常类型跳转到对应的异常模式x, x = {und/svc/abt/irq/fiq/hyp/mon} |
PE跳转到哪一种模式通常由路由关系决定 |
|
2、保存异常返回地址到LR_x,用于异常返回用 |
LR也是对应模式的R[14]_x寄存器,32位系统下LR和ELR是同一个寄存器,而64位是独立的 |
|
3、备份PSTATE 数据到SPSR_x |
异常返回时需要从SPSR_x恢复PSTATE |
|
4、PSTATE 操作: PSTATE.M[4:0]设置为异常模式x PSTATE.{A,I,F} = 1 PSTATE.T = 1,强制进入A32模式 PSTATE.IT[7:2] = “00000” |
PSTATE.M[4]只是对32位系统有效,64为下是保留的,因为64位下没有各种mode的概念. 异常处理都要切换到ARM下进行; 进入异常时需要暂时关闭A,I,F中断; |
|
5、据异常模式x的向量偏移跳转到进入异常处理 |
各个mode有对应的Vector base addr + offset |
3.3 AArch64异常向量表偏移量
|
exception level迁移情况 |
Synchronous exception的offset值 |
IRQ和vIRQ exception的offset值 |
FIQ和vFIQ exception的offset值 |
SError和vSError exception的offset值 |
|
同级exception level迁移,使用SP_EL0。例如EL1迁移到EL1 |
0x000 |
0x080 |
0x100 |
0x180 |
|
同级exception level迁移,使用SP_ELx。例如EL1迁移到EL1 |
0x200 |
0x280 |
0x300 |
0x380 |
|
ELx迁移到ELy,其中y>x并且ELx处于AArch64状态 |
0x400 |
0x480 |
0x500 |
0x580 |
|
ELx迁移到ELy,其中y>x并且ELx处于AArch32状态 |
0x600 |
0x680 |
0x700 |
0x780 |
|
注:每个异常等级都有一个关联的 Vector Base Address Register (VBAR),它定义了每个异常等级向量表的基址 |
||||
.
4. 异常返回
如下为AArch64 ERET异常返回流程:
|
1. 用ELR_ELx恢复PC值 |
|
2. SPSR_ELx恢复PSTATE值 |
|
注:ERET指令同时会为执行ERET指令的PE设置event register,reset local monitor |
5.异常层级控制

表 异常层级的控制
5.1 EL3异常层级系统寄存器控制
|
SCR_EL3 |
SCTLR_EL3 |
MDCR_EL3 |
|
|
NS:决定了EL1和EL0的安全状态; |
{A, SA}:使能对齐检查,A-EL3访问数据时做对齐检查;SA-EL3对SP做对齐检查; |
{EPMAD, EDAD}: 使能外部debugger访问; |
|
|
RW:决定了低一级的异常等级运行状态; |
{M, C, I, WXN}: 内存系统控制位; |
{SPME, SDD, SPD32}: 安全debug控制; |
|
|
{EA, FIQ, IRQ}:EA-SError和同步Aborts切换到EL3;FIQ-物理FIQ切换到EL3;IRQ-物理IRQ切换到EL3; |
EE:定义了端; |
{TDOSA, TDA, TPM}: 陷阱控制 |
|
|
SMD:禁用SMC; |
|||
|
HCE:使能Hypervisor call异常; |
|||
|
ST:使能secure EL1访问secure timer; |
|||
|
SIF:安装指令获取,当secure state禁止从non secuer内存取指; |
|||
|
TWI:陷入WFI; |
|||
|
TWE:陷入WFE |
5.2 EL2异常层级系统寄存器控制
|
HCR_EL2 |
SCTLR_EL2 |
MDCR_EL2 |
HSTR_EL2 |
|
RW:决定了低一级的异常等级运行状态; |
{A, SA}: 使能对齐检查 |
{TDRA, TDOSA, TDA}: |
Tn, for values of n in the set {0-3, 5-13, 15}: |
|
{AMO, IMO, FMO}:路由物理中断到EL2 |
{M, C, I, WXN}: 内存系统控制位; |
TDE:路由从非安全EL0 EL1 EL2来的debug异常 |
|
|
{VSE, VI, VF}:设置虚拟中断pending; |
EE:定义了端; |
{TPM, TPMCR}:陷阱控制; |
|
|
VM: |
HPMN: |
||
|
{SWIO, PTW, FB, BSU, DC, CD, ID}: |
|||
|
HCD Hypervisor Call Disable |
|||
|
{TRVM, TDZ, TVM, TTLB, TPU, TPC, TSW, TACR, TIDCP, TSC, TID1, TID2, TID3, TWE, TWI}: |
|||
|
TGE: Trap General Exceptions |
5.3 EL1异常层级系统寄存器控制
| TLR_EL1 | MDSCR_EL1 | ||
|
{A, SA}: 使能对齐检查 |
{MDE, SS} | ||
|
{M, C, I, WXN}: 内存系统控制位; |
KDE: |
||
|
EE:定义了端; E0E:EL0端; UMA:非特权mask访问 |
TDCC: | ||
| {SED, ITD, CP15BEN}: |
6. 同步异常类型、路由和优先级
6.1 同步异常类型
|
异常类型 |
描述 |
|
Undefined Instruction |
未定义指令异常 |
|
Illegal Execution State |
非法执行状态异常 |
|
System Call |
系统调用指令异常(SVC/HVC/SMC) |
|
Misaligned PC/SP |
PC/SP未对齐异常 |
|
Instruction Abort |
指令终止异常 |
|
Data Abort |
数据终止异常 |
|
Debug exception |
软件断点指令/断点/观察点/向量捕获/软件单步 等Debug异常 |
6.2 同步异常路由
如果HCR_EL2.TGE为1,None-secure EL0下的异常不会传递给None-secure EL1,而是直接传递给EL2
6.3 同步异常优先级
|
优先级 |
说明 |
|
1 |
单步异常 |
|
2 |
PC对齐错误异常 |
|
3 |
指令终止异常 |
|
4 |
断点异常或向量捕获异常?? |
|
5 |
非法执行状态异常 |
|
6 |
HSTR_EL2.Tn和HCR_EL2.TIDCP设置使得异常从EL1传递给EL2 |
|
7 |
指令未定义异常 |
|
8 |
除1-7外,通过设置HCR_EL2.TGE 为1,使得异常从EL1传递到EL2 |
|
9 |
设置HSTR_EL2.Tn和HCR_EL2.TIDCP使得异常从EL0传递到EL2 |
|
10 |
配置CPTR_EL2使得异常传递给EL2 |
|
11 |
通过配置HCR_EL2, other than the TIDCP bit 或 CNTHCTL_EL2 或MDCR_EL2使得异常传递给EL2 |
|
12 |
除1-11外,通过配置其它一些寄存器使得异常传递给EL2 |
|
13 |
SCR_EL3.SMD设为1,导致SMC指令未定义产生的异常 |
|
14 |
执行了异常产生指令而产生的异常 |
|
15 |
配置CPTR_EL3使得异常传递给EL3 |
|
16 |
AArch32 Secure EL1 trap到EL3指令的执行使得异常传递给EL3 |
|
17 |
配置MDCR_EL3使得EL0 EL1 EL2的异常都传递给EL3 |
|
18 |
除1-17外,通过配置其它一些寄存器使得异常传递给EL3 |
|
19 |
Trapped 浮点异常 |
|
20 |
SP对齐异常 |
|
21 |
数据终止异常,不是translation table walk产生的同步外部终止异常除外 |
|
22 |
Watchpoint异常 |
|
23 |
数据终止异常,由translation table walk产生的同步外部终止异常 |
7. 异步异常(中断)类型、路由和优先级
7.1 异步异常(中断)类型
|
类型 |
描述 |
|
SError or vSError |
系统错误类型,包括外部数据终止 |
|
IRQ or vIRQ |
外部中断 or 虚拟外部中断 |
|
FIQ or vFIQ |
快速中断 or 虚拟快速中断 |
7.2 异步异常(中断)路由
- AArch32与AArch64路由控制位对比
|
Execution State |
异步异常(中断) |
路由控制位(按优先级排列. 1允许 0禁止) |
|
AArch32 |
Asynchronous Data Abort (异步数据终止) |
SCR.EA HCR.TGE HCR.AMO |
|
IRQ or vIRQ |
SCR.IRQ HCR.TGE HCR.IMO |
|
|
FIQ or vFIQ |
SCR.FIQ HCR.TGE HCR.FMO |
|
|
AArch64 |
SError or vSError |
SCR_EL3.EA HCR_EL2.TGE HCR_EL2.AMO |
|
IRQ or vIRQ |
SCR_EL3.IRQ HCR_EL2.TGE HCR_EL2.IMO |
|
|
FIQ or vFIQ |
SCR_EL3.FIQ HCR_EL2.TGE HCR_EL2.FMO |
|
|
注:若HCR_EL2.TGE ==1所有的虚拟中断将被禁止,HCR.{AMO,IMO,FMO} HCR_EL2.{AMO,IMO,FMO}被当成1处理. |
||
- 最高异常级别使用AArch64异步异常路由规则
|
EL2和EL3都实现的路由规则 |
1. 若SCR_EL3.{EA, FIQ, IRQ} == 1,则所有相应的SError\FIQ\IRQ 中断都被路由到EL3; 2. 若HCR_EL2.{AMO, IMO, FMO} == 1,则EL1/EL0所有对应的SError\FIQ\IRQ中断都被路由到EL2,同时使能对应的虚拟中断VSE,VI,VF; 3. 若HCR_EL2.TGE == 1,那么会忽略HCR_EL2.{AMO, IMO, FMO}的具体值,直接当成1处理,则EL1/EL0所有对应的SError\FIQ\IRQ中断都被路由到EL2,同时禁止所有虚拟中断 注意: SCR_EL3.{EA, FIQ, IRQ}bit的优先级高于HCR_EL2.{AMO, IMO, FMO} bit优先级,路由优先考虑SCR_EL3 |
|
EL3实现,EL2没实现的路由规则 |
![]() |
|
EL3没实现,EL2实现的路由规则 |
|
如上三条路由规则的流程图表示如下:

图 最高异常级别使用AArch64异步异常路由规则
7.3 异步异常(中断)mask
- 运行在AArch64 state的异常mask规则
|
当一个中断被mask,则这个中断发生时不会被传递 |
|
|
目标异常等级 < 当前的异常等级 |
中断自动被mask |
|
目标异常等级 == 当前异常等级相同 |
通过PSTATE.A(SError) PSTATE.I(IRQ) PSTATE.F(FIQ)来mask对应中断 |
|
目标异常级别 > 当前异常级别 |
|
|
如果本异常级别下PSTATE.{A, I, F}都设为1,则传递到本异常级别的任何中断都被mask |
|
- 最高异常级别使用AArch64时中断mask对中断路由的影响
|
实现了EL2和EL3的物理中断masking |
|
|
实现EL3但没有实现EL2的物理中断masking |
![]() |
|
实现EL2但没有实现EL3的物理中断masking |
![]() |
|
注: A---无论处理器状态mask为何值,中断发生时都会被传递 B---如果mask为1则中断发生时不会被传递,mask为0中断发生时会被传递 C---无论处理器状态mask为何值,中断发生时都不会被传递 |
|
7.5 虚拟中断规则
|
当HCR_EL2.TGE 为 0设置 HCR_EL2.{FMO, IMO, AMO}路由控制位为1使能对应的虚拟中断 |
|
当HCR_EL2.TGE为1所有的虚拟中断被禁用 |
|
虚拟中断只能从Non-secure EL0或Non-secure EL1传递到Non-secure EL1 |
|
当一个虚拟中断类型被使能时,虚拟中断可以通过如下几种方式产生:
当一个虚拟中断类型被禁用: 1. 这个虚拟中断不能被传递; 2. ISR_EL1中不会看到; |
7.6. 中断优先级与中断识别
|
同步事件之前如果有任何中断pending,中断将在同步事件之后的第一条指令前被捕获 同步事件包括如下: |
|
ISB指令的执行 |
|
异常进入 |
|
异常返回 |
|
退出debug状态 |
7.7. 多寄存器load/store期间发生异常的处理
|
Single-reg load/single-reg store |
Single load/single store访存期间发生的中断会被捕获处理 |
|
Multy-regs load/multy- regs store |
8.参考文档
[1] DDI0487A_k_armv8_arm_iss10775.pdf
ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常的更多相关文章
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST
1.前言 ARMV8系统级编程模型主要包括异常级别.运行状态.安全状态.同步异常.异步异常.DEBUG 本文主要对系统级编程模型做一个概要介绍 2. 异常级别 2.1 Exception level概 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它
1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器
1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型
1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性 2. 存储系统体系结构 2.1. 地址空间 指令地址空间溢出 指令地址计算((address_of ...
- ARMV8 datasheet学习笔记5:异常模型
1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架 ...
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构
1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...
- ARMV8 datasheet学习笔记1:预备知识
1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer
1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支 ...
- ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Self-hosted debug
1. 前言 2. 关于self-hosted debug Debugger调试器 是操作系统或系统软件的一部分,它会处理debug exception或修改debug system register, ...
随机推荐
- SharePoint 错误集 2
1 Run command “New-SPConfigurationDatabase" Feature Description: error message popup after run ...
- bzoj4504 K个串 (优先队列+主席树)
首先如果没有出现次数的限制的话,这题就是超级钢琴 但由于有了这个限制,不能简单地用前缀和 考虑顺着做的时候每个点的贡献,如果a[i]=x,x上次出现位置是lst[x](可以用一个map来记),那它会给 ...
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
AlertDialog.Builder builder = new Builder(this); builder.create().show(); 这样显示出来的对话框,当用户按返回键或搜索键时,这个 ...
- Sublime Text3—Code Snippets(自定义代码片段)
摘要 程序员总是会不断的重复写一些简单的代码片段,为了提高编码效率,我们可以把经常用到的代码保存起来再调用. 平时用sublime安装各种插件,使用Tab键快速补全,便是snippets(可译为代码片 ...
- hiho一下 第144周(机会渺茫)解题报告及拓展
题目1 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求: ...
- poj3070_斐波那契数列(Fibonacci)
用矩阵求斐波那契数列,快速幂log(n),只用求最后4位(加和乘的运算中前面的位数无用) #include <stdio.h> #include <stdlib.h> int ...
- R语言画棒状图(bar chart)和误差棒(error bar)
假设我们现在有CC,CG,GG三种基因型及三种基因型对应的表型,我们现在想要画出不同的基因型对应表型的棒状图及误差棒.整个命令最重要的就是最后一句了,用arrows函数画误差棒.用到的R语言如下: d ...
- VS2010程序崩溃,报错Unhandled exception at **.exe:0xC0000005: Access violation reading location 0x000000008899.
最近被派到另外一个组支援,从而从Linux下开发暂转到Windows下开发,个人觉得Windows自己搞的一套并不那么完美,坑多. 网文可能出现的原因: 未处理的异常: 0xC0000005: 读取位 ...
- 地址空间格局随机化ASLR
Address space layout randomization(ASLR)是一种参与保护缓冲区溢出问题的一个计算机安全技术.是为了防止攻击者在内存中能够可靠地对跳转到特定利用函数.ASLR包括随 ...
- make_blobs
一.make_blobs简介 scikit中的make_blobs方法常被用来生成聚类算法的测试数据,直观地说,make_blobs会根据用户指定的特征数量.中心点数量.范围等来生成几类数据,这些数据 ...


