【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】

文章目录

  • 1. ARMv8 异常模型简介
    • 1.1 ARMv8-A General-Puspose Registers
    • 1.2 系统寄存器
      • 1.2.0 SCR_EL3 安全配置寄存器
      • 1.2.1 ELR_ELn 异常链接寄存器
      • 1.2.2 SP_ELx 寄存器
      • 1.2.3 SPSR 寄存器
      • 1.2.4 FAR_ELx 寄存器
      • 1.2.5 ESR_ELn Register
      • 1.2.6 MAIR_ELx Regiser
      • 1.2.7 SCTLR_ELx Register
      • 1.2.8 TCR_ELx Register 翻译控制寄存器
      • 1.2.9 CTR 缓存寄存器
      • 1.2.10 HCR_EL2 虚拟化配置寄存器

下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - ARM64 Process State 介绍

1. ARMv8 异常模型简介

1.1 ARMv8-A General-Puspose Registers

ARM8v-A提供了31个通用寄存器,分别是X0-X30。还有SP、PC、XZR等寄存器, 每个寄存器是64bits,可以在任何 Exception Level访问。
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第1张图片

表1-3 因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A中运行32位应用程序的时候,会时候 W0-W30 寄存器。只使用其中的低32位。

下面详细介绍写这些通用寄存器(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.2 系统寄存器

ARMv8-A 除过提供了31个通用寄存器外,还提有一些非常重要的系统寄存器:
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第2张图片
系统配置通过系统寄存器进行控制,并使用msrmrs指令进行访问。寄存器的名称会告诉你可以访问它的最低异常级别,具有后缀_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 安全配置寄存器

【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第3张图片

位数 名称 含义
63 RES0 保留的
62 NSE 该字段表示根据SCR_EL3.NS,选择EL2及以下Exception级别的Security状态。
61:49 RES0 保留的
48 GPF 控制颗粒保护故障在EL0、EL1和El2的上报。
  • 0:异常从EL0、EL1或EL2不会路由到EL3;
  • 1:异常从EL0、EL1或EL2路由到EL3,并报告为颗粒保护检查异常。
47:42 RES0 保留的
41 EnTP2 在EL2、EL1和EL0上执行的trap指令(比如访问TPIDR2_EL0)陷入到EL3。
  • 0:这些指令会在EL2、EL1和EL0的执行时被捕获;
  • 1:任何指令的执行不会被捕获。
40 TRNDR RNDR和RNDRRS读取是否捕获。
  • 0:不会导致RNDR和RDNRRS被捕获。;
  • 1:任何读取RNDR或RNDRRS的尝试都被陷入到EL3
39 RES0 保留的
38 HXEn 允许从EL3访问EL2上的HCRX_EL2寄存器。
  • 0:不允许,间接读会返回0;
  • 1:允许
37 ADEn 允许EL1和EL2上访问ACCDATA_EL1寄存器。
  • 0:在 EL1 at EL1和EL2访问ACCDATA_EL1会被捕获到EL3,除非访问被EL2细粒度trap捕获到EL2;
  • 1:访问ACCDATA_EL1不会被捕获。
36 EnAS0 在EL0, EL1或EL2触发ST64BVO指令异常是否路由到EL3。
  • 0:路由EL3;
  • 1:不会路由到EL3
35 AMVOFFEN 活动监视器虚拟偏移使能。
  • 0:使能,在EL2访问AMEVCNTVOFF0_EL2AMEVCNTVOFF1_EL2 寄存器会陷入到EL3;
  • 1:不使能
34 TME 允许在EL0、EL1和EL2上访问TSTART、TCOMMIT、TTEST和TCANCEL指令。
  • 0:不允许,定义为未定义指令;
  • 1:允许
33:30 TWEDEL TWE延迟。当SCR_EL3.TWEDEn为1,由SCR_EL3引起的WFE*陷阱的最小延迟为2的(TWEDEL + 8)次方,单位周期。
29 TWEDEn TWE推迟启用。让由SCR EL3.TWE引起的WFE*指令延迟陷入可配置。
  • 0:陷入的延迟是已经定义的;
  • 1:陷入的延迟至少是SCR_EL3.TWEDEL中定义的周期数。
28 ECVEn ECV启用,启用对CNTPOFF_EL2寄存器的访问。
  • 0:EL2访问CNTPOFF_EL2会被捕获到EL3,;
  • 1:EL2访问CNTPOFF_EL2不陷入在EL3。
27 FGTEn 细粒度的陷阱使能。控制对HAFGRTR_EL2, HDFGRTR_EL2, HDFGWTR_EL2, HFGRTR_EL2, HFGITR_EL2,和HFGWTR_EL2,寄存器的访问。
  • 0:会陷入EL3;
  • 1:不会陷入EL3
26 ATA 分配标签访问,控制在EL2, EL1和EL0对分配标签的访问。
  • 0:避免对分配标签的访问,访问GCR_EL1, RGSR_EL1, TFSR_EL1, TFSR_EL2 或者TFSRE0_EL1会出现未定义指令异常并且陷入EL3
  • 1:允许对分配标签的访问
25 EnSCXT 使能对SCXTNUM_EL2SCXTNUM_EL1SCXTNUM_ELO 寄存器的访问。
  • 0:不使能,访问读取返回0并且会陷入EL3;
  • 1:使能
24:22 RES0 保留的
21 FIEN 故障注入启用。在EL1和EL2访问寄存器ERXPFGCDN_EL1, ERXPFGCTL_EL1ERXPFGF_EL1的结果。
  • 0:从EL1和EL2访问指定的寄存器会产生一个到EL3的Trap异常;
  • 1:任何指令不会被被捕>获
20 NMEA 屏敝外部中止。当SCR_EL3.EA 等于1时,
  • 0:SError中断不会路由到EL3;
  • 1:由PSTATE.A.决定是否把SError中断路由到EL3
19 EASE 外部中断到SError中断向量。同步执行到EL3的外部终止异常会被执行到的位置,
  • 0:VBAR_EL3相对应的同步异常向量;
  • 1:VBAR_EL3相对应的SError中断向量。
18 EEL2 安全EL2启用。
  • 0:与Secure EL2相关的行为都被禁用;
  • 1:与Secure EL2相关的行为都已启用。
17 API 控制与指针身份验证相关的下列指令的使用。
  • 0:任何与指针验证相关的指令的使用都会被捕获到EL3;
  • 1:指令不会被捕获。
16 APK 当APK被设置为1,对持有EL1或EL2指针认证“键”值的寄存器的访问被捕获到EL3,除非它们由于HCR_EL2.APK位或其他陷阱而被捕获到EL2。
15 TERR Trap错误记录访问。
  • 0:不产生异常;1:从EL1和EL2访问指定的寄存器会产生一个到EL3的Trap异常。
14 TLOR
  • 0:不产生异常;
  • 1:如果EL1和EL2访问的LOR寄存器不是未定义的,则被捕获到EL3,除非它被捕获到HCR_EL2
13 TWE 当被设置为1,在任何低于EL3的异常级别上执行WFE指令的任何尝试都会被捕获到EL3
12 TWI 当被设置为1,在任何低 于EL3 的异常级别上执行WFI指令的任何尝试都会被捕获到EL3
11 ST 当被设置为1, Secure EL1访问 counter timer 物理安全计时器寄存器会被捕获到EL3
10 RW 对较低异常级别的执行状态控制。
  • 0:低层的特权等级全部都是AArch32;
  • 1:低一层的特权等级是 AArch64
9 SIF 安全指令取出。当PE处于Secure状态时,在翻译的第一阶段标记为Non-secure,该位决定是否允许从翻译的第一阶段标记为不安全的内存中提取安全状态指令。
  • 0:允许;
  • 1:不允许
8 HCE Hypervisor调用指令启用。
  • 0:HVC指令未定义的;
  • 1:在EL3、EL2、EL1使能HVC指令。
7 SMD 安全监控呼叫禁用。
  • 0:SMC指令在EL3、EL2和EL1使能;
  • 1:SMC指令未定义的。
6 RES0 保留的
5:4 RES1 保留的
3 EA 外部中止和错误中断路由。当在EL3以下的异常级别执行时,External abortsSError中断会不会被路由到EL3。
  • 0:不会,但是在EL3时,SError中断不会被处理,外部中止中断会被处理>;
  • 1:会
2 FIQ 物理FIQ路由。 当在EL3以下的异常级别执行时,物理FIQ中断会不会被路由到EL3。
  • 0:不会,但是在EL3执行时,不使用物理FIQ中断;
  • 1:会。
1 IRQ 物理IRQ路由。 当在EL3以下的异常级别执行时,物理IRQ中断会不会被路由到EL3。
  • 0:不会,但是在EL3执行时,不使用物理IRQ中断;
  • 1:会。
0 NS 不安全位。该字段与SCR_EL3.NSE选择EL2及更低异常水平的安全状态。
NSE0时:
  • 0:安全;
  • 1:不安全。
    NSE1时:
  • 0:保留;
  • 1:领域

1.2.1 ELR_ELn 异常链接寄存器

在这里插入图片描述

有三个异常链接寄存器,ELR_EL1ELR_EL2ELR_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_EL1SPSR_EL2SPSR_EL3。使用那个SPSR寄存器依赖于异常级别。若异常级别为EL1,则使用SPSR_EL1,若异常级别为EL2,则使用SPSR_EL2,若异常级别为EL3,则使用SPSR_EL3
ELR_ELn和SPSR_ELn寄存器和异常级别相关联,始终保存着低于当前异常级别的处理器状态。
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第4张图片

位域 功能
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]根据此选择栈指针寄存器,
  • 0表示t;
  • 1表示h。可以通过异常级别的栈指针后缀表明所选的栈指针
    【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第5张图片

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寄存器的第一段是 ECbits[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) 异常原因:
  • EC == 0b000000 未知原因
  • EC == 0b000001,执行了WFI指令
  • EC == 0b000011 执行 MCR或者MRC,AArch32 状态下
  • EC == 0b000100 执行 MCRR 或者 MRRC,AArch32 状态下
  • EC == 0b000101 执行 MCR或者MRC (coproc==0b1110)
  • EC == 0b000110 LDC or STC access
  • EC == 0b000111 Access to SME, SVE, Advanced SIMD or floating-point functionality
  • EC == 0b001001 Pointer authentication instruction
  • EC == 0b001010 执行 LD64B或者ST64B执行导致的
  • EC == 0b001100 MRRC 指令导致
  • EC == 0b001110 Illegal Execution state异常
  • EC == 0b010011 执行 SMC 指令在 AArch32 状态下
  • EC == 0b010101 执行 SVC指令在AArch 状态下
  • EC == 0b010110 执行 HVC指令在AArch64状态下
  • EC == 0b010111 执行 SMC指令在AArch 状态下
