上一章介绍了ARMv8 通用寄存器和各种特殊寄存器,本章重点介绍一些常见的系统寄存器。
在AArch64中,系统配置通过系统寄存器进行控制,并使用MSR和MRS指令进行访问。ARM架构的之前版本(如ARMv7)使用协处理器来进行系统配置。 但是,AArch64不支持协处理器。
AArch64中系统寄存器会以”_ELn“的方式名命,寄存器的名称会告诉你可以访问它的最低异常级别。
_EL1
:处理器处于EL1、EL2、EL3时可以访问。_EL2
:处理器处于EL2、EL3时可以访问。例如
TTBR0_EL1可以从EL1、EL2和EL3访问。
TTBR0_EL2可以从EL2和EL3访问。
可以采用以下形式来访问系统寄存器:
MRS x0, TTBR0_EL1 // 把 TTBR0_EL1 的值保存到x0
MSR TTBR0_EL1, x0 // 把x0 的值写入TTBR0_EL1寄存器
下表显示了异常级别,这些异常级别具有每个寄存器的单独副本。 例如,单独的辅助控制寄存器(ACTLR)以ACTLR_EL1,ACTLR_EL2和ACTLR_EL3的形式存在。
名称 | 寄存器 | 说明 | n的允许值 |
---|---|---|---|
ACTLR_ELn | 辅助控制寄存器 | 控制处理器特定的功能。 | 1,2,3 |
CCSIDR_ELn | 当前缓存大小ID寄存器 | 提供有关当前所选缓存的体系结构的信息。 | 1 |
CLIDR_ELn | 缓存级别ID寄存器 | 在每个级别上实现的单个或多个高速缓存的类型 缓存层次结构的一致性级别和统一级别。 |
1,2,3 |
CNTFRQ_ELn | 计数器频率寄存器 | 报告系统计时器的频率。 | 0 |
CNTPCT_ELn | 计数器物理计数寄存器 | 保持64位的当前计数值。 | 0 |
CNTKCTL_ELn | 计数器内核控制寄存器 | 控制从虚拟计数器生成事件流。还控制从EL0访问物理计数器,虚拟计数器,EL1物理计时器和虚拟计时器。 | 1 |
CNTP_CVAL_ELn | 计数器物理计时器比较值寄存器 | 保存EL1物理计时器的比较值。 | 0 |
CPACR_ELn | 协处理器访问控制寄存器 | 控制对跟踪,浮点和SIMD功能的访问。 | 1 |
CSSELR_ELn | 缓存大小选择寄存器 | 通过指定所需的缓存级别和缓存类型(指令或数据缓存),选择当前的缓存大小ID寄存器CCSIDR_EL1。 | 1 |
CNTP_CTL_ELn | 计数器物理控制寄存器 | 控制EL1物理计时器的寄存器。 | 0 |
CTR_ELn | 缓存类型寄存器 | 有关集成缓存体系结构的信息。 | 0 |
DCZID_ELn | 数据缓存零ID寄存器 | 指示数据缓存零根据虚拟地址(DCZVA)系统指令写入字节值为0的块大小。 | 0 |
ELR_ELn | 异常链接寄存器 | 保存导致异常的指令的地址。 | 1,2,3 |
ESR_ELn | 异常综合特征寄存器 | 包括有关异常原因的信息。 | 1,2,3 |
FAR_ELn | 故障地址寄存器 | 保存虚拟错误地址。 | 1,2,3 |
FPCR | 浮点控制寄存器 | 控制浮点扩展行为。该寄存器中的字段映射到AArch32 FPSCR中的等效字段。 | . |
FPSR | 浮点状态寄存器 | 提供浮点系统状态信息。该寄存器中的字段映射到AArch32 FPSCR中的等效字段。 | . |
HCR_ELn | Hypervisor 配置寄存器 | 控制虚拟化设置,并将异常情况捕获到EL2。 | 2 |
MAIR_ELn | 存储器属性间接寄存器 | 在ELn的阶段1翻译的Long-descriptor格式转换表项中,提供对应于可能值的存储器属性编码。 | 1,2,3 |
MIDR_ELn | 主ID寄存器 | 代码运行的处理器类型(部件号和版本)。 | 1 |
MPIDR_ELn | 多处理器密切关系的寄存器 | 处理器和群集ID,在多核或群集系统中。 | 1 |
RVBAR_ELn | 基于地址寄存器的重置向量 | 保存重置向量的基地址,以便发送给ELn的任何异常。 | 1,2,3 |
SCR_ELn | 安全配置寄存器 | 控制安全状态和EL3的异常情况。 | 3 |
SCTLR_ELn | 系统控制寄存器 | 控制架构功能,例如MMU,缓存和对齐检查。 | 0,1,2,3 |
SPSR_ELn | 保存的程序状态寄存器 | 当发生异常时,保持已保存的处理器状态。 | abt,fiq,irq,und,1,2,3 |
TCR_ELn | 转换控制寄存器 | 确定哪个转换表基地寄存器定义了转换表行走(translation table walk)的基地址,该基地址是ELn中,内存访问阶段1转换所需要的。 还控制转换表格式并保存可缓存和可共享的信息。 |
1,2,3 |
TPIDR_ELn | 用户读/写线程ID寄存器 | 为了操作系统管理的目的,提供一个在ELn上执行的软件可以存储线程标识信息的位置。 | 0,1,2,3 |
TPIDRRO_ELn | 用户只读线程ID寄存器 | 提供在EL1或更高版本上执行的软件可以存储线程标识信息的位置。为了操作系统管理的目的,在EL0上执行的软件可以看到这些信息。 | 0 |
TTBR0_ELn | 转换表基址寄存器0 | 保存转换表0的基地址,以及它占用的内存的信息。这是ELn内,内存访问阶段1转换的转换表之一。 | 1,2,3 |
TTBR1_ELn | 转换表基址寄存器1 | 保存转换表1的基地址,以及它占据的存储器的信息。 这是在EL0和EL1内,内存访问阶段1转换的转换表之一 |
1 |
VBAR_ELn | 基于向量的地址寄存器 | 保存异常基地址,以便发送到ELn的任何异常。 | 1,2,3 |
VTCR_ELn | 虚拟化转换控制寄存器 | 控制来自非安全EL0和EL1的内存访问阶段2转换所需的转换表步行。还保存访问的可缓存和可共享信息。 | 2 |
VTTBR_ELn | 虚拟化转换表基址寄存器 | 保存来自非安全EL0和EL1的内存访问阶段2转换的转换表的基地址。 | 2 |
下面我们介绍几组重要的系统控制寄存器。
系统控制寄存器(SCTLR)是一个用来控制标准内存、配置系统能力、提供处理器核状态信息的寄存器。包括 SCTLR_EL1、 SCTLR_EL2和 SCTLR_EL3。但是并不是所有bit在EL1都可用。
需要注意的是,有些域在EL1下不能访问。
寄存器各个字段介绍:
域 | 描述 |
---|---|
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 |
虚拟化配置寄存器(HCR_EL2)是一个用来为虚拟化提供配置控制的寄存器,包括定义各种操作是否被捕获到EL2。
各个字段的定义:
bit域 | 字段 | 描述 |
---|---|---|
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.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 | 控制与指针身份验证相关的下列指令的使用。0:任何与指针验证相关的指令的使用都会被捕获到EL2;1:指令不会被捕获。 |
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中运行。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:对EL0的执行没有影响;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和o转换机制启用阶段2地址转换。0:禁用;1:启用 |
安全配置寄存器(SCR_EL3)是一个定义当前Security状态的配置的寄存器,它指定:EL0、EL1、EL2的安全状态。“安全”状态为“安全”或者“不安全”。
各个字段的定义:
bit域 | 字段 | 描述 |
---|---|---|
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_EL2和AMEVCNTVOFF1_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_EL2、SCXTNUM_EL1和SCXTNUM_ELO 寄存器的访问。0:不使能,访问读取返回0并且会陷入EL3;1:使能 |
24:22 | RES0 | 保留的 |
21 | FIEN | 故障注入启用。在EL1和EL2访问寄存器ERXPFGCDN_EL1, ERXPFGCTL_EL1和ERXPFGF_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 aborts和SError中断会不会被路由到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及更低异常水平的安全状态。 当NSE为0时,0:安全;1:不安全。 当NSE为1时,0:保留;1:领域 |
翻译控制寄存器是第1阶段翻译状态的控制寄存器,包括TCR_EL1、 TCR_EL2和 TCR_EL3。
AArch64系统寄存器TCR_EL1位[31:0]在架构上映射到AArch32系统寄存器TTBCR[31:0]。AArch64系统寄存器TCR_EL1位[63:32]在架构上映射到AArch32系统寄存器TTBCR2[31:0]。AArch64系统寄存器TCR_EL2位[31:0]在架构上映射到AArch32系统寄存器HTCR[31:0]。
bit域 | 字段 | 描述 |
---|---|---|
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 | TBR1_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的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。 |
bit域 | 字段 | 描述 |
---|---|---|
63:33 | RES0 | 保留的 |
32 | DS | 当在翻译制度的第1阶段使用4KB和16KB翻译粒时,该字段影响52位输出寻址,包括翻译描述符、块描述符、页描述符的输出情况 |
31 | RES1 | 保留的 |
30 | TCMA | 控制未检查访问的生成。 0:对EL2上未检查访问是不会影响其他。1:在EL2的所有访问都是未检查的。 |
29 | TBID | 使用指令地址的顶部字节进行地址匹配控制 。0:TCR_EL2.TBI0适用于指令访问和数据访问;1:TCR_EL2.TBI0仅适用于数据访问。 |
28 | HWU62 | 进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。0:不能;1:可以 |
27 | HWU61 | 进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。0:不能;1:可以 |
26 | HWU60 | 进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。0:不能;1:可以 |
25 | HWU59 | 进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。0:不能;1:可以 |
24 | HPD | 分级权限禁用,影响TTBR0 EL2指向的翻译表中的一些控制位。0:启用分级权限;1:禁用分级权限 |
23 | RES1 | 保留的 |
22 | HD | 从EL2转换阶段1脏态的硬件管理。 0:禁用脏状态的阶段1硬件管理;1:启用脏状态的阶段1硬件管理 |
21 | HA | 从EL2翻译的阶段1硬件访问标志更新。 0:阶段1访问标志位更新被禁用;1:阶段1访问标志位更新启用。 |
20 | TBI | 最高字节忽略。 0:地址计算中使用的Top字节匹配TTBR0_EL2区域的地址;1:地址计算中忽略的Top字节 |
19 | RES1 | 保留的 |
18:16 | PS | 物理地址大小。000:32位,4GB;001:36位,64GB;010:40位,1TB;011:42位,4TB;100:44位,16TB;101:48位,256TB;110:52位,4PB |
15:14 | TG0 | TTBR0_EL2的颗粒大小。01:16KB;10:4KB;11:64Kb |
13:12 | SH0 | 与使用TTBR0_EL2的翻译表有关的内存的可共享性属性。00:不共享;10:外部可共享;11:内部可共享 |
11:10 | ORGN0 | 与使用TTBR0_EL2的翻译表有关的内存的外部缓存属性。00:不缓存;01:写回的读写缓存;10:写穿的读缓存写不缓存;11:写回的读缓存写不缓存 |
9:8 | IRGN0 | 与使用TTBR0_EL2的翻译表有关的内存的内部缓存属性。00:不缓存;01:写回的读写缓存;10:写穿的读缓存写不缓存;11:写回的读缓存写不缓存 |
7:6 | RES0 | 保留的 |
5:0 | T0SZ | TTBR0_EL2寻址的内存区域大小偏移量。区域大小为2的(64-T0SZ)次方字节。T0SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。 |
我们重点关注的是和启动相关的寄存器,异常处理相关寄存器,以及内存管理相关寄存器。
看寄存器很枯燥,后面需要的寄存器,再追加吧。