请阅读【ARMv8/v9 ARM64 System Exception】
文章目录
下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - ARM64 Process State 介绍
1. ARMv8 异常模型简介
1.1 ARM Traps 的详细解释
“Trap” 是计算机科学中常用的术语,它是一种由软件触发的中断或异常,用来调用操作系统内核的服务,或者响应可能的错误情况。
在ARM架构中,包括但不限于以下几种常见的 trap:
-
系统调用:应用程序可以通过执行特殊的指令(例如SVC)来触发一个trap,请求操作系统内核提供服务,例如读写文件、创建进程等。
-
异常处理:当发生一些异常情况,比如除以零、访问无效的内存地址、执行无效的指令等,处理器会触发一个trap,并跳转到预先定义好的异常处理程序。
-
调试支持:调试器可以通过设置断点来触发trap,当程序执行到断点处时,处理器会触发一个trap,并将控制权交给调试器。例如ARM的BRK指令就可以用来生成一个软件断点。
当trap被触发时,处理器会保存当前的程序计数器等状态信息,然后跳转到预先定义好的处理程序。这个处理程序可以是操作系统内核的一部分,也可以是一个调试器的一部分。处理程序可以检查和修改处理器的状态,然后决定如何继续执行程序。
总的来说,trap是一种重要的机制,它使得软件可以与操作系统内核、调试器等更低层次的系统进行交互,也使得处理器可以更有效地响应错误和异常情况。
1.2 ARMv8-A General-Puspose Registers
ARM8v-A提供了31个通用寄存器,分别是X0-X30。还有SP、PC、XZR等寄存器, 每个寄存器是64bits,可以在任何 Exception Level访问。
下面详细介绍写这些通用寄存器(general-purpose registers
):
X0-X7
用于参数传递;
X9-X15
在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低,
在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低;
X19-X29
在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre,
在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre;
X8, X16-X18, X29, X30
这些都是特殊用途的寄存器
X8
: 用于返回结果
X16、X17
:进程内临时寄存器
X18
:resrved for ABI
X29
:FP(frame pointer register)
X30
:LR:链接寄存器(LR)在进行子程序调用时存储返回地址。如果返回地址存储在堆栈中,它也可以用作通用寄存器, LR会映射到寄存器X30。
1.3 系统寄存器
ARMv8-A 除过提供了31个通用寄存器外,还提有一些非常重要的系统寄存器:
系统配置通过系统寄存器进行控制,并使用msr
和mrs
指令进行访问。寄存器的名称会告诉你可以访问它的最低异常级别,具有后缀_ELn
的系统寄存器在各异常级别中有一个独立的副本。
寄存器 | 名称 | 功能 |
---|---|---|
SCR_EL3 | 安全配置寄存器 | 安全配置寄存器SCR_EL3是一个定义当前Security状态的配置寄存器,它指定EL0、EL1、EL2的安全状态,“安全”状态为“安全”或者“不安全”。 |
ELR_ELn | 异常链接寄存器 | 存放异常返回地址 |
SP_ELn | 栈顶指针寄存器 | |
SPSR | ||
FAR_ELn | 错误的地址寄存器 | |
ESR_ELn | 异常原因寄存器 | 描述异常原因 |
CTR_EL0 | 缓存寄存器 | 与cpu缓存信息相关 |
ID_AA64ISAR0_EL1 | 指令实现寄存器 | |
TCR_ELn | 翻译控制寄存器 | 用来控制MMU使用页表相关;x=1或者2 |
SCTLR_ELn | 系统控制寄存器 | 用来控制mmu、缓存、对齐检查等ARM架构特性相关的特性 ,x=1或者2或者3 |
HCR_EL2 | 虚拟化配置寄存器 | 用来保存控制虚拟化状态,只能EL2使用 |
SCR_EL3 | 安全配置寄存器 | 用来保存控制安全状态,只能EL3使用 |
1.2.0 SCR_EL3 安全配置寄存器
位数 | 名称 | 含义 |
---|---|---|
63 | RES0 | 保留的 |
62 | NSE | 该字段表示根据SCR_EL3.NS,选择EL2及以下Exception级别的Security状态。 |
61:49 | RES0 | 保留的 |
48 | GPF | 控制颗粒保护故障在EL0、EL1和El2的上报。
|
47:42 | RES0 | 保留的 |
41 | EnTP2 | 在EL2、EL1和EL0上执行的trap指令(比如访问TPIDR2_EL0)陷入到EL3。
|
40 | TRNDR | RNDR和RNDRRS读取是否捕获。
|
39 | RES0 | 保留的 |
38 | HXEn | 允许从EL3访问EL2上的HCRX_EL2寄存器。
|
37 | ADEn | 允许EL1和EL2上访问ACCDATA_EL1寄存器。
|
36 | EnAS0 | 在EL0, EL1或EL2触发ST64BVO指令异常是否路由到EL3。
|
35 | AMVOFFEN | 活动监视器虚拟偏移使能。
|
34 | TME | 允许在EL0、EL1和EL2上访问TSTART、TCOMMIT、TTEST和TCANCEL指令。
|
33:30 | TWEDEL | TWE延迟。当SCR_EL3.TWEDEn 为1,由SCR_EL3 引起的WFE *陷阱的最小延迟为2的(TWEDEL + 8)次方,单位周期。 |
29 | TWEDEn | TWE推迟启用。让由SCR EL3.TWE 引起的WFE*指令延迟陷入可配置。
|
28 | ECVEn | ECV启用,启用对CNTPOFF_EL2寄存器的访问。
|
27 | FGTEn | 细粒度的陷阱使能。控制对HAFGRTR_EL2 , HDFGRTR_EL2 , HDFGWTR_EL2 , HFGRTR_EL2 , HFGITR_EL2 ,和HFGWTR_EL2 ,寄存器的访问。
|
26 | ATA | 分配标签访问,控制在EL2, EL1和EL0对分配标签的访问。
|
25 | EnSCXT | 使能对SCXTNUM_EL2 、SCXTNUM_EL1 和SCXTNUM_ELO 寄存器的访问。
|
24:22 | RES0 | 保留的 |
21 | FIEN | 故障注入启用。在EL1和EL2访问寄存器ERXPFGCDN_EL1 , ERXPFGCTL_EL1 和ERXPFGF_EL1 的结果。
|
20 | NMEA | 屏敝外部中止。当SCR_EL3.EA 等于1时,
|
19 | EASE | 外部中断到SError中断向量。同步执行到EL3的外部终止异常会被执行到的位置,
|
18 | EEL2 | 安全EL2启用。
|
17 | API | 控制与指针身份验证相关的下列指令的使用。
|
16 | APK | 当APK被设置为1,对持有EL1或EL2指针认证“键”值的寄存器的访问被捕获到EL3,除非它们由于HCR_EL2.APK位或其他陷阱而被捕获到EL2。 |
15 | TERR | Trap错误记录访问。
|
14 | TLOR |
|
13 | TWE | 当被设置为1,在任何低于EL3的异常级别上执行WFE指令的任何尝试都会被捕获到EL3 |
12 | TWI | 当被设置为1,在任何低 于EL3 的异常级别上执行WFI指令的任何尝试都会被捕获到EL3 |
11 | ST | 当被设置为1, Secure EL1访问 counter timer 物理安全计时器寄存器会被捕获到EL3 |
10 | RW | 对较低异常级别的执行状态控制。
|
9 | SIF | 安全指令取出。当PE处于Secure状态时,在翻译的第一阶段标记为Non-secure,该位决定是否允许从翻译的第一阶段标记为不安全的内存中提取安全状态指令。
|
8 | HCE | Hypervisor调用指令启用。
|
7 | SMD | 安全监控呼叫禁用。
|
6 | RES0 | 保留的 |
5:4 | RES1 | 保留的 |
3 | EA | 外部中止和错误中断路由。当在EL3以下的异常级别执行时,External aborts和SError中断会不会被路由到EL3。
|
2 | FIQ | 物理FIQ路由。 当在EL3以下的异常级别执行时,物理FIQ中断会不会被路由到EL3。
|
1 | IRQ | 物理IRQ路由。 当在EL3以下的异常级别执行时,物理IRQ中断会不会被路由到EL3。
|
0 | NS | 不安全位。该字段与SCR_EL3.NSE 选择EL2 及更低异常水平的安全状态。 当 NSE 为0时:
|
1.2.1 ELR_ELn 异常链接寄存器
有三个异常链接寄存器,ELR_EL1
,ELR_EL2
和ELR_EL3
,对应3个异常级别。
当发生异常时,目标异常级别的异常链接寄存器存储在异常处理完成后跳转到的返回地址。
如果异常取自AArch32
状态,则ELR
中的前32位都设置为零。异常级别内的子程序调用使用LR
存储子程序的返回地址。
例如,当异常级别从EL0
更改为EL1
时,返回地址存储在ELR_EL1
中。
1.2.2 SP_ELx 寄存器
Stack Pointer
: 栈顶指针寄存器,用来描述各个栈顶的指针寄存器。这个寄存器在每个EL都会存在一个SP_EL0
, SP_EL1
, SP_EL2
, SP_EL3
. 通过此寄存器就可以确定当前在那个EL
1.2.3 SPSR 寄存器
当异常发生时,处理器的状态将会被保存到相关的SPSR寄存器中。异常发生后,在处理异常之前,处理器会自动的将PSTATE寄存器的内容保存到SPSR中,异常返回时,会将SPSR保存的处理器状态恢复到PSTATE中。ARMv8定义的SPSR寄存器如下,兼容ARMv7中的SPSR寄存器,只使用低32位。
在ARMv8架构中,有3个SPSR寄存器,分别为SPSR_EL1
、SPSR_EL2
、SPSR_EL3
。使用那个SPSR寄存器依赖于异常级别。若异常级别为EL1,则使用SPSR_EL1
,若异常级别为EL2,则使用SPSR_EL2
,若异常级别为EL3,则使用SPSR_EL3
。
ELR_ELn和SPSR_ELn寄存器和异常级别相关联,始终保存着低于当前异常级别的处理器状态。
位域 | 功能 |
---|---|
N | 符号位(N flag) |
Z | 0标志(Z flag) |
C | 操作进位(C flag) |
V | 溢出标志(V flag) |
Q | |
IT[1:0] | |
DIT | |
SSBS | |
PAN | |
SS | 用于软件调试。异常发生的时候,通过设置MDSCR_EL1.SS为1启动单步调试机制 |
IL | 不合法的执行状态(非法异常),保存自PSTATE.IL |
GT | |
IT[7:2] | |
E | |
A | 软件错误掩码位 |
I | IRQ掩码位 |
F | FIQ掩码位 |
T | |
M[4] | 发生异常时处理器的执行状态,0表示AArch64 |
M[3:0] | M[3:2]发生异常的级别;M[1]保留;M[0]根据此选择栈指针寄存器,
|
1.2.4 FAR_ELx 寄存器
FAR_ELx (Fault Address Register)
错误的地址寄存器:
当取指令或取数据时,PC对齐错误或者watchpoint异常(PC alignment fault and Watchpoint exceptions),会将错误的地址填入到该寄存器中。
1.2.5 ESR_ELn Register
异常原因寄存器,ESR_ELn
寄存器有三段标志位。
ESR_ELn寄存器的第一段是 EC,bits[31:26]
,标志了39个异常原因。
在同步异常或 SError中断异常,ESR_ELn
负责给出异常发生的原因。
ESR_ELn寄存器同样是3个特权异常等级都有的。
- 第一类是
WFI
/WFE
(wait for interrupt/event,停止时钟但不断电)指令的异常。 - 第二类是
MCR
/MRC
/MCRR
/MRRC/LDC
/STC
等指令产生的异常,这些一般都是在搬数据。 - 第三类是其他
SVE
(可扩展向量??不太清楚)SIMD
(单次执行多操作数)VMRS
(浮点计算结果相关)产生的异常。该类是 Illegal Execution state的异常,PSTATE.IL
置位后还执行了命令。 - 第四类是
SVC
HVC
SMC
异常,就是对syscall、hypercall、EL3切换的支持了。 - 第五类是 ERET(异常返回指令) ERETAA ERETAB指令执行的异常。
- 第六类是指令中止、数据中止类异常,包含从低EL级向高EL级以及同EL级的异常。
- 第七类是PC SP对齐异常。
- 第八类是debug相关的异常。
ESR_ELn 寄存器的第二段 IL bit[25],这个位指示同步异常的指令长度,0
对应16bit,1
为32bit,当抓到32bit指令的异常,这个值还会在如下异常用到:
- SError中断异常
- 指令中止异常
- PC、SP对齐失败异常
- 数据中止异常
- Illegal Execution state异常
- debug异常
- 未知异常
ESR_ELn寄存器的第三段 ISS Instruction specific syndrome field, bit[24:0]
是在 EC
段指定异常后的一些附带信息,这一区域对于不同类型的异常可以被独立定义,但是实际使用中,一些ISS
编码被用于不止一种异常类型。
Bits | field | description |
---|---|---|
[63:37] | Reserved, RES0,读为零 | |
[36:32] | ISS2 | |
[31:26] | EC(Exception Class) | 异常原因:
|
[25] | IL(Instruction Length) | 显示异常时的指令长度:
|
[24:0] | ISS(Instruction Specific Syndrome) | 不同的异常类型有不同的含义: |
1.2.6 MAIR_ELx Regiser
MAIR_EL1
, (Memory Attribute Indirection Register) 内存属性寄存器:
配置内存的属性,如:
- Tagged Normal Memory;
- Normal memory;
- Device memory
如果是 Normal memory,那么 inner 和 Outer 的配置是 Write-Through /Write-back/write Allocate/write non-Allocate等 属性。
1.2.7 SCTLR_ELx Register
系统控制寄存器SCTLR是一个用来控制标准内存、配置系统能力、提供处理器核状态信息的寄存器,包括SCTLR_EL1
、SCTLR_EL2
和SCTLR_EL3
,但并不是所有bit在EL1都可用。
寄存器各个字段介绍
bit | 含义 |
---|---|
UCI | 设置此位后,在AArch64中为DC CVAU、DC CIVAC、DC CVAC和IC IVAU指令启用EL0访问。 |
EE | 异常字节顺序。
|
EOE | EL0显式数据访问的字节序。
|
WXN | 写权限不可执行 XN (eXecute Never)。
|
nTWE | 不陷入WFE,此标志为1表示WFE作为普通指令执行 |
nTWI | 不陷入WFI, 此标志为1表示WFI作为普通指令执行 |
UCT | 此标志为1时,开启AArch64的EL0下访问CTR_EL0寄存器 |
DNE | EL0 下访问 DC AVA指令,
|
I | 开启指令缓存,这是在EL0和EL1下的指令缓存的启用位。对可缓存的正常内存的指令访问被缓存。 |
UMA | 用户屏蔽访问。当EL0使用AArch64,控制从EL0的中断屏蔽访问。 |
SED | 禁止SETEND。在EL0使用AArch32禁止SETEND指令。
|
ITD | 禁止IT指令。
|
CP | 15BEN CP15 barrier使能。如果实现了,它是AArch32 CP15 DMB,DSB和ISB barrier操作的使能位 |
SA0 | EL0的栈对齐检查使能位 |
SA | 栈对齐检查使能位 |
C | 数据cache使能。EL0和EL1的数据访问使能位。对cacheable普通内存的数据访问都被缓存 |
A | 对齐检查使能位 |
M | 使能MMU |
在 AArch32状态下,有HSCTLR
和 sctlr
寄存器,其中sctlr
寄存器是banked:
- SCTLR (NS)
- HSCTLR
- SCTLR (S)
重要的三个bit位:
- I : Instruction cache enable
- C : data cache enable
- M : mmu enable
1.2.8 TCR_ELx Register 翻译控制寄存器
翻译控制寄存器是第1阶段翻译状态的控制寄存器,包括TCR_EL1
、TCR_EL2
和TCR_EL3
。
位数 | 名称 | 含义 |
---|---|---|
63:60 | RES0 | 保留的 |
59 | DS | 当在翻译制度的第1阶段使用4KB和16KB翻译粒时,该字段影响52位输出寻址,包括翻译描述符、块描述符、页描述符的输出情况 |
58 | TCMA1 | 控制未检查访问的生成,
|
57 | TCMA0 | 控制未检查访问的生成,
|
56 | E0PD1 | 对由TTBR1_EL1转换的任何地址的非特权访问的故障控制。
|
55 | E0PD0 | 对由TTBR1_EL0转换的任何地址的非特权访问的故障控制。
|
54 | NFD1 | 该位控制是否对使用TTBR1_EL1 转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
|
53 | NFD1 | 该位控制是否对使用TTBR0_EL1 转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
|
52 | TBID1 | 使用指令地址的顶部字节进行地址匹配控制 。
|
51 | TBID0 | 使用指令地址的顶部字节进行地址匹配控制 。
|
50 | HWU162 | TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
|
49 | HWU161 | TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
|
48 | HWU160 | TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
|
47 | HWU159 | TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
|
46 | HWU062 | TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
|
45 | HWU061 | TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
|
44 | HWU060 | TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
|
43 | HWU059 | TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
|
42 | HPD1 | 分级权限禁用,影响TTBR1 EL1指向的翻译表中的一些控制位。
|
41 | HPD10 | 分级权限禁用,影响TTBR0 EL1指向的翻译表中的一些控制位。
|
40 | HD | 从EL0和EL1转换阶段1脏态的硬件管理。
|
39 | HA | 从EL0和EL1翻译的阶段1硬件访问标志更新。
|
38 | TBI1 | 最高字节忽略。
|
37 | TBI0 | 最高字节忽略。
|
36 | AS | ASID大小。
|
35 | RES0 | 保留的 |
34:32 | IPS | 中间物理地址大小。
|
31:30 | TG1 | TTBR1_EL1的颗粒大小。
|
29:28 | SH1 | 与使用TTBR1_EL1的翻译表有关的内存的可共享性属性。
|
27:26 | ORGN1 | 与使用TTBR1_EL1的翻译表有关的内存的外部缓存属性。
|
25:24 | IRGN1 | 与使用TTBR1_EL1的翻译表有关的内存的内部缓存属性。
|
23 | EPD1 | 控制是否在TLB miss上对使用TTBR1_EL1进行转换的地址执行转换表遍历。
|
22 | A1 | 选择是否是TTBR0_EL1或TTBR1_EL1定义ASID。
|
21:16 | T1SZ | TTBR1_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T1SZ)次方字节。T1SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。 |
15:14 | TG0 | TTBR0_EL1的颗粒大小。
|
13:12] | SH0 | 与使用TTBR0_EL1的翻译表有关的内存的可共享性属性。
|
11:10 | ORGN0 | 与使用TTBR0_EL1的翻译表有关的内存的外部缓存属性。
|
9:8 | IRGN0 | 与使用TTBR0_EL1的翻译表有关的内存的内部缓存属性:
|
7 | EPD0 | 控制是否在TLB miss上对使用TTBR0_EL1进行转换的地址执行转换表遍历。
|
6 | RES0 | 保留的 |
5:0 | T0SZ | TTBR0_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T0SZ)次方字节。T0SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。 |
1.2.9 CTR 缓存寄存器
缓存寄存器(CTR)是一个提供有关缓存架构的信息的寄存器,硬件上只有一个,就是CTR_EL0
,所以特权和非特权状态都是访问它。
位数 | 名称 | 含义 |
---|---|---|
63:38 | RES0 | 保留的 |
37:32 | TminLine | 标签最低线。在所有可以包含由PE控制的分配标签的缓存中,最小的缓存行中分配标签所覆盖的大小为2的n次方,单位为4字节。 |
31 | RES1 | 保留的 |
30 | RES0 | 保留的 |
29 | DIC | 指令缓存无效要求数据与指令一致性。 0: 数据与指令的一致性,需要指令缓存失效到统一点。 1:指令缓存失效到统一点,不需要数据到指令一致性。 |
28 | IDC | 数据缓存清理要求指令数据一致性。 0:数据缓存清理到统一点是要求指令的数据一致性; 1:数据缓存清理到统一点是不需要指令的数据一致性。 |
27:24 | CWG | 回写缓存颗粒。当缓存条目中的某个内存位置被修改后,删除该缓存条目可以覆盖的最大内存大小为2的n次方。 |
23:20 | ERG | 独占保留粒度,保留粒度的最大大小为2的n次方,单位4字节 |
19:16 | DminLine | PE控制的所有数据缓存和统一缓存中最小的缓存行大小为2的n次方,单位4字节 |
15:14 | L1Ip | 一级指令缓存策略。指示L1指令缓存的索引和标记策略。
|
13:4 | RES0 | 保留的 |
3:0 | IminLine | 由PE控制的所有指令缓存中最小的缓存行大小为2的n次方,单位为4字节 |
1.2.10 HCR_EL2 虚拟化配置寄存器
虚拟化配置寄存器(HCR_EL2)是一个用来为虚拟化提供配置控制的寄存器,包括定义各种操作是否被捕获到EL2。
位数 | 名称 | 含义 |
---|---|---|
63:60 | TWEDEL | TWE延迟: 当HCR_EL2.TWEDEn 为1,由HCR_EL2 引起的WFE*陷阱的最小延迟为2的(TWEDEL + 8)次方,单位周期。 |
59 | TWEDEn | TWE推迟启用: 让由HCR EL2.TWE 引起的WFE*指令延迟陷入可配置。0:陷入的延迟是已经定义的; 1:陷入的延迟至少是 SCR_EL3.TWEDEL 中定义的周期数。 |
58 | TID5 | 陷入ID组5: 0:任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器5会被捕获到EL2 |
57 | DCT | 默认的可缓存性标记。当HCR_EL2.DC 实际上控制的是阶段1翻译被视为标记还是或未标记的。
|
56 | ATA | 分配标签访问,控制在EL1和EL0对分配标签的访问。 0:避免对分配标签的访问,访问 GCR_EL1, RGSR_EL1 , TFSR_EL1 , TFSR_EL2 或者TFSRE0_EL1会出现未定义指令异常并且陷入EL2;1:允许对分配标签的访问 |
55 | TTLBOS | 操作于外层共享域的TLB维护陷入指令。当EL2在当前的Security状态中启用时,在EL1执行TLB*指令会导致, 0:任何指令不会被捕获。 1:指定指令的执行被陷入在EL2中。 |
54 | TTLBIS | 操作于内部共享域的TLB维护陷入指令。当EL2在当前的Security状态中启用时,在EL1执行TLB*指令会导致, 0:任何指令不会被捕获。 1:指定指令的执行被陷入在EL2中。 |
53 | EnSCXT | 启用对SCXTNUM_EL1和SCXTNUM_EL0寄存器的访问。 0:当HCR_EL2.E2H为0或者 HCR_EL2.TGE 为0,则访问寄存器会导致未定义指令异常并且陷入EL2;1:访问寄存器不会导致陷入EL2 |
52 | TOCU | 操作到统一点的缓存维护陷入指令。当EL2在当前安全状态下启用时,将这些缓存维护指令的执行捕捉到EL2。 0:任何指令不会被捕获; 1:指定指令的执行会被困在EL2 |
51 | AMVOFFEN | 活动监视器虚拟偏移使能。 0:活动监视器的虚拟化被禁用。间接读取虚拟偏移寄存器是零; 1:启用了活动监视器的虚拟化 |
50 | TICAB | ICIALLUIS/IC IALLUIS缓存维护陷入指令。当EL2在当前安全状态下启用时,在EL1到EL2处捕捉那些缓存维护指令的执行。 0:任何指令不会被捕获。 1:指定指令的执行被陷入在EL2中 |
49 | TID4 | 陷入ID组4。 0:任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器4会被捕获到EL2 |
48 | GPF | 控制颗粒保护故障在EL0、EL1的上报。 0:异常从EL0、EL1不会路由到EL2; 1:异常从EL0、EL1路由到EL2,并报告为颗粒保护检查异常。 |
47 | FIEN | 故障注入启用。在EL1访问寄存器ERXPFGCDN_EL1, ERXPFGCTL_EL1 和ERXPFGF_EL1 的结果。0:从EL1访问指定的寄存器会产生一个到EL2的Trap异常; 1:任何指令不会被被捕获 |
46 | FWB | 强迫写回。定义在2阶段转换机制的组合缓存属性。 |
45 | NV2 | 嵌套的虚拟化。改变HCR_EL2 的行为。(NV1, NV)为硬件提供一种能够将系统寄存器的读写转换为内存的读写的机制。0:该位对 HCR EL2 的行为没有影响;1:如果 HCR_EL2{NV1, NV} 开启了,则将寄存器的读/写转换为对内存的读/写和将EL2寄存器重定向到EL1寄存器。 |
44 | AT | 地址转换。当 EL2 在当前安全状态下启用时,在EL1执行AT S1E0R , AT S1E0W, AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP 地址转换指令是否会被捕获到EL2。
|
43 | NV1 | 嵌套的虚拟化:
|
42 | NV | 嵌套的虚拟化。 0:没有作用; 1:如果 HCR_EL2.NV2 为0 ,EL1对指定寄存器的访问或指定指令的执行被捕获到EL2,如果HCR_EL2.NV2 为1 ,重新定义EL1的寄存器,使用SPSR_EL2 , ELR_EL2 , ESR_EL2 ,和FAR_EL2 代替SPSR_EL1 , ELR_EL1 , ESR_EL1 和FAR_EL1 |
41 | API | 控制与指针身份验证相关的下列指令的使用。
|
40 | APK | 当APK被设置为0,当EL2在当前安全状态下启用时,对保存指针身份验证“键”值的寄存器的访问被捕获到EL2。 |
39 | TME | 允许在EL0、EL1上访问TSTART 、TCOMMIT 、TTEST和TCANCEL指令。 0:不允许,定义为未定义指令; 1:允许 |
38 | MIOCNCE | 使能用于EL1和EL0的翻译机制的不匹配的内部/外部缓存的非一致性。对于EL1&0翻译机制,对于使用共享性和缓存性的通用定义的内存位置的允许访问,如果这些访问的内部缓存属性与外部缓存属性不同, 0:那么一定不会失去一致性; 1:可能会失去一致性 |
37 | TEA | 路由同步外部中止异常到EL2: 0:异常不会从EL0和EL1路由到EL2; 1:当前Security状态下启用时,如果EL0和EL1的同步外部中止异常没有路由到EL3,则路由到EL2。 |
36 | TERR | 陷入错误记录访问: 从EL1陷入到EL2读取的RAS错误寄存器。 0:任何指令不会被捕获。 1:当EL2在当前安全状态下被启用时,访问EL1指定的寄存器会生成一个到EL2的陷入异常。 |
35 | TLOR | 陷入LOR寄存器。非安全的EL1访问LORSA_EL1 , LOREA_EL1 , LORN_EL1 , LORC_EL1 , 和 LORID_EL1 。 0:不产生异常; 1:被捕获到EL2 |
34 | E2H | EL2主机,启用主机操作系统在EL2中运行。
|
33 | ID | 禁用阶段2指令访问缓存: 0:这种控制对EL1和EL0翻译体系的第二阶段没有影响; 1:强制所有对普通内存的指令访问的第二阶段转换为不可缓存。 |
32 | CD | 禁用阶段2数据访问缓存: 0:这种控制对EL1和EL0翻译体系的第二阶段没有影响; 1:强制所有对普通内存的指令访问的第二阶段转换为不可缓存。 |
31 | RW | 对较低异常级别的执行状态控制: 0:低层的特权等级全部都是AArch32; 1:低一层的特权等级是 AArch64 |
30 | TRVM | 陷入读取虚拟内存控制。从EL陷入到EL21读取虚拟内存控制寄存器。 0:任何指令不会被捕获。 1:当EL2在当前安全状态下启用时,对指定虚拟内存控件的EL1读访问被捕获到EL2。 |
29 | HCD | HVC指令禁用: 0:在EL2和EL1上启用HVC指令执行; 1: HVC 指令在EL2和EL1是未定义的,任何产生的异常都被带到执行HVC指令的异常级别。 |
28 | TDZ | DC ZVA指令陷入: 当EL2在当前Security状态下启用时,在EL0和EL1执行DC ZVA 指令将陷入EL2。
|
27 | TGE | 陷入一般异常: 0:对ELO的执行没有影响; 1:当EL2在当前安全状态下未启用时,对EL0没有影响。当EL2在当前安全状态下启用时,所有异常路由到EL2 |
26 | TVM | 虚拟内存控制陷入: 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,对指定的EL1虚拟内存控制寄存器的EL1写访问被捕获到EL2。 |
25 | TTLB | TLB维护指令陷入: 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,在EL1执行指定的TLB维护指令会被捕获到EL2。 |
24 | TPU | 缓存维护指令陷入,操作到统一点。 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。 |
23 | TPCP | 数据或统一的缓存维护指令陷入,操作到一致性或持久性点: 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。 |
22 | TSW | 数据或通过“设置/方式”操作的统一缓存维护指令陷入。 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。 |
21 | TACR | 辅助控制寄存器陷入: 0:任何指令不会被捕获; 1:当EL2在当前安全状态下启用时,在EL1访问辅助控制寄存器会被捕获到EL2。 |
20 | TIDCP | 实现定义的功能陷入: 0:任何指令不会被捕获; 1:当EL2在当前Security状态中启用时,EL1访问或执行保留的指定编码实现定义功能被捕获到EL2。 |
19 | TSC | SMC 指令陷入:
|
18 | TID3 | 陷入ID组3。 0: 任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器3会被捕获到EL2 |
17 | TID2 | 陷入ID组2。 0:任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器2会被捕获到EL2 |
16 | TID1 | 陷入ID组1。 0: 任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器1会被捕获到EL2 |
15 | TID2 | 陷入ID组0。 0: 任何指令不会被捕获; 1:在EL1和EL0访问ID组寄存器0会被捕获到EL2 |
14 | TWE | 当被设置为1,在任何低于EL2的异常级别上执行WFE指令的任何尝试都会被捕获到EL2 |
13 | TWI | 当被设置为1,在任何低于EL2的异常级别上执行WFI指令的任何尝试都会被捕获到EL2 |
12 | DC | 默认的缓存能力: 0:对EL1和EL0翻译策略没有影响; 1:EL1和El0翻译阶段1产生的记忆类型为非正常可共享的,内部写回式读分配写分配,外部写回式读分配写分配。 |
11:10 | BSU | 屏障共享升级:该字段确定从EL1或EL0执行的指令屏障的最小可共享域。
|
9 | FB | 强制广播: 0:任何指令不会被捕获; 1:在EL1执行指定的指令之一时,该指令会在内部共享域中广播。 |
8 | VSE | 虚拟SError中断: 0:不会使一个虚拟的SError中断挂起; 1:使一个虚拟的SError中断挂起 |
7 | VI | 虚拟IRQ中断: 0:不会使一个虚拟的IRQ中断挂起; 1:使一个虚拟的IRQ中断挂起 |
6 | VF | 虚拟FIQ中断: 0:不会使一个虚拟的FIQ中断挂起; 1:使一个虚拟的FIQ中断挂起 |
5 | AMO | 物理SError中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用, 0:如果H CR_EL2.TGE 为0,路由到EL2,如果HCR_EL2.TGE 为1,不执行。1:路由到EL2,如果 HCR_EL2.TGE 为1,启用虚拟SError中断。 |
4 | IMO | 物理IRQ中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用, 0:如果 HCR_EL2.TGE 为0,路由到EL2,如果HCR_EL2.TGE 为1,不执行。1:路由到EL2>,如果 HCR_EL2.TGE 为1,启用虚拟IRQ中断。 |
3 | FMO | 物理FIQ中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用, 0:如果 HCR_EL2.TGE 为0,路由到EL2,如果HCR_EL2.TGE 为1,不执行。1:路由到EL2>,如果 HCR_EL2.TG E为1,启用虚拟FIQ中断。 |
2 | PTW | 受保护的表遍历:在EL1&EL0转换体系中,作为第一阶段转换表遍历的一部分的转换表访问要服从第二阶段转换。来自两个转换阶段的内存类型属性的组合意味着可以访问某种类型的Device内存。 0:转换表的遍历发生在普通非缓存内存中。这意味着它可以被推测; 1:内存访问产生二级权限故障 |
1 | SWIO | 设置/失效指令覆盖: 0:通过设置/失效指令对数据缓存无效的操作没有影响; 1:通过设置/失效指令使数据失效,达到清理数据缓存的目的 |
0 | VM | 虚拟化支持:当EL2在当前安全状态下启用时,为EL1和0转换机制启用阶段2地址转换。
|
下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - Process State 介绍