[25] IL(Instruction Length) 显示异常时的指令长度:
  • 0b0 16-bit instruction trapped
  • 0b1 32-bit instruction trapped
[24:0] ISS(Instruction Specific Syndrome) 不同的异常类型有不同的含义:
  • 【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第6张图片【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第7张图片

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_EL1SCTLR_EL2SCTLR_EL3,但并不是所有bit在EL1都可用。
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第8张图片

寄存器各个字段介绍

bit 含义
UCI 设置此位后,在AArch64中为DC CVAU、DC CIVAC、DC CVAC和IC IVAU指令启用EL0访问。
EE 异常字节顺序。
  • 0表示小端,
  • 1表示大端。
EOE EL0显式数据访问的字节序。
  • 0表示小端,
  • 1表示大端。
WXN 写权限不可执行 XN (eXecute Never)。
  • 0表示可写区域不设置不可执行权限(XN),
  • 1表示可写区域强制为不可执行(XN)
nTWE 不陷入WFE,此标志为1表示WFE作为普通指令执行
nTWI 不陷入WFI, 此标志为1表示WFI作为普通指令执行
UCT 此标志为1时,开启AArch64的EL0下访问CTR_EL0寄存器
DNE EL0 下访问 DC AVA指令,
  • 0 禁止执行,
  • 1 允许执行
I 开启指令缓存,这是在EL0和EL1下的指令缓存的启用位。对可缓存的正常内存的指令访问被缓存。
UMA 用户屏蔽访问。当EL0使用AArch64,控制从EL0的中断屏蔽访问。
SED 禁止SETEND。在EL0使用AArch32禁止SETEND指令。
  • 0 使能,
  • 1 禁止
ITD 禁止IT指令。
  • 0表示IT指令有效,
  • 1表示IT指令被当作16位指令。仅另外16位指令或32位指令的头16位可以使用
CP 15BEN CP15 barrier使能。如果实现了,它是AArch32 CP15 DMB,DSB和ISB barrier操作的使能位
SA0 EL0的栈对齐检查使能位
SA 栈对齐检查使能位
C 数据cache使能。EL0和EL1的数据访问使能位。对cacheable普通内存的数据访问都被缓存
A 对齐检查使能位
M 使能MMU

在 AArch32状态下,有HSCTLRsctlr 寄存器,其中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_EL1TCR_EL2TCR_EL3
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第9张图片

位数 名称 含义
63:60 RES0 保留的
59 DS 当在翻译制度的第1阶段使用4KB和16KB翻译粒时,该字段影响52位输出寻址,包括翻译描述符、块描述符、页描述符的输出情况
58 TCMA1 控制未检查访问的生成,
  • 0:对EL1上未检查访问是不会影响其他。
  • 1:在EL1的所有访问都是未检查的。
57 TCMA0 控制未检查访问的生成,
  • 0:对EL0上未检查访问是不会影响其他。
  • 1:在EL0的所有访问都是未检查的。
56 E0PD1 对由TTBR1_EL1转换的任何地址的非特权访问的故障控制。
  • 0:对由TTBR1_EL1转换的任何地址的非特权访问都不会产生错误;
  • 1:对由TTBR1_EL1转换的任何地址的无特权访问将产生0>级转换错误。
55 E0PD0 对由TTBR1_EL0转换的任何地址的非特权访问的故障控制。
  • 0:对由TTBR1_EL0转换的任何地址的非特权访问都不会产生错误;
  • 1:对由TTBR1_EL0转换的任何地址的无特权访问将产生0>级转换错误。
54 NFD1 该位控制是否对使用TTBR1_EL1转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
  • 0:不禁用使用TTBR1_EL1的阶段1翻译表遍历;
  • 1:使用TTBR1_EL1转换的虚拟地址上的TLB错过会导致访问失败,而不会发生异常。不执行第1阶段的翻译表行走
53 NFD1 该位控制是否对使用TTBR0_EL1转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
  • 0:不禁用使用TTBR0_EL1的阶段1翻译表遍历;
  • 1:使用TTBR0_EL1转换的虚拟地址上的TLB错过会导致访问失败,而不会发生异常。不执行第1阶段的翻译表行走
52 TBID1 使用指令地址的顶部字节进行地址匹配控制 。
  • 0:TCR_EL1.TBI1适用于指令访问和数据访问;
  • 1:TCR_EL1.TBI1仅适用于数据访问。
51 TBID0 使用指令地址的顶部字节进行地址匹配控制 。
  • 0:TCR_EL1.TBI0适用于指令访问和数据访问;
  • 1:TCR_EL1.TBI0仅适用于数据访问。
50 HWU162 TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
49 HWU161 TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
48 HWU160 TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
47 HWU159 TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
46 HWU062 TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
45 HWU061 TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
44 HWU060 TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
43 HWU059 TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
42 HPD1 分级权限禁用,影响TTBR1 EL1指向的翻译表中的一些控制位。
  • 0:启用分级权限;
  • 1:禁用分级权限
41 HPD10 分级权限禁用,影响TTBR0 EL1指向的翻译表中的一些控制位。
  • 0:启用分级权限;
  • 1:禁用分级权限
40 HD 从EL0和EL1转换阶段1脏态的硬件管理。
  • 0:禁用脏状态的阶段1硬件管理;
  • 1:启用脏状态的阶段1硬件管理
39 HA 从EL0和EL1翻译的阶段1硬件访问标志更新。
  • 0:阶段1访问标志位更新被禁用;
  • 1:阶段1访问标志位更新启用。
38 TBI1 最高字节忽略。
  • 0:地址计算中使用的Top字节匹配TTBR1_EL1区域的地址;
  • 1:地址计算中忽略的Top字节
37 TBI0 最高字节忽略。
  • 0:地址计算中使用的Top字节匹配TTBR0_EL1区域的地址;
  • 1:地址计算中忽略的Top字节
36 AS ASID大小。
  • 0:8位,除了回读寄存器外,TTBRO_ELT和TTBR1_EL1的高8位被硬件忽略;
  • 1:16位,TTBRO_EL1和TTBR1_EL1的高16位用于在TLB中分配和匹配。
35 RES0 保留的
34:32 IPS 中间物理地址大小。
  • 000:32位,4GB;
  • 001:36位,64GB;
  • 010:40位,1TB;
  • 011:42位,4TB;
  • 100:44位,16TB;
  • 101:48位,256TB;
  • 110:52位,4PB
31:30 TG1 TTBR1_EL1的颗粒大小。
  • 01:16KB;
  • 10:4KB;
  • 11:64Kb
29:28 SH1 与使用TTBR1_EL1的翻译表有关的内存的可共享性属性。
  • 00:不共享;
  • 10:外部可共享;
  • 11:内部可共享
27:26 ORGN1 与使用TTBR1_EL1的翻译表有关的内存的外部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
25:24 IRGN1 与使用TTBR1_EL1的翻译表有关的内存的内部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
23 EPD1 控制是否在TLB miss上对使用TTBR1_EL1进行转换的地址执行转换表遍历。
  • 0:使用TTBR1_EL1执行翻译表遍历;
  • 1:不执行翻译表遍历
22 A1 选择是否是TTBR0_EL1或TTBR1_EL1定义ASID。
  • 0:TTBR0_EL1.ASID定义了ASID;
  • 1:TTBR1_EL1.ASID定义了ASID
21:16 T1SZ TTBR1_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T1SZ)次方字节。T1SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。
15:14 TG0 TTBR0_EL1的颗粒大小。
  • 01:16KB;
  • 10:4KB;
  • 11:64Kb
13:12] SH0 与使用TTBR0_EL1的翻译表有关的内存的可共享性属性。
  • 00:不共享;
  • 10:外部可共享;
  • 11:内部可共享
11:10 ORGN0 与使用TTBR0_EL1的翻译表有关的内存的外部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
9:8 IRGN0 与使用TTBR0_EL1的翻译表有关的内存的内部缓存属性:
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
7 EPD0 控制是否在TLB miss上对使用TTBR0_EL1进行转换的地址执行转换表遍历。
  • 0:使用TTBR0_EL1执行翻译表遍历;
  • 1:不执行翻译表遍历
6 RES0 保留的
5:0 T0SZ TTBR0_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T0SZ)次方字节。T0SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。

1.2.9 CTR 缓存寄存器

缓存寄存器(CTR)是一个提供有关缓存架构的信息的寄存器,硬件上只有一个,就是CTR_EL0,所以特权和非特权状态都是访问它。
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第10张图片

位数 名称 含义
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指令缓存的索引和标记策略。
  • 00:只有FEAT_VPIPT被实现才能用;
  • 01:使用ASID+虚拟地址索引域和虚拟地址的标记域;
  • 10:使用虚拟地址的索引域和物>理地址的标记域;
  • 11:使用物理地址的索引域和物理地址的标记域
13:4 RES0 保留的
3:0 IminLine 由PE控制的所有指令缓存中最小的缓存行大小为2的n次方,单位为4字节

1.2.10 HCR_EL2 虚拟化配置寄存器

虚拟化配置寄存器(HCR_EL2)是一个用来为虚拟化提供配置控制的寄存器,包括定义各种操作是否被捕获到EL2。
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】_第11张图片

位数 名称 含义
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翻译被视为标记还是或未标记的。
  • 0:未标记的;
  • 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。
  • 0:不会;
  • 1:会
43 NV1 嵌套的虚拟化:
  • 0:没有作用;
  • 1:如果HCR_EL2.NV2为1 ,从EL1到实现的EL2寄存器的访问被转换为load和store;如果HCR_EL2.NV2为0,EL1访问VBAR_EL1, ELR_EL1, SPSR_EL1会陷入EL2
42 NV 嵌套的虚拟化。
0:没有作用;
1:如果HCR_EL2.NV20 ,EL1对指定寄存器的访问或指定指令的执行被捕获到EL2,如果HCR_EL2.NV21,重新定义EL1的寄存器,使用SPSR_EL2, ELR_EL2, ESR_EL2,和FAR_EL2代替SPSR_EL1, ELR_EL1, ESR_EL1FAR_EL1
41 API 控制与指针身份验证相关的下列指令的使用。
  • 0:任何与指针验证相关的指令的使用都会被捕获到EL2;
  • 1:指令不会被捕获。
40 APK 当APK被设置为0,当EL2在当前安全状态下启用时,对保存指针身份验证“键”值的寄存器的访问被捕获到EL2。
39 TME 允许在EL0、EL1上访问TSTARTTCOMMIT、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中运行。
  • 0:在EL2上支持主机操作系统的设施被禁用。
  • 1:在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。
  • 0:不会陷入;
  • 1:当EL2在当前Security中启用时,任何试图执行该指令会被捕获到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 指令陷入:
  • 0:任何指令不会被捕获;
  • 1:当EL2在当前安全状态下启用时,在EL1执行smc指令会被捕获到EL2。
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执行的指令屏障的最小可共享域。
  • 00:不共享;
  • 01:内核共享;
  • 10:外部共享;
  • 11:全部共享
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:如果HCR_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.TGE为1,启用虚拟FIQ中断。
2 PTW 受保护的表遍历:在EL1&EL0转换体系中,作为第一阶段转换表遍历的一部分的转换表访问要服从第二阶段转换。来自两个转换阶段的内存类型属性的组合意味着可以访问某种类型的Device内存。
0:转换表的遍历发生在普通非缓存内存中。这意味着它可以被推测;
1:内存访问产生二级权限故障
1 SWIO 设置/失效指令覆盖:
0:通过设置/失效指令对数据缓存无效的操作没有影响;
1:通过设置/失效指令使数据失效,达到清理数据缓存的目的
0 VM 虚拟化支持:当EL2在当前安全状态下启用时,为EL1和0转换机制启用阶段2地址转换。
  • 0:禁用;
  • 1:启用

下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - Process State 介绍

你可能感兴趣的:(#,ARM64,System,Exception,TCR_ELx,SCTLR_EL1,SCTRL_EL2,SCTRL_EL3,HSCTLR,SCTLR,ESR_ELn,寄存器)