D1 The AArch64 System Level Programmers' Model 中文翻译
D1 The AArch64 System Level Programmers’ Model
AArch64 系统级程序员模型
译者注: 本文档是 ARM Architecture Reference Manual for A-profile architecture 中 Chapter D1 的完整中文翻译。原文来自 ARM DDI 0487 文档。翻译过程中尽量保留技术细节和术语一致性。
D1.1 异常级别(Exception levels)
D1.1 Exception levels
RFYTFG 架构定义了四个异常级别:EL0、EL1、EL2 和 EL3。
RVPSDB EL3 是最高的异常级别,EL0 是最低的。因此,EL3 高于 EL2,EL2 高于 EL1,EL1 高于 EL0。
RNXCRB 处理单元(PE)必须实现 EL1 和 EL0。
RKPZJW 具有 FEAT_RME 特性的处理单元必须实现 EL3 和 EL2。在不具有 FEAT_RME 特性的处理单元中,以下全部适用:
- EL3 是否实现由实现定义(IMPLEMENTATION DEFINED)。
- EL2 是否实现由实现定义。
- 该处理单元不需要实现连续的异常级别。
译者注: IMPLEMENTATION DEFINED 是 ARM 架构中的常用术语,表示该行为由具体实现厂商决定,不同芯片厂商可以有不同的实现方式。
IWRRKQ EL2 提供对 EL0 和 EL1 虚拟化的支持。
RCCQWK 非特权执行是任何在 EL0 发生的执行。
RNZZNS 当前异常级别仅在以下任一情况发生时才会改变:
- 发生异常(Taking an exception)。
- 从异常返回(Returning from an exception)。
- 处理器复位(Processor reset)。
- 退出调试状态(Exiting from Debug state)。
- 如果处于调试状态,执行 DCPSx 指令。
- 如果处于调试状态,执行 DRPS 指令。
RXRQKF 目标异常级别是异常被带入的异常级别。
RFFJBB 每种异常类型都有一个目标异常级别,该级别要么:
- 隐含在异常类型中。
- 由系统寄存器中的配置位定义。
RTKYYF 异常不能被带入 EL0。
RQNTPB 异常不能导致进入较低的异常级别。
D1.1.1 执行状态(Execution state)
RHTYJH 架构定义了两种执行状态。AArch32 执行状态使用 32 位处理。AArch64 执行状态使用 64 位处理。
IWKKGD AArch32 执行状态与 Armv7-A 操作兼容。
RNKNVR 异常级别可描述为:
- 当在该异常级别的执行处于 AArch64 执行状态时,称为使用 AArch64。
- 当在该异常级别的执行处于 AArch32 执行状态时,称为使用 AArch32。
RVZTWD 处理单元只能在复位时或更改异常级别时改变执行状态。
RQNVJL 如果某个异常级别使用 AArch32,则所有较低的异常级别也使用 AArch32。
RBDMRT 如果某个异常级别使用 AArch64,则所有较高的异常级别也使用 AArch64。
RMWGKL AArch64 和 AArch32 执行状态之间的交互称为间处理(interprocessing)。
IKSMPY 在本章中,描述的行为假设最高实现的异常级别使用 AArch64。
D1.1.2 安全状态(Security states)
RWPBBJ 架构定义了以下安全状态:
- 安全状态(Secure state)。
- 非安全状态(Non-secure state)。
- 如果实现了 FEAT_RME,则还包括:
- 领域状态(Realm state)。
- 根状态(Root state)。
IXKGPG 在以下状态中的执行:
- 安全状态中的执行不能被以下任何关联的代理观察到或修改:
- 非安全状态。
- 领域状态。
- 领域状态中的执行不能被以下任何关联的代理观察到或修改:
- 非安全状态。
- 安全状态。
- 根状态中的执行不能被任何其他安全状态的代理观察到或修改。
RNRXJT 架构定义了以下物理地址(PA)空间:
- 安全(Secure)。
- 非安全(Non-secure)。
- 如果实现了 FEAT_RME,还包括以下:
- 领域(Realm)。
- 根(Root)。
- 如果实现了 FEAT_RME_GDI,还包括以下两者:
- 系统代理(System Agent)。
- 非安全受保护(Non-secure Protected)。
IRKGZF 分配给以下地址空间的内存:
- 安全物理地址空间的内存不能被以下任何关联的代理读取或修改:
- 非安全状态。
- 领域状态。
- 领域物理地址空间的内存不能被以下任何关联的代理读取或修改:
- 非安全状态。
- 安全状态。
- 根物理地址空间的内存不能被任何其他安全状态的代理读取或修改。
RZFPTR EL3 在以下状态下始终为:
- 在不具有 FEAT_RME 特性的处理单元中为安全状态。
- 在具有 FEAT_RME 特性的处理单元中为根状态。
IHGPBB SCR_EL3.{NSE, NS} 的有效值选择 EL2 及以下的安全状态。
IYFMYJ 有关系统代理和非安全受保护 PA 空间的详细信息,请参阅粒度数据隔离(Granular Data Isolation)。
RSGMFG EL2 及以下不能处于根状态。
RDVTDD EL2 只能在以下条件都满足时处于安全状态:除了 SCR_EL3.{NSE, NS} 的有效值选择安全状态外,还需满足:
- 实现了 FEAT_SEL2。
- SCR_EL3.EEL2 的有效值为 0b1。
IZZCQM SCR_EL3.NS 以及如果实现了 FEAT_RME 则包括 SCR_EL3.NSE 的状态只能在 EL3 中更改。
IDJJQJ 在具有 FEAT_RME 特性的处理单元中,以下全部适用:
- 必须实现根状态、领域状态和非安全状态。
- 安全状态是否实现由实现定义。
- 如果实现了安全状态,处理单元还必须实现 FEAT_SEL2。
IZLZWD 在具有 FEAT_RME 特性的处理单元中,软件可以通过从 ID_AA64PFR0_EL1.SEL2 发现是否实现了 FEAT_SEL2 来发现是否实现了安全状态。
IYBGYV 图 D1-1 说明了具有 FEAT_RME 特性的处理单元中的安全状态。
图 D1-1 安全状态
其中:
- RMM 是领域管理监视器(Realm Management Monitor)。
- SPM 是安全分区管理器(Secure Partition Manager)。
- VM 是虚拟机(Virtual Machine)。
译者注: 图 D1-1 展示了在 FEAT_RME 架构下,各异常级别(EL0-EL3)与不同安全状态(Root、Realm、Non-secure、Secure)的映射关系,以及各状态下运行的软件组件类型。
D1.1.3 未实现异常级别的影响(Effect of not implementing an Exception level)
RKFGRW 异常不能被带入未实现的异常级别。
RHRDVX 任何定义向未实现异常级别产生异常的可配置指令控制不会导致向该未实现异常级别产生异常。可配置异常控制的有效值是不对该异常级别产生异常的值。
RWPVKJ 从较低异常级别向未实现的异常级别发出的系统调用是未定义(UNDEFINED)的。
RWPXJS 与未实现的异常级别相关联的转换机制(translation regime)未实现。
RWKQBG 任何以未实现的异常级别为目标异常返回都是非法返回。
RGTCCW 与未实现的异常级别相关联的每个可访问寄存器为 RES0,除非该寄存器仅在与将执行转移到较低异常级别相关时才例外。
D1.1.3.1 当 EL3 未实现时的行为(Behavior when EL3 is not implemented)
RBSNQL 如果 EL3 未实现,SCR_EL3.NS 具有固定的有效值,该值由实现定义。
IBWVTM 实现可以提供一个配置输入,用于确定复位时 SCR_EL3.NS 的有效值。
RLBZCK 如果 EL3 未实现且 SCR_EL3.NS 的有效值为 0,则以下全部适用:
- MDCR_EL3.EPMAD 的有效值为 1。
- MDCR_EL3.EDAD 的有效值为 1。
- MDCR_EL3.SPME 的有效值为 1。
- MDCR_EL3.NSPB 的有效值为 0b01。
- MDCR_EL3.SPD32 的有效值为 0b11。
- MDCR_EL3.STE 的有效值为 1。
RZTWJS 如果 EL3 未实现,MDCR_EL3.STE 的有效值是 SCR_EL3.NS 有效值的反相。
RRDYPY 如果以下全部为真,则 SCR_EL3.EEL2 的有效值为 1:
- EL3 未实现。
- EL2 已实现。
- SCR_EL3.NS 的有效值为 0。
D1.1.3.2 当 EL2 未实现时的行为(Behavior when EL2 is not implemented)
RPQDWN 如果 EL2 未实现,则以下全部适用:
- 虚拟中断被禁用。
- CNTHCTL_EL2[1:0] 的有效值为 0b11。
- HCR_EL2.E2H 的有效值为 0。
- HCR_EL2.TGE 的有效值为 0。
- MDCR_EL2.HPMN 的有效值为 PMCR_EL0.N 的值。
D1.1.3.3 当 EL2 未实现且 EL3 已实现时的行为(Behavior when EL2 is not implemented and EL3 is implemented)
RRJFFP 如果 EL2 未实现且 EL3 已实现,则以下全部适用:
- 除以下任何寄存器外,与 EL2 相关联的每个可访问寄存器为 RES0:
- 如果 EL1 可以使用 AArch32,则以下寄存器不为 RES0:
- DACR32_EL2。
- DBGVCR32_EL2。
- FPEXC32_EL2。
- IFSR32_EL2。
- 对于 VPIDR_EL2:
- 读取返回 MIDR_EL1 的值。
- 对 VPIDR_EL2 的写入被忽略。
- 对于 VMPIDR_EL2:
- 读取返回 MPIDR_EL1 的值。
- 对 VMPIDR_EL2 的写入被忽略。
- 如果 EL1 可以使用 AArch32,则以下寄存器不为 RES0:
- HCR_EL2.RW 的有效值为 SCR_EL3.RW 的值。
- SCR_EL3.HCE 为 RES0。
- 以下地址转换和 TLB 无效化指令是未定义的:
- AT S1E2R。
- AT S1E2W。
- TLBI VAE2, TLBI VAE2NXS。
- TLBI VALE2, TLBI VALE2NXS。
- TLBI VAE2IS, TLBI VAE2ISNXS。
- TLBI VALE2IS, TLBI VALE2ISNXS。
- TLBI VAE2OS, TLBI VAE2OSNXS。
- TLBI VALE2OS, TLBI VALE2OSNXS。
- TLBI ALLE2, TLBI ALLE2NXS。
- TLBI ALLE2IS, TLBI ALLE2ISNXS。
- TLBI ALLE2OS, TLBI ALLE2OSNXS。
- TLBI RVAE2, TLBI RVAE2NXS。
- TLBI RVALE2, TLBI RVALE2NXS。
- TLBI RVAE2IS, TLBI RVAE2ISNXS。
- TLBI RVALE2IS, TLBI RVALE2ISNXS。
- TLBI RVAE2OS, TLBI RVAE2OSNXS。
- TLBI RVALE2OS, TLBI RVALE2OSNXS。
D1.1.3.4 典型的异常级别使用模型(Typical Exception level usage model)
IWCCCB 架构不指定哪个软件使用哪个异常级别。此类选择超出架构范围。然而,以下是异常级别的常见使用模型:
| 异常级别 | 使用方式 |
|---|---|
| EL0 | 应用程序(Applications) |
| EL1 | 操作系统内核及通常称为特权级的相关功能 |
| EL2 | Hypervisor(虚拟机监控器) |
| EL3 | Monitor(监视器) |
译者注: EL0 运行用户应用程序,EL1 运行操作系统内核,EL2 运行 Hypervisor 实现虚拟化,EL3 运行安全监视器(Secure Monitor)用于安全状态切换。这是典型的 ARM 虚拟化软件栈布局。
D1.2 用于指令处理和异常处理的寄存器(Registers for instruction processing and exception handling)
IBCVRH 在ARM架构中,寄存器分为两大类别:
- 提供系统控制或状态报告的寄存器。
- 用于指令处理的寄存器,例如累加结果,以及用于处理异常。
更多信息参见AArch64系统寄存器描述(AArch64 System Register Descriptions)。
D1.2.1 通用寄存器(The general-purpose registers)
RJBKTZ 通用寄存器组包含31个通用寄存器,R0-R30。
IRKTLT 通用寄存器组与基础指令集中的指令相关联。
RYDKHJ 通用寄存器可以按以下方式访问:
- 31个64位寄存器,X0-X30。
- 31个32位寄存器,W0-W30。
IPVGXY 当Warm reset(热复位)被触发时,通用寄存器被复位为架构上未定义(UNKNOWN)的值。
更多信息参见寄存器大小(Register size)和AArch64执行状态下的寄存器(Registers in AArch64 Execution state)。
D1.2.2 栈指针寄存器(The stack pointer registers)
RBBRKH 如果处于AArch64状态,每个已实现的异常级别(Exception level)都有一个专用的栈指针寄存器。栈指针寄存器包括:
- SP_EL0。
- SP_EL1。
- 如果EL2已实现,则为SP_EL2。
- 如果EL3已实现,则为SP_EL3。
IYPMHQ 当Warm reset(热复位)被触发时,栈指针被复位为架构上未定义(UNKNOWN)的值。
更多信息参见特殊用途寄存器(Special purpose registers)和PC对齐检查(PC alignment checking)。
D1.2.2.1 栈指针寄存器选择(Stack pointer register selection)
RCNNQX 处理单元(PE)使用以下栈指针:
- 如果在EL0执行,则PE使用EL0栈指针SP_EL0。
- 如果在EL1、EL2或EL3执行,则PE使用由PSTATE.SP决定的栈指针:
- 如果PSTATE.SP为0,则PE使用EL0栈指针SP_EL0。
- 如果PSTATE.SP为1,则PE使用当前异常级别的栈指针。
ICSFMY 当发生异常捕获(exception is taken)时,选择目标异常级别的栈指针。
IVYNZY 所选栈指针可以通过异常级别的后缀来表示:
- t后缀,表示thread(线程),表示使用SP_EL0栈指针。
- h后缀,表示handler(处理程序),表示使用SP_ELx栈指针。
IQZDYD 以下是AArch64栈指针选项:
| 异常级别(Exception level) | 栈指针选项(Stack pointer) |
|---|---|
| EL0 | SP_EL0 |
| EL1 | SP_EL1 |
| EL2 | SP_EL2 |
| EL3 | SP_EL3 |
D1.2.3 SIMD和浮点寄存器(The SIMD and floating-point registers)
RJSCYH SIMD和浮点寄存器组包含32个四字(128位)SIMD和浮点寄存器,V0-V31。
ILMMMW SIMD和浮点寄存器组用于浮点运算、向量运算以及其他SIMD相关标量运算。
RLFCJZ SIMD和浮点寄存器可以按以下方式访问:
- 32个四字(128位)寄存器,Q0-Q31。
- 32个双字(64位)寄存器,D0-D31。
- 32个字(32位)寄存器,S0-S31。
- 32个半字(16位)寄存器,H0-H31。
- 32个字节(8位)寄存器,B0-B31。
- 128位元素向量。
- 64位元素向量。
IKFYJJ 当Warm reset(热复位)被触发时,SIMD和浮点寄存器被复位为架构上未定义(UNKNOWN)的值。
更多信息参见AArch64执行状态下的寄存器(Registers in AArch64 Execution state)。
D1.2.4 保存的程序状态寄存器(Saved Program Status Registers)
RPJSSD 在AArch64状态下,每个可以接收异常的目标已实现异常级别都有一个保存的程序状态寄存器(SPSR)。以下为SPSR:
- 对于使用AArch64捕获到EL1的异常,SPSR_EL1。
- 对于使用AArch64捕获到EL2的异常,SPSR_EL2。
- 对于使用AArch64捕获到EL3的异常,SPSR_EL3。
译者注: 保存的程序状态寄存器(SPSR)用于在异常发生时保存处理器的状态,以便在异常返回时能够恢复先前的执行状态。SPSR保存了异常发生前的PSTATE(处理状态)信息。
IDVBPS 当Warm reset(热复位)被触发时,SPSR被复位为架构上未定义(UNKNOWN)的值。
更多信息参见处理状态(PSTATE)和PSTATE。
D1.2.5 异常链接寄存器(Exception Link Registers)
RJQBYN 异常链接寄存器保存优先异常返回地址。
RVCLNF 在AArch64状态下,每个可以接收异常的目标已实现异常级别都有一个异常链接寄存器(ELR)。以下为ELR:
- 对于捕获到EL1的异常,ELR_EL1。
- 对于捕获到EL2的异常,ELR_EL2。
- 对于捕获到EL3的异常,ELR_EL3。
译者注: 异常链接寄存器(ELR)保存异常返回地址。当异常发生时,处理器将返回地址保存在对应异常级别的ELR中,异常处理完成后,程序通过异常返回指令从ELR中保存的地址继续执行。
ISHJSC 当Warm reset(热复位)被触发时,ELR被复位为架构上未定义(UNKNOWN)的值。
更多信息参见优先异常返回地址(Preferred exception return address)。
D1.3 系统寄存器锁定(System register locking)
D1.3 System register locking
RDJDVH 本节所有声明均需 FEAT_SRMASK 支持。
译者注: FEAT_SRMASK 是 ARMv8.6 引入的可选特性,用于支持系统寄存器掩码功能,使高异常级别可以屏蔽低异常级别的某些系统寄存器字段的写入。
注意
当 FEAT_SRMASK 实现时,HCR_EL2.E2H 为 RES1。
IDFJZG 软件可以对下表所示的掩码寄存器进行编程,以屏蔽相应系统寄存器的各个控制字段,具体如下:
- EL1 掩码寄存器从 EL1 MSR 写入中屏蔽 EL1 控制字段。
- EL2 掩码寄存器从 EL2 MSR 写入中屏蔽 EL2 控制字段。
例如,如果 TCRMASK_EL1 被编程为屏蔽某个 TCR_EL1 控制字段,则 EL1 对 TCR_EL1 的 MSR 写入不会更新该被屏蔽的字段。
表 D1-3 系统寄存器及其对应的掩码寄存器
| 系统寄存器(System register) | 掩码寄存器(Mask register) |
|---|---|
| ACTLR_EL1 | ACTLRMASK_EL1 |
| CPACR_EL1 | CPACRMASK_EL1 |
| SCTLR_EL1 | SCTLRMASK_EL1 |
| SCTLR2_EL1 | SCTLR2MASK_EL1 |
| TCR_EL1 | TCRMASK_EL1 |
| TCR2_EL1 | TCR2MASK_EL1 |
| ACTLR_EL2 | ACTLRMASK_EL2 |
| CPTR_EL2 | CPTRMASK_EL2 |
| SCTLR_EL2 | SCTLRMASK_EL2 |
| SCTLR2_EL2 | SCTLR2MASK_EL2 |
| TCR_EL2 | TCRMASK_EL2 |
| TCR2_EL2 | TCR2MASK_EL2 |
使用掩码寄存器使得 EL1 能够频繁更改特定的 EL1 控制字段,而不必总是将 EL1 MSR 系统寄存器写入捕获到 EL2。
译者注: 掩码机制的设计目的是减少 EL1 到 EL2 的陷阱开销。在没有掩码的情况下,EL1 对某些系统寄存器的每次写入都会被捕获到 EL2,由 EL2 的 hypervisor 进行处理后再放行。引入掩码后,EL2 可以预先配置哪些字段需要屏蔽,从而允许 EL1 直接修改其他字段,提高性能。
RFHCYV EL1 被允许在掩码寄存器为零时对其进行编程。否则,对掩码寄存器的写入是 UNDEFINED,除非该写入被捕获。
EL2 被允许在掩码寄存器为零时对其进行编程。否则,对掩码寄存器的写入是 UNDEFINED。
IVGNST 对非零掩码寄存器进行编程的尝试,仅在距上次将其设置为非零值的写入之后已发生上下文同步事件,且在新编程尝试之前,才保证是 UNDEFINED。这是因为检查其是否非零是对该寄存器的间接读取。
译者注: 这里的”间接读取”意味着检查掩码寄存器是否非零的操作本身可能与其他内存操作重排序。为了确保一致性,软件在修改掩码寄存器前需要显式地进行上下文同步(例如执行 ISB 指令)。
IQTNLT 对于每个 EL1 掩码寄存器:
- HFGRTR2_EL2 包含对 EL1 读取的细粒度陷阱控制。
- HFGWTR2_EL2 包含对 EL1 写入的细粒度陷阱控制。
译者注: 细粒度陷阱(Fine-grained trap)是 ARMv8.4 引入的机制,允许对特定的系统寄存器访问进行独立控制,而不必像传统方式那样对整个寄存器访问进行陷阱。HFGRTR2_EL2 和 HFGWTR2_EL2 是两个用于控制 EL1 对某些寄存器访问的细粒度陷阱寄存器。
D1.3.1 EL1 系统寄存器别名名称(EL1 System register alias names)
IQBPYD 对于表 D1-3 中的每个 EL1 系统寄存器,FEAT_SRMASK 提供一个 EL1 别名名称:
<System_register>ALIAS_EL1
这些在《系统和特殊用途寄存器别名》(System and Special-purpose register aliasing)中列出。
- EL1 软件在已知细粒度陷阱正在捕获对 EL1 系统寄存器的 EL1 写入时,可以使用这些别名名称。
- 对于表 D1-3 中的每个 EL2 系统寄存器,FEAT_SRMASK 不提供 EL2 别名名称。
- 在 EL2 执行的 kernel 预期使用 EL1 别名名称。
译者注: 之所以 EL2 kernel 使用 EL1 别名,是因为在 FEAT_SRMASK 实现时 HCR_EL2.E2H 为 RES1,这意味着 EL2 以类似于 EL1 运行的方式运行(E2H = EL2 hosts EL1)。因此,EL2 software 使用 EL1 别名来访问底层寄存器。
ICWCFN EL1 掩码寄存器不仅屏蔽相应的 EL1 系统寄存器,还同时屏蔽 EL1 别名名称。例如,如果 TCRMASK_EL1 被编程为屏蔽某个 TCR_EL1 控制字段,则 EL1 对 TCRALIAS_EL1 的 MSR 写入不会更新该被屏蔽的字段。
RCSSSN 对 EL1 别名名称的 MSR 和 MRS 访问是对相应 EL1 系统寄存器的直接访问。但是,如果没有显式同步,这些访问可能会相对于对 EL1 系统寄存器的 MSR 和 MRS 访问进行重排序。
IVPCLQ 从 EL1 访问每个 EL1 别名名称的可访问性与相应 EL1 系统寄存器的可访问性相同,但操作码除外,而且对 EL1 别名名称的读取和写入有独立的细粒度陷阱控制:
- HFGRTR2_EL2 包含对 EL1 读取的细粒度陷阱控制。
- HFGWTR2_EL2 包含对 EL1 写入的细粒度陷阱控制。
D1.3.2 掩码寄存器的 EL12 别名名称(EL12 alias names for mask registers)
IHFLBB 因为当 FEAT_SRMASK 实现时 HCR_EL2.E2H 为 RES1,所以 FEAT_SRMASK 为表 D1-3 中的每个 EL1 掩码寄存器提供一个 EL12 别名名称,供 EL2 hypervisor 软件使用。见《系统和特殊用途寄存器别名》。
译者注: EL12 别名是相对于 EL2 使用 VM 的概念。当 E2H=1 时,在 EL2 运行的 hypervisor 可以使用 EL12 操作数来访问配置为 EL1 运行的 VM 的寄存器。EL12 别名允许 EL2 hypervisor 独立配置每个虚拟机的掩码寄存器。
D1.3.3 嵌套虚拟化(Nested virtualization)
IGFHTJ 被 FEAT_NV2 转换为存储的 MSR 写入不会被 EL1 掩码寄存器配置屏蔽。
译者注: FEAT_NV2 是嵌套虚拟化支持特性。当启用嵌套虚拟化时,来自 EL1 的某些 MSR 写入会被转换为虚拟内存请求(在 EL2 内部处理),而不是直接写入物理寄存器。这些转换后的存储不受掩码寄存器影响,因为掩码机制主要用于优化直接访问路径。
修订历史
- M.b — 机密性级别变更
D1.4 异常(Exceptions)— 第一部分
D1.4.1 异常入口术语(Exception entry terminology)
D1.4.1.1 被捕获(Taken)、捕获源(taken from)和捕获目标(taken to)
RVDFHD 当PE响应异常时,该异常被捕获(taken)。
RFXGFX 捕获异常前PE的状态即为异常被捕获的来源状态(the state the exception is taken from)。
RWTMVN 捕获异常后PE的状态即为异常被捕获的目标状态(the state the exception is taken to)。
D1.4.1.2 异常生成指令(Exception generating instructions)
RQPPFN 异常生成指令有意在紧随该指令之后的指令流中产生精确异常(precise exception)。这些指令包括:
- HVC(Hypervisor Call,超visor调用)。
- SMC(Secure Monitor Call,安全监视器调用)。
- SVC(Supervisor Call,监管者调用)。
D1.4.1.3 同步异常和异步异常(Synchronous and asynchronous exceptions)
RFQHGR 如果以下所有条件均适用,则该异常为同步异常(synchronous exception):
- 该异常是由于指令的直接执行或尝试执行而产生的。
- 优先异常返回地址与导致该异常的指令之间具有架构上定义的关系。
- 该异常是精确的(precise)。
RPCXDH 如果不是同步异常,则为异步异常(asynchronous exception)。
RJPZPR 捕获到AArch64状态的异步异常也称为中断(interrupts)。
译者注: 同步异常的特点是其发生与特定指令有直接关联,且返回地址可确定;异步异常则由外部事件(如硬件中断)触发,与指令执行无直接对应关系。
D1.4.1.4 精确异常和模糊异常的定义(Definition of a precise exception and imprecise exception)
RTNVSL 如果在捕获异常时,PE状态和内存系统状态与以下情况一致:PE已执行了到(但不包括)异常被捕获所在指令流中的点之前的所有指令,之后没有执行任何指令,则该异常为精确异常(precise exception)。然而,对于在异常被捕获的指令流点上立即执行的指令,精确的定义还允许以下任何情况:
对于由执行多个单拷贝原子内存访问的指令产生并捕获到AArch64状态的同步数据中止(Data Abort)和监视点(Watchpoint)异常,如果以下所有条件均适用,受该指令影响的寄存器或内存中的值可能为UNKNOWN:
- 影响这些寄存器或内存位置的访问本身不会产生异常或调试事件。
- 这些寄存器不参与该指令使用的内存地址计算。
对于由在AArch64状态下执行的加载或存储指令产生的同步数据中止和监视点异常,以下所有情况都可能发生:
- 如果指令是加载到基址寄存器或偏移寄存器的加载,则该寄存器被恢复到原始值,任何其他目标寄存器变为UNKNOWN。
- 如果指令是加载指令,但没有加载基址寄存器或偏移寄存器,则目标寄存器变为UNKNOWN。
- 如果指令是尝试执行加载和存储的原子操作,且加载目标是基址寄存器、源寄存器或比较寄存器,则该寄存器被恢复到原始值。否则,该目标寄存器变为UNKNOWN。
对于包含浮点异常同步生成功能的实现,当捕获浮点异常时,允许不恢复累积浮点异常位。
对于从执行多个单拷贝原子内存访问的指令的AArch64状态捕获的精确异常,如果以下所有条件适用,受该指令影响的寄存器或内存中的值可能为UNKNOWN:
- 该指令不是GCSSS2。
- 影响这些寄存器或内存位置的访问本身不会产生异常或调试事件。
- 这些寄存器不参与该指令使用的内存地址计算。
对于由内存复制和内存设置指令产生的同步异常或同步调试状态入口,以及在内存复制和内存设置指令执行过程中产生的异步异常或异步调试状态入口:
- 在异常入口时,PSTATE.{N, Z, C, V}的值为UNKNOWN。在异常入口时,SPSR_ELx.{N, Z, C, V}保存的值,以及调试状态入口时DSPSR_EL0.{N, Z, C, V}保存的值,为该指令的初始值。
- 在异常被捕获的点上,假代码写入的所有内存位置都已更新。
- 如果在异常被捕获的点上未被假代码写入的内存位置属于以下集合中的位置:在以异常捕获时呈现的X[n]、X[d]和X[s]寄存器值重启时,该指令要读取的位置集合,则这些内存位置未被更新。
- 对于CPYFT和SET{G}T指令,在异常被捕获的点上未被假代码写入的内存位置都未被更新。
- 对于除CPYFT和SET{G}T之外的内存复制和内存设置指令,如果以下所有条件适用,任何本身不会在写入时产生同步异常的内存位置变为UNKNOWN:
- 该内存位置属于在以异常捕获时呈现的X[n]、X[d]和X[s]寄存器值重启时,该指令要写入的位置集合。
- 该内存位置不属于在该重启时该指令要读取的位置集合。
- 仅对于由内存复制和内存设置指令产生的同步异常或同步调试状态入口:
- 在捕获异常时,X[n]、X[d]以及适当的X[s]寄存器值保存了一组自一致的值,对应于第一个未被复制或设置的元素,使得返回到该指令能够恢复内存复制或内存设置。该第一个元素不一定是具有监视点的元素,但可以是更早的元素,包括第一个元素。
- 如果某个在以异常捕获时呈现的X[n]、X[d]和X[s]寄存器值重启时该指令要写入的内存位置,在写入时会产生同步异常,且该内存位置不属于在该重启时该指令要读取的位置集合,则该内存位置保持不变。
- 对于同步异常,ELR_ELx指向产生该异常的指令。
- 对于同步调试状态入口,DLR_EL0指向产生该调试状态入口的指令。
- 仅对于在内存复制和内存设置指令执行过程中产生的异步异常或异步调试状态入口:
- 在捕获异常时,由指令更新的寄存器的值呈现为一组自一致的值,对应于第一个未被复制或设置的元素。
RZNCXP 如果不是精确异常,则为模糊异常(imprecise exception)。
RLSGJD 除SError异常外,捕获到AArch64状态的所有异常都是精确异常。对于每次SError异常,该中断是精确还是模糊是实现定义的(IMPLEMENTATION DEFINED)。
IZNNNY 由某个加载产生的异步数据中止异常,在该加载之后的指令流中的某个稍后点捕获SError异常,通常是模糊的。SError异常通常是模糊的,因为从加载返回的数据是UNKNOWN,因此可能在捕获异常时呈现的状态已损坏。
译者注: 精确异常保证处理器状态与已执行指令完全一致;模糊异常则可能存在状态不一致的情况,这在异步外部中止中尤为常见。
D1.4.1.5 优先异常返回地址(Preferred exception return address)
ILQPWH 优先异常返回地址是软件在处理异常后可能返回以恢复执行的地址。
IHBQRX 优先异常返回地址由异常类型决定。
RDPLYN 对于使用AArch64捕获到异常级别ELx的异常,该异常级别的异常链接寄存器ELR_ELx被设置为优先异常返回地址。
RVBQMV 对于异步异常,优先异常返回地址是中断发生处的指令边界之后那条指令的地址。
RQYCWH 对于同步异常(异常生成指令除外),优先异常返回地址是产生该异常的指令的地址。
RDKWPP 对于执行的异常生成指令,优先异常返回地址是紧随该异常生成指令之后的指令的地址。
RLBLBR 对于因异常级别权限不足而被捕获、禁用或未定义(UNDEFINED)的异常生成指令,优先异常返回地址是该异常生成指令的地址。
RXVMNH 当从使用AArch32的异常级别捕获异常到使用AArch64的异常级别ELx时,ELR_ELx[63:32]为0。
D1.4.1.6 异常向量(Exception vectors)
RFKKHH 当异常被捕获到使用AArch64的异常级别时,执行从异常向量开始。
IQLHPV 异常向量的内存位置预期包含与该异常类别对应的处理程序代码。
RBRCKV 异常级别ELx的向量基地址由向量基地址寄存器VBAR_ELx定义。
RPJKRC 每个异常类别在向量基地址的固定偏移处有一个异常向量。
IYCTHH 捕获到AArch64的异常根据以下信息分类,以便分配异常向量:
- 该异常是否是以下之一:
- 同步异常,不包括同步外部中止。
- 同步外部中止。
- SError异常,包括vSError和委托的SError异常。
- IRQ或vIRQ中断。
- FIQ或vFIQ中断。
- 关于异常来源的异常级别的信息。
- 关于正在使用的SP的信息。
- 寄存器文件的状态。
有关同步异常的信息,请参见同步异常类型(Synchronous exception types)。有关异步异常的信息,请参见异步异常类型(Asynchronous exception types)。
RRYXCL 以下表格描述了添加到向量基地址以定位异常向量的偏移量:
表 D1-7 异常向量偏移量(异常类型)
| 异常捕获来源 | 同步异常(不包括外部中止)偏移量 | IRQ和vIRQ偏移量 | FIQ和vFIQ偏移量 |
|---|---|---|---|
| 使用SP_EL0的当前异常级别 | 0x000 | 0x080 | 0x100 |
| 使用SP_ELx(x>0)的当前异常级别 | 0x200 | 0x280 | 0x300 |
| 较低异常级别(实现级别中比目标级别低的级别使用AArch64) | 0x400 | 0x480 | 0x500 |
| 较低异常级别(实现级别中比目标级别低的级别使用AArch32) | 0x600 | 0x680 | 0x700 |
表 D1-7(续)异常向量偏移量(同步外部中止)
| 异常捕获来源 | 同步外部中止(EASE==0)偏移量 | 同步外部中止(EASE==1)偏移量 | SError、vSError和委托的SError偏移量 |
|---|---|---|---|
| 使用SP_EL0的当前异常级别 | 0x000 | 0x180 | 0x180 |
| 使用SP_ELx(x>0)的当前异常级别 | 0x200 | 0x380 | 0x380 |
| 较低异常级别(实现级别中比目标级别低的级别使用AArch64) | 0x400 | 0x580 | 0x580 |
| 较低异常级别(实现级别中比目标级别低的级别使用AArch32) | 0x600 | 0x780 | 0x780 |
译者注: EASE(External Abort Synchronous Enable)是控制同步外部中止行为的配置位。异常向量表是每个异常级别独立的,通过VBAR_ELx设置基地址。
适用于前述表格的EASE值为:
- 对于捕获到EL1的异常,SCTLR2_EL1.EASE的有效值。
- 对于捕获到EL2的异常,SCTLR2_EL2.EASE的有效值。
- 对于捕获到EL3的异常,SCR_EL3.EASE的有效值。
IFSZTB 对于前述表格,如果EL3是目标异常级别,则实现级别中比EL3低的级别为:
- 如果EL2已实现且对异常捕获来源的异常级别的安全状态已启用,则为EL2。
- 如果EL2未实现或对该安全状态未启用,则为EL1。
D1.4.2 异常入口(Exception entry)
RDQXFW 当异常被捕获到使用AArch64状态的异常级别ELx时,发生以下所有情况:
- SPSR_ELx中的字段根据SPSR_ELx中的描述写入,基于异常捕获前PSTATE中的值。
- 优先异常返回地址被写入ELR_ELx。
- 异常捕获后的PSTATE内容如规则RWTXBY所述。
- 对于同步异常和SError异常,异常综合征信息被写入ESR_ELx。
- 执行从目标异常级别的异常向量开始。
RWTXBY 当异常被捕获到使用AArch64状态的异常级别ELx时,在SPSR_ELx中记录先前的值后,以下PSTATE位被设置:
- PSTATE.EL被设置为目标异常级别。
- 所有PSTATE.{D, A, I, F, SP}被设置为1。
- PSTATE.{IL, nRW}被设置为0。
- PSTATE.SS根据AArch64自托管调试(Self-hosted Debug)中的规则设置。
- 如果实现了FEAT_PAN,则对于以下任何情况,PSTATE.PAN被设置为1:
- 目标异常级别是EL1且SCTLR_EL1.SPAN为0。
- 目标异常级别是使用AArch64的EL2,且HCR_EL2.{E2H, TGE}的有效值为{1, 1},且SCTLR_EL2.SPAN为0。
- 如果实现了FEAT_PAN,目标异常级别是使用AArch64的EL2,且HCR_EL2.{E2H, TGE}的有效值为{1, 0},且SCTLR_EL2.SPAN为0,则PSTATE.PAN是否设置为1是实现特定的。
- 如果实现了FEAT_UAO,则PSTATE.UAO被设置为0。
- 如果实现了FEAT_BTI,则PSTATE.BTYPE被设置为0b00。
- 如果实现了FEAT_MTE,则PSTATE.TCO被设置为1。
- 如果实现了FEAT_SSBS,则PSTATE.SSBS被设置为SCTLR_ELx.DSSBS的值。
- 如果实现了FEAT_NMI,则PSTATE.ALLINT被设置为SCTLR_ELx.SPINTMASK的 inverse值。
- 如果实现了FEAT_EBEP、FEAT_SPE_EXC或FEAT_TRBE_EXC,则PSTATE.PM被设置为1。
- 如果实现了FEAT_GCS,则PSTATE.EXLOCK根据以下情况更新:
- 在捕获到同一异常级别的异常时,PSTATE.EXLOCK被设置为当前异常级别的GCSCR_ELx.EXLOCKEN的有效值。
- 在捕获到更高异常级别的异常时,PSTATE.EXLOCK被设置为0。
- 如果实现了FEAT_PAuth_LR,则PSTATE.PACM被设置为0。
RXKSNJ 如果实现了FEAT_UINJ,则当异常被捕获到使用AArch64状态的异常级别ELx时,PSTATE.UINJ被设置为0,且存储在SPSR_ELx中的结果值为0。
IRFWPH 当异常被捕获到使用AArch64状态的异常级别时,以下PSTATE字段保持不变:
- 如果实现了FEAT_DIT,则PSTATE.DIT。
- 如果实现了FEAT_SME,则PSTATE.{SM, ZA}。
IHLPGV 当执行未被捕获、禁用或未定义(UNDEFINED)的SVC、HVC或SMC指令时,PSTATE.PACM被设置为0,且存储在SPSR_ELx.PACM中的结果值为0。
RSRXVW 如果目标异常级别的SCTLR_ELx.IESB有效值为1,则捕获到AArch64状态的异常是错误同步事件。
RBBSRF 如果SCTLR_ELx.EIS为1,则异常入口是上下文同步事件。如果SCTLR_ELx.EIS为0,则异常入口不是上下文同步事件,但异常入口对ESR_ELx、FAR_ELx、SPSR_ELx、ELR_ELx和HPFAR_EL2的间接写入是同步的,因此异常入口后的直接读取会看到由异常入口引起的间接写入的值。
IJFWCQ 就内存模型而言,某些异常入口是指令取屏障(Instruction Fetch Barrier)效果,无论SCTLR_ELx.EIS的值如何。参见基本定义中的异常入口列表。
IFZTLH 异常入口时错误同步和上下文同步的排序在假代码中描述。
IWPBHV 内存复制和内存设置操作仅在序言、主部和尾声内存复制和内存设置指令连续执行并连续放置在内存中时才能保证正确工作。如果这三个指令不连续执行,可能导致这些指令引发异常。软件异常处理程序预期需要这三个指令连续放置在内存中。如果这三个指令不连续放置在内存中,则异常返回可能返回到错误的指令。
ILBHFM 同步外部中止和SError异常还有其他行为。参见捕获错误异常(Taking error exceptions)。
D1.4.2.1 同步异常入口(Synchronous exception entry)
RPMQBM 对于从使用AArch64的异常级别捕获的以下任何同步异常,如果实现了FEAT_BTI,则PSTATE.BTYPE被复制到SPSR_ELx.BTYPE,然后PSTATE.BTYPE被设置为0:
- 软件步进(Software Step)异常。
- PC对齐fault异常。
- 指令中止(Instruction Abort)异常。
- 断点(Breakpoint)异常。
- 地址匹配向量捕获(Address Matching Vector Catch)异常。
- 非法执行状态(Illegal Execution state)异常。
- 软件断点(Software Breakpoint)异常。
- 分支目标(Branch Target)异常。
当从使用AArch64的异常级别捕获任何其他同步异常时,以下情况是受限不可预测(CONSTRAINED UNPREDICTABLE)的:
- SPSR_ELx.BTYPE是否被设置为PSTATE.BTYPE的值。
- SPSR_ELx.BTYPE是否被设置为0。
然后PSTATE.BTYPE被设置为0。
IKVRPF 对于导致异常处理程序模拟指令并返回到后续指令的同步异常,处理程序通常完成时确保从异常返回时PE的状态与已执行的模拟指令一致。这通常包括确保SPSR_ELx.BTYPE的值与被模拟的指令已执行相一致。
对于SVC、HVC和SMC指令,当这些指令执行而未被捕获时,SPSR_ELx的值已指向后续指令。然而SPSR_ELx.BTYPE不保证为0,因此可能与SVC、HVC或SMC指令已执行不一致。这可能随后在SVC、HVC或SMC之后的指令处导致分支目标异常。这在真实代码中不太可能遇到,因为这需要SVC、HVC或SVC在非守卫页面中执行,而SVC、HVC或SMC之后的指令在守卫页面中执行。
RZTSSH 对于以下任何同步异常类型,当异常被捕获到异常级别ELx时表征异常的虚拟地址(VA)被捕获到FAR_ELx中:
- 指令中止(Instruction Abort)异常。
- 数据中止(Data Abort)异常。
- PC对齐fault异常。
- 监视点(Watchpoint)异常。
对于GPC异常,表征异常的VA被捕获到FAR_EL3中。
对于不是由翻译表遍历引起的同步外部中止,FAR_ELx是否包含表征异常的VA是受限不可预测的。ESR_ELx.FnV位(在外部中止的ISS编码中)指示FAR_ELx中VA的有效性:
- 如果外部中止的ISS编码中ESR_ELx.FnV为1,则FAR_ELx中的VA为UNKNOWN。
- 如果外部中止的ISS编码中ESR_ELx.FnV为0,则FAR_ELx中的VA有效。
对于所有其他捕获到ELx的异常,FAR_ELx为UNKNOWN。
RJXPNL 当SME加载或存储指令,或SVE连续向量加载或存储指令导致数据中止异常并设置ESR_ELx.ISV为0时:
- 如果写入FAR_ELx的值可能不是faulting VA,则PE设置ESR_ELx.FnP为1,并将FAR_ELx设置为包含faulting VA的自然对齐fault粒度中的任何地址。自然对齐的fault粒度在FAR_ELx寄存器描述中定义。
- 否则,PE设置ESR_ELx.FnP为0。
RFKLWR 对于由以下fault引起的指令中止或数据中止异常,当异常被捕获到EL2时,表征异常的中级物理地址(IPA)被捕获到HPFAR_EL2中:
- 不在阶段1翻译表遍历上的阶段2翻译的翻译fault、访问标志fault或地址大小fault。
- 在阶段1翻译表遍历中访问的地址的阶段2翻译的翻译fault、访问标志fault、地址大小fault或权限fault。
- 阶段2翻译表访问的粒度保护fault(GPF)。
对于由于阶段2翻译表访问的fault而导致的GPC异常,表征异常的IPA被捕获到HPFAR_EL2中。
对于所有其他使用AArch64捕获到EL2的异常,HPFAR_EL2为UNKNOWN。
RBFJJV 对于GPC异常,表征异常并捕获到MFAR_EL3中的PA和物理地址空间。
RTGQRC 对于由外部中止引起的指令中止或数据中止异常,当实现了FEAT_PFAR时:
- 如果以下所有条件适用,则设置ESR_ELx.PFV为0:
- 异常被捕获到EL1。
- EL2已实现并在当前安全状态下启用。
- HCR_EL2.VM的有效值为1。
- 否则,ESR_ELx.PFV被设置为0或1的实现定义值。
对于所有其他指令中止和数据中止异常,ESR_ELx.PFV被设置为0。
在捕获指令中止或数据中止异常时:
- 如果PE设置了ESR_ELx.PFV为1,则表征异常并捕获到PFAR_ELx或MFAR_EL3(适用时)的物理地址空间和PA。fault粒度大小由DLVGRB定义。
- 如果PE设置了ESR_ELx.PFV为0,则适用的PFAR_ELx或MFAR_EL3寄存器被设置为UNKNOWN值。
注意: PFAR_ELx从不记录中级物理地址(IPA)。如果未使用阶段2翻译且使用其他方法(如影子页表)将物理地址对客户操作系统隐藏,则PFAR_ELx可能向客户操作系统暴露faulting物理地址。
RDHLHF 对于所有其他异常(指令中止、数据中止和GPC异常除外),适用的PFAR_ELx或MFAR_EL3寄存器被设置为UNKNOWN值。
RTGRZL 如果指令中止或断点异常在内存复制和内存设置指令执行过程中产生,异常的呈现如同步异常或同步调试状态入口(由内存复制和内存设置指令产生)的RTNVSL所述。
RZMSLS 对于CPY*内存复制指令,如果读取和写入都产生数据中止或监视点异常,则呈现读取异常还是写入异常是受限不可预测的。ESR_ELx.ISS.WnR被设置以与异常是在读取还是写入上一致。
D1.4.2.1.1 SVE MOVPRFX异常入口行为(SVE MOVPRFX exception entry behavior)
RRWVTR 当MOVPRFX指令与另一条指令合法配对且该对执行产生同步异常时:
- 如果生成的异常是来自前缀BRK指令的断点指令异常,则MOVPRFX更新架构状态且ELR_ELx存储BRK指令的地址。
- 否则,存储在ELR_ELx中的返回地址为以下之一:
- 当MOVPRFX指令未导致架构状态更改时,存储MOVPRFX指令的地址。
- 当MOVPRFX指令导致架构状态更改时,存储前缀指令的地址。
RXRWVD 当MOVPRFX指令与另一条指令合法配对且该对执行导致同步进入调试状态时:
- 如果调试状态入口是由于来自前缀HLT指令的halt指令调试事件,则MOVPRFX更新架构状态且DLR_EL0存储HLT指令的地址。
- 否则,存储在DLR_EL0中的返回地址为以下之一:
- 当MOVPRFX指令未导致架构状态更改时,存储MOVPRFX指令的地址。
- 当MOVPRFX指令导致架构状态更改时,存储前缀指令的地址。
RTPRKM 当MOVPRFX指令与另一条指令非法配对且该对执行产生同步异常时,存储在ELR_ELx中的返回地址是以下之一的选择(受限不可预测):
- MOVPRFX指令的地址。
- 前缀指令的地址。
RJVNGC 当MOVPRFX指令与另一条指令非法配对且该对执行导致进入调试状态时,存储在DLR_EL0中的返回地址是以下之一的选择(受限不可预测):
- MOVPRFX指令的地址。
- 前缀指令的地址。
RCRRPM 当前缀指令由于MMU fault或同步外部中止而产生指令中止且MOVPRFX不产生指令中止时,前缀指令的地址被记录在适当的FAR_ELx或HPFAR_EL2寄存器中,MOVPRFX指令的地址被记录在适当的ELR_ELx寄存器中。
RZJYDX 当前缀指令由于MMU fault或同步外部中止而产生指令中止且MOVPRFX也产生指令中止时,MOVPRFX指令的地址被记录在适当的FAR_ELx或HPFAR_EL2寄存器中,适当的ELR_ELx寄存器。
D1.4.2.2 异步异常入口(Asynchronous exception entry)
RBWRCL 如果实现了FEAT_BTI,则当从使用AArch64的异常级别捕获异步异常时,PSTATE.BTYPE被复制到SPSR_ELx.BTYPE,然后PSTATE.BTYPE被设置为0。
RJBKRW 如果以下任何条件适用,则当物理SError异常被捕获到AArch64状态时,物理SError的待处理状态被清除:
- 已实现FEAT_DoubleFault。
- 如果实现了FEAT_RAS,且在捕获SError异常时记录在ESR_ELx中的综合征表明是SError而不是实现定义或未分类的SError异常综合征。参见捕获错误异常。
否则,物理SError的待处理状态是否清除是实现定义的。此实现定义的行为可能根据SError异常的类型而有所不同。
RSYZRH 当虚拟SError异常被捕获到AArch64状态时,HCR_EL2.VSE被设置为0。
RQXQQX 当委托SError异常被捕获时,SCR_EL3.DSE被设置为0。
RNPSDK 当实现了FEAT_PFAR时,在使用AArch64的异常级别捕获SError异常时:
- 如果以下所有条件适用,则设置ESR_ELx.PFV为0:
- 异常被捕获到EL1。
- EL2已实现并在当前安全状态下启用。
- HCR_EL2.VM的有效值为1。
- 否则,ESR_ELx.PFV被设置为0或1的实现定义值。
在捕获SError异常时,如果PE设置了ESR_ELx.PFV为1,则:
- 将faulting物理地址所在同一自然对齐fault粒度内的地址写入PFAR_ELx.PA或MFAR_EL3.PA(适用时)。fault粒度大小由DLVGRB定义。
- 将faulting物理地址空间写入PFAR_ELx.{NSE, NS}或MFAR_EL3.{NSE, NS}(适用时)。
注意: PFAR_ELx从不记录中级物理地址(IPA)。如果未使用阶段2翻译且使用其他方法(如影子页表)将物理地址对客户操作系统隐藏,则PFAR_ELx可能向客户操作系统暴露faulting物理地址。
RYJTBL 在捕获SError异常时,以下寄存器根据ESR_ELx.PFV值为UNKNOWN:
- 如果ESR_EL1.PFV设置为0,则PFAR_EL1为UNKNOWN。
- 如果ESR_EL2.PFV设置为0,则PFAR_EL2为UNKNOWN。
- 如果ESR_EL3.PFV设置为0,则MFAR_EL3为UNKNOWN。
RGZVBJ 异步异常或异步调试状态入口可以在内存复制和内存设置指令执行过程中产生。对于异步异常,ELR_ELx指向异常被捕获的指令。对于异步调试状态入口,DLR_EL0指向调试状态入口被捕获的指令。
RMNGMW 对于在内存复制和内存设置指令执行过程中产生的模糊异步异常,以下为UNKNOWN:
- X[n]、X[d]和X[s]寄存器的状态。
- 指令正在写入的内存状态。
D1.4.3 异常返回术语(Exception return terminology)
D1.4.3.1 返回(Return)、返回源(return from)和返回目标(return to)
RMMSFW 异常返回由执行异常返回指令引起。
RJDJHH 执行异常返回指令之前PE的状态即为异常返回的源状态(the state the exception returns from)。
RHNVMN 执行异常返回指令后PE的状态即为异常返回的目标状态(the state the exception returns to)。
D1.4.4 异常返回(Exception return)
RSKNJF 在AArch64状态中,异常返回指令为ERET、ERETAA和ERETAB。
RPKJFB 异常返回指令在EL0中是未定义(UNDEFINED)的。
RSVBYH 异常返回要么是合法的,要么是非法的。
D1.4.4.1 从AArch64状态的合法异常返回(Legal exception returns from AArch64 state)
RBWCFK 对于从异常级别ELx的合法异常返回,发生以下所有情况:
如果SCTLR_ELx.IESB为1,且异常返回指令未产生异常,则PE在该指令前插入错误同步事件。
PSTATE中与SPSR_ELx中对应字段具有相同含义的字段根据SPSR_ELx中的描述写入。
PC被设置为ELR_ELx中的值。
如果返回到使用AArch32状态的异常级别,则以下均适用:
- 如果SPSR_ELx.T为0,则ELR_ELx[1:0]在设置PC时被视为0。
- 如果SPSR_ELx.T为1,则ELR_ELx[0]在设置PC时被视为0。
PSTATE的内容被设置为SPSR_ELx中保存的值。
如果实现了FEAT_PAuth_LR且以下任何条件适用,则PSTATE.PACM被设置为0:
- 使用PSTATE.PACM的平凡实现。
- 在目标异常级别禁用PACM指令的效果。
如果从SPSR_ELx复制的PSTATE.IL位为1且返回的目标异常级别使用AArch32状态,则PSTATE.{IT, T}位由以下之一的选择决定(实现定义):
- 设置为0。
- 对于由异常返回指令或DRPS指令启动的返回,从SPSR_ELx复制。
- 对于调试出口,从DSPSR_EL0复制。
实现定义的选择可能在实现内动态变化。软件必须将该值视为两个值之间的UNKNOWN选择。
执行异常返回指令的PE的事件寄存器被设置。
执行异常返回指令的PE的本地独占监视器被清除。清除本地独占监视器是否也清除全局独占监视器是实现定义的。
在PC被设置为ELR_ELx中保存的值且PSTATE的内容被设置为SPSR_ELx中保存的值之后,ELR_ELx和SPSR_ELx变为UNKNOWN。
如果异常返回来自EL2到使用AArch64状态的EL0且HCR_EL2.TGE为0,则ELR_EL1和SPSR_EL1变为UNKNOWN。
如果SCTLR_ELx.EOS的有效值为1,则异常返回是上下文同步事件。
如果SCTLR_ELx.EOS的有效值为0,则异常返回不是上下文同步事件。
D1.4.4.2 从AArch64状态的非法异常返回(Illegal exception returns from AArch64 state)
RTYTWB 在AArch64状态中,以下任何情况都可能导致非法异常返回:
- 返回到比当前异常级别更高的异常级别。
- 返回到未实现的异常级别。
- 如果实现了FEAT_RME,则如果SCR_EL3.{NSE, NS}为{1, 0},则从EL3到较低异常级别的异常返回。
- 如果以下所有条件为真且返回到EL1:
- EL2已实现并在当前安全状态下启用。
- HCR_EL2.TGE为1。
- 如果以下所有条件为真且返回到EL2:
- EL3已实现。
- SCR_EL3.NS为0。
- 未实现FEAT_SEL2。
- 如果以下所有条件为真且返回到EL2:
- EL3已实现。
- SCR_EL3.NS为0。
- 已实现FEAT_SEL2。
- SCR_EL3.EEL2为0。
- 如果保存的PSTATE.M[4]为0且以下至少一项为真,则返回:
- M[1]为1。
- M[3:0]为0b0001。
- 返回目标异常级别使用AArch32状态(由SCR_EL3.RW、HCR_EL2.RW或从复位时的配置确定)。
- 如果保存的PSTATE.M[4]位为1(指示返回到AArch32状态)且以下至少一项为真:
- 任何异常级别都不支持AArch32状态。
- M字段值不是有效的AArch32状态PE模式。
- 返回目标异常级别使用AArch64状态(由SCR_EL3.RW、HCR_EL2.RW或从复位时的配置确定)。
- 如果GCSCR_ELx.EXLOCKEN的有效值为1且PSTATE.EXLOCK为0,则执行异常返回指令返回到当前异常级别ELx。
RVWJHB 对于从异常级别ELx的非法异常返回,发生以下所有情况:
- 如果SCTLR_ELx.IESB为1,则PE在该指令前插入错误同步事件。
- PC被设置为ELR_ELx中的值。
如果保存的PSTATE.M[4]位为1,对于到AArch32状态的非法异常返回,以下均为真:- PC bits[31:2]被设置为ELR_ELx中的值。
- PC bits[63:32, 1:0]为UNKNOWN。
- PSTATE.IL被设置为1。
- PSTATE.{EL, nRW, SP}保持不变。
- PSTATE.{N, Z, C, V, D, A, I, F}被设置为SPSR_ELx中的相应值。
- PSTATE.SS的处理如同返回是合法异常返回。
- 如果PSTATE.nRW为1(指示返回到AArch32状态),则以下PSTATE位也被设置:
- PSTATE.{Q, IT, GE, E}被设置为SPSR_ELx中的相应值。
- PSTATE.T是0还是设置为SPSR_ELx的内容是受限不可预测的。
- 如果实现了FEAT_PAN,则PSTATE.PAN被设置为SPSR_ELx中的相应值。
- 以下均为UNKNOWN:
- 如果实现了FEAT_UAO,则PSTATE.UAO。
- 如果实现了FEAT_DIT,则PSTATE.DIT。
- 如果实现了FEAT_MTE,则PSTATE.TCO。
- 如果实现了FEAT_SSBS,则PSTATE.SSBS。
- 如果实现了FEAT_BTI,则PSTATE.BTYPE。
- 如果实现了FEAT_PAuth_LR,则PSTATE.PACM。
- 如果实现了FEAT_NMI,则PSTATE.ALLINT被设置为SPSR_ELx中的相应值。
- 如果实现了FEAT_EBEP、FEAT_SPE_EXC或FEAT_TRBE_EXC,则PSTATE.PM被设置为SPSR_ELx中的相应值。
- 如果实现了FEAT_GCS,则PSTATE.EXLOCK保持不变。
- 如果实现了FEAT_UINJ,则PSTATE.UINJ被设置为0。
- 执行异常返回指令的PE的事件寄存器被设置。
- 执行异常返回指令的PE的本地独占监视器被清除。清除本地独占监视器是否也清除全局独占监视器是实现定义的。
- 在PC被设置为ELR_ELx中保存的值且PSTATE的内容被设置为SPSR_ELx中保存的值之后,ELR_ELx和SPSR_ELx变为UNKNOWN。
- 如果SCTLR_ELx.EOS的有效值为1,则异常返回是上下文同步事件。
- 如果SCTLR_ELx.EOS的有效值为0,则异常返回不是上下文同步事件。
D1.4.5 同步异常类型(Synchronous exception types)
RBZGXV 以下所有都是同步异常:
- 任何由尝试执行未定义(UNDEFINED)指令而产生的异常,包括:
- 尝试在不适当的异常级别执行指令。
- 尝试在指令被禁用时执行指令。
- 尝试执行未分配的指令位模式。
- 尝试在任何指令当PSTATE.UINJ为1时执行。参见PSTATE.UINJ注入的未定义指令异常。
- 任何由PSTATE.IL为1时尝试执行指令而引起的异常。这些称为非法执行状态异常(Illegal Execution State exceptions)。
- 任何由使用未对齐SP引起的异常。这些称为SP对齐fault异常(SP Alignment Fault exceptions)。
- 任何由尝试执行PC未对齐的指令而引起的异常。这些称为PC对齐fault异常(PC Alignment Fault exceptions)。
- 如果实现了FEAT_BTI,执行在守卫内存区域中,且PSTATE.BTYPE不等于0,则任何由执行与PSTATE.BTYPE当前值不兼容的指令而引起的异常。这些称为分支目标异常(Branch Target exceptions)。
- 任何由指针认证指令认证失败引起的异常。这些称为PAC Fail异常。
- 任何由异常生成指令SVC、HVC或SMC引起的异常。这些分别称为监管者调用(SVC)异常、超visor调用(HVC)异常或安全监视器调用(SMC)异常。
- 尝试执行系统寄存器定义为被捕获到更高异常级别的指令的捕获尝试。这些称为捕获异常(Trap exceptions)。
- 任何由指令中止引起的异常,这些异常是由与从产生fault的内存区域取指相关的内存地址翻译系统生成的。这些称为指令中止异常(Instruction Abort exceptions)。
- 任何由数据中止引起的异常,这些异常是由内存地址翻译系统生成的,与尝试读取或写入产生fault的内存相关。这些称为数据中止异常(Data Abort exceptions)。
- 任何由地址未对齐引起的数据中止异常。这些称为数据中止异常。
- 如果实现了FEAT_MTE2,则任何由标签检查fault导致的数据中止异常。这些称为数据中止异常。
- 如果实现了FEAT_RME,则任何由粒度保护检查(GPC)fault导致的结果。根据异常原因、GPC fault类型和路由控制SCR_EL3.GPF的值,这些称为:
- GPC异常。
- 数据中止异常。
- 指令中止异常。
- 内存复制异常和内存设置异常。更多信息请参见内存复制和内存设置异常。
- 守卫控制栈异常。更多信息请参见守卫控制栈异常。
- 所有调试异常:
- 断点指令异常。
- 断点异常。
- 监视点异常。
- 向量捕获异常。
- 软件步进异常。
- 在支持浮点异常捕获的实现中,任何由捕获的浮点异常引起的异常。这些称为捕获浮点异常(Trapped Floating-point exceptions)。
- 由外部中止引起的一组实现定义的异常。
IXRFSY 架构允许但不需要同步或异步处理外部中止。然而,架构指定某些情况必须同步处理。更多信息请参见捕获错误异常。
D1.4.5.1 从EL0捕获同步异常(Taking synchronous exceptions from EL0)
RDPLSC 如果EL2使用AArch64且HCR_EL2.TGE的有效值为1,则当以下任何异常从EL0捕获时,它们被捕获到EL2,除非路由到更高的异常级别。如果EL2使用AArch64且HCR_EL2.TGE的有效值为0,则当以下任何异常从EL0捕获时,它们被捕获到EL1,除非路由到更高的异常级别:
- 阶段1数据中止。
- 阶段1指令中止。
- PC对齐fault。
- SP对齐fault。
- 标签检查fault。
- 分支目标异常。
- 非法执行状态异常。
- 捕获浮点异常。
- 监管者调用。
- 未定义指令异常。
- PAC Fail异常。
- WFE捕获。
- WFI捕获。
- 高级SIMD和浮点访问捕获。
- SVE访问捕获。
- SME访问捕获。
- SME非法指令异常。
- 同步外部中止。
- 内存复制和内存设置异常。
- PMU异常。
- 守卫控制栈异常。
如果EL2使用AArch64且HCR_EL2.TGE为1或MDCR_EL2.TDE为1,则当以下任何调试异常从EL0捕获时,它们被捕获到EL2。如果EL2使用AArch64且HCR_EL2.TGE为0且MDCR_EL2.TDE为0,则当以下任何调试异常从EL0捕获时,它们被捕获到EL1:
- 断点异常。
- 软件断点异常。
- 软件步进异常。
- 监视点异常。
如果EL2使用AArch64且HCR_EL2.TGE为1或MDCR_EL2.TDE为1,则当向量捕获异常从EL0捕获时,它被捕获到EL2。如果EL2使用AArch64且HCR_EL2.TGE为0且MDCR_EL2.TDE为0,则不能捕获向量捕获异常。
RJNBTN 对于因HCR_EL2.TGE值为1而从EL0捕获到EL2的异常:
- 如果异常本应使用除0x07之外的任何EC值在ESR_EL1中报告,则用于在ESR_EL1中报告异常的EC值和相应的ISS编码用于在ESR_EL2中报告异常。
- 如果异常本应使用EC值0x07在ESR_EL1中报告,则在ESR_EL2中报告EC值0x00和ISS编码值0x00。
D1.4.5.2 捕获同步外部中止的异常级别(Exception levels for taking a synchronous External abort)
RQDLHN 如果以下所有条件为真,则同步外部中止被捕获到使用AArch64的EL3:
- EL3已实现并使用AArch64。
- 以下任何条件为真:
- SCR_EL3.EA为1且异常从EL2、EL1或EL0捕获。
- 异常从EL3捕获。
否则,如果以下所有条件为真,则同步外部中止异常被捕获到EL2:
- EL2已实现并在当前安全状态下启用。
- 异常从EL1或EL0捕获。
- 以下任何条件为真:
- HCR_EL2.TEA或HCR2.TEA的有效值为1。
- 异常是由阶段2翻译表遍历上的外部中止产生的。
- 异常是由通过FEAT_NV2转换为内存访问的系统寄存器访问产生的外部中止。这只能发生在EL1。
- HCR_EL2.TGE或HCR.TGE的有效值为1。这只能发生在EL0。
否则,如果实现了FEAT_DoubleFault2且以下所有条件为真,则同步外部中止异常被捕获到EL2:
- EL2已实现、在当前安全状态下启用并使用AArch64。
- HCRX_EL2.TMEA的有效值为1。
- PSTATE.A为1。
- 异常从EL1捕获。
否则,如果实现了FEAT_DoubleFault2且以下所有条件为真,则同步外部中止异常被捕获到EL3:
- EL3已实现并使用AArch64。
- SCR_EL3.TMEA的有效值为1。
- PSTATE.A为1。
- 异常从EL1或EL2捕获。
否则,以下均适用:
- 从EL2捕获的同步外部中止异常被捕获到EL2。
- 当EL1使用AArch64时,从EL1或EL0捕获的同步外部中止异常被捕获到使用AArch64的EL1。
IMBJFW INDBHM中表格使用的术语含义如下:
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值。 |
| HCR | 如果EL2使用AArch32,则这是HCR或HCR2中字段的有效值。如果EL2使用AArch64,则是HCR_EL2中字段的有效值。 |
| HCRX_EL2 | HCRX_EL2中字段的有效值。 |
| PSTATE | PSTATE中字段的有效值。 |
| EA | SCR_EL3.EA的有效值。如果EL3未实现,则SCR_EL3.EA的有效值为0。 |
| TMEA | SCR_EL3.TMEA或HCRX_EL2.TMEA的有效值。如果未实现FEAT_DoubleFault2,则SCR_EL3.TMEA和HCRX_EL2.TMEA的有效值为0。如果EL2未实现或EL2在当前安全状态下禁用,则HCRX_EL2.TMEA的有效值为0。 |
| TGE | HCR.TGE的有效值。如果EL2未实现,或EL2在当前安全状态下禁用,则HCR.TGE的有效值为0。 |
| A | PSTATE.A的有效值。 |
| EL1 | 异常被捕获到EL1。如果EL1使用AArch32,则异常被捕获到AArch32中止模式。 |
| EL2 | 异常被捕获到EL2。如果EL2使用AArch32,则异常被捕获到AArch32 Hyp模式。 |
| EL3 | 异常使用AArch64被捕获到EL3。 |
| n/a | 不适用。该字段在此配置中不存在,或此配置中无法访问该异常级别。 |
INDBHM 以下表格总结了从ELx捕获的同步外部中止异常的目标异常级别,所有以下适用:
- SCR_EL3.{NS, EEL2}未显示。IMBJFW描述了涉及安全状态的有效值。
- 该错误是由非系统寄存器访问的阶段1 fault产生的。参见RQDLHN了解其他情况的详细信息。
表 D1-9 同步外部中止异常目标
| SCR_EL3 | HCR | HCRX_EL2 | PSTATE | 异常捕获来源 | ||
|---|---|---|---|---|---|---|
| EA | TMEA | TGE | TEA | TMEA | A | EL0 |
| 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | X | EL1 |
| 0b0 | 0b0 | 0b0 | 0b0 | 0b1 | 0b0 | EL1 |
| 0b0 | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | EL1 |
| 0b0 | 0b0 | 0b0 | 0b1 | X | X | EL2 |
| 0b0 | 0b0 | 0b1 | X | X | X | EL2 |
| 0b0 | 0b1 | 0b0 | 0b0 | 0b0 | 0b1 | EL1 |
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | EL1 |
| 0b0 | 0b1 | 0b0 | 0b0 | 0b1 | 0b1 | EL1 |
| 0b0 | 0b1 | 0b0 | 0b1 | X | 0b0 | EL2 |
| 0b0 | 0b1 | 0b0 | 0b1 | X | 0b1 | EL2 |
| 0b0 | 0b1 | 0b1 | X | X | 0b0 | EL2 |
| 0b0 | 0b1 | 0b1 | X | X | 0b1 | EL2 |
| 0b1 | X | 0b0 | X | X | X | EL3 |
| 0b1 | X | 0b1 | X | X | X | EL3 |
D1.4.5.3 粒度保护检查fault(Granule Protection Check faults)
IYRNGX 如果实现了FEAT_RME,则当GPCCR_EL3.GPC为1时,对物理地址(PA)空间访问的粒度保护检查(GPC)被启用,可能导致GPC fault。
RPYTGX GPC fault报告为同步异常:
表 D1-10 GPC fault和同步异常类型
| GPC fault | 同步异常类型 |
|---|---|
| EL3处的粒度保护fault(GPF) | 指令中止异常或数据中止异常 |
| 当SCR_EL3.GPF为0时EL2、EL1或EL0处的GPF | 指令中止异常或数据中止异常 |
| 当SCR_EL3.GPF为1时EL2、EL1或EL0处的GPF | GPC异常 |
| 粒度保护表(GPT)遍历fault | GPC异常 |
| GPT地址大小fault | GPC异常 |
| GPT取指上的同步外部中止 | GPC异常 |
RFXMGJ GPC异常被捕获到EL3。
由以下原因导致的指令中止异常和数据中止异常:
- EL3处的GPF被捕获到EL3。
- EL2处的GPF被捕获到EL2。
- EL1和EL0处的GPF被捕获到:
- 当GPF在阶段2翻译表的访问上时,被捕获到EL2,包括阶段2表的硬件更新。
- 否则:
- 当HCR_EL2.{TGE, GPF}为{0, 0}时,被捕获到EL1。
- 当HCR_EL2.{TGE, GPF}不为{0, 0}时,被捕获到EL2。
IXWVCY 对于当SCR_EL3.GPF为1时在EL2、EL1或EL0处的GPF,EL3固件可以选择将 resulting GPC异常委托为指令中止异常或数据中止异常到较低的异常级别。
RJXSRX 当PE处于调试状态且EDSCR.SDD为1时,SCR_EL3.GPF被视为0,且以下GPC fault被视为GPF,用于导致异常的目的:
- GPT遍历fault。
- GPT地址大小fault。
- GPT取指上的同步外部中止。
IZTKNY 由于GPT取指上的同步外部中止导致的GPC异常受SCR_EL3.EASE约束。
IYJLPJ 所有GPC fault的优先级与对PA空间任何访问执行的GPC一致。即,对于每个现有的同步外部中止,GPC fault以比该访问相应同步外部中止稍高的优先级报告。参见单个地址翻译阶段的MMU fault优先级。
IYHXKR 当GPCCR_EL3.GPCP为1时,PE可以省略对作为阶段2翻译表遍历的表描述符的翻译表条目的GPC,以进行性能优化。启用此优化取决于系统的安全模型。
RRWGJH 如果GPCCR_EL3.GPCP为1且PE在获取作为阶段2翻译表遍历的表描述符的翻译表条目时省略了GPC,则在处理该条目时:
- 如果该条目不是表描述符,则PE必须在翻译完成之前对该条目地址执行GPC。允许此操作与对条目内容的GPC同时进行,只要保持fault报告的优先级顺序。
- Arm强烈建议PE在对生成将从该条目报告综合征信息的fault的条目地址执行GPC。如果GPC导致GPC fault,则该fault被报告,如同GPCCR_EL3.GPCP为0。
IZDKBX 当加载或存储指令导致对两个粒度的访问时,每个粒度的访问都受GPC约束。
RGVSNZ 如果存储到内存的指令产生GPC fault,则该指令尝试存储到的每个内存位置的值要么是:
- 如果访问该位置触发了GPC fault,则保持不变。
- 对于任何未触发fault或调试事件的访问,UNKNOWN。
IRFMWD GPC fault可能发生在翻译过程中需要访问PA的任何点。例如,要在EL1执行存储,PE执行:
- VA的阶段1翻译。
- 阶段2翻译用于:
- 阶段1翻译的输出IPA。
- 每个阶段1描述符的IPA。
- 所有以下项目的GPC:
- VA翻译到的PA。
- 每个阶段1描述符的PA。
- 每个阶段2描述符的PA。
D1.4.5.4 SVE同步内存fault(SVE synchronous memory faults)
IYLCFS 在本节中,术语内存fault(Memory fault)是指由于执行SVE加载或存储指令而执行数据内存访问而检测到错误条件或调试事件。
RSKNTR 当SVE加载或存储指令导致数据内存访问时,检测到以下任何情况被视为内存fault:
- MMU fault。
- 对齐fault,不包括SP对齐fault。
- 同步外部中止,包括同步奇偶校验错误或ECC错误。
- 监视点调试事件。
- 当实现了FEAT_MTE2时,同步标签检查fault。
更多信息请参见内存中止。
ILDTYT SVE加载或存储指令检测或生成内存fault可能或可能不会导致捕获同步数据中止或监视点异常。
RLVCNH 除非本节另有说明,否则检测到内存fault的SVE向量加载和存储指令导致捕获数据中止或监视点异常,如SVE数据中止和监视点异常中所述。
RFPVTT 对于只能由SVE向量加载或存储指令的非活跃元素访问的内存位置检测到的内存fault被忽略,不会导致该指令捕获数据中止或监视点异常。
D1.4.5.4.1 SVE数据中止和监视点异常(SVE Data Abort and Watchpoint exceptions)
RKJPTS 除非本节另有说明,否则由SVE加载或存储指令引起的数据中止和监视点异常遵循精确异常和模糊异常定义、异常入口和捕获到AArch64状态的同步异常优先级中描述的行为。
IDGSNC SVE加载和存储指令可以生成一系列单拷贝原子内存访问,这些访问可能由于在内存访问序列期间导致捕获数据中止或监视点异常的内存fault而未完成。
RZKBRX 当执行SVE加载或存储指令检测到由不同单拷贝原子内存访问引起的多个内存fault时,架构不优先处理这些内存fault。
IMSVYK 当架构上尚未执行的SVE加载或存储指令在异常返回后重新启动时,它可能在捕获异常之前访问的任何内存位置可能再次被访问。因此,SVE加载和存储指令可能对不会导致内存fault但对访问次数敏感或在访问之间已被修改的内存位置执行多次访问。
RZXNXT 当执行SVE加载指令导致捕获数据中止或监视点异常且目标不是也用作该指令基址或索引寄存器的向量寄存器时,目标寄存器的所有元素变为UNKNOWN。
RSNJQR 当执行SVE加载指令导致捕获数据中止或监视点异常且目标是也用作该指令基址或索引寄存器的向量寄存器时,目标向量寄存器的所有元素恢复到加载指令执行前的原始值。
RDWYCY 当执行SVE前缀向量存储指令导致捕获数据中止或监视点异常时,发生以下一种或多种情况:
- 与活跃元素关联且不产生内存fault的内存位置变为UNKNOWN。
- 与活跃元素关联且产生内存fault的内存位置保持不变。
- 仅与非活跃元素关联的内存位置保持不变。
D1.4.5.4.2 SVE首fault和非fault加载(SVE First-fault and Non-fault loads)
IJZBGW 当为SVE首fault向量加载指令的第一个活跃元素执行的内存访问检测到内存fault时,这导致按SVE数据中止和监视点异常中所述捕获同步异常。
IDXBNG 当为SVE首fault向量加载指令的第一个活跃元素执行的内存访问未检测到内存fault时,其他元素的处理方式与SVE非fault向量加载指令的元素相同。
RJKGYJ 当为以下任何元素执行的内存访问检测到内存fault时,不会产生数据中止或监视点异常:
- SVE非fault向量加载的任何活跃元素。
- SVE首fault向量加载的任何活跃元素,第一个活跃元素除外。
RMNKNV PE可以选择省略为以下任何元素执行的内存访问:
- SVE非fault向量加载的任何活跃元素。
- SVE首fault向量加载的任何活跃元素,第一个活跃元素除外。
RYFTRN 当为以下任何元素执行的内存访问检测到内存fault、异步标签检查fault或因任何其他原因被省略时,从该元素号开始到最高编号元素(含)的FFR谓词元素被设置为FALSE:
- SVE非fault向量加载的任何活跃元素。
- SVE首fault向量加载的任何活跃元素,第一个活跃元素除外。
注意: 异步标签检查fault将FFR中的元素设置为FALSE需要与指令流同步,如RXXMMP所述。
IBMQVT SVE向量加载永远不会将FFR谓词元素设置为TRUE,因此fault指示是累积的。
IBXNTL 为SVE首fault向量加载指令的第一个活跃元素执行的内存访问与常规SVE前缀向量加载指令的活跃元素的内存访问并非完全等效。当第一个活跃元素对应的FFR元素初始值为FALSE时,即使为该元素执行了访问且未检测到内存fault,相应目标向量元素的内容仍然是受限不可预测的,如RNGFTJ中所述。
RNGFTJ 执行SVE非fault向量加载或首fault向量加载后,每个目标向量元素包含下表中列出的值之一:
表 D1-8 SVE非fault向量加载或首fault向量加载后目标向量元素的内容
| 对应FFR元素 | 向量元素状态 | 目标向量元素内容 |
|---|---|---|
| FALSE | 活跃 | 元素的每个字节包含以下之一的受限不可预测选择:- 0。- 该字节在目标向量寄存器中的先前值。- 当且仅当以下所有条件适用时,从内存读取的值: - 该字节的内存访问不是对任何类型设备内存的访问,或者对于首fault向量加载是对第一个活跃元素64字节窗口内设备内存的访问。参见设备内存了解更多信息。 - 该字节的内存访问不会返回在当前或较低特权级别无法访问的信息。 |
| FALSE | 非活跃 | 以下之一的受限不可预测选择:- 0。- 该向量元素的先前值。 |
| TRUE | 活跃 | 从内存读取的值。 |
| TRUE | 非活跃 | 0。 |
RWCHSR 在表D1-8中,监视点和MTE标签检查fault不是阻止访问内存的机制。
D1.4.5.5 PSTATE.UINJ注入的未定义指令异常(Undefined Instruction exceptions injected by PSTATE.UINJ)
RNKNRG 如果实现了FEAT_UINJ,则当PSTATE.UINJ为1时尝试执行任何指令会导致ESR_ELx.EC为0b000000的未定义指令异常。
IHPGHL 软件可以将SPSR_ELx.UINJ设置为1,且在异常返回时该值被复制到PSTATE.UINJ。然后,当PE尝试执行下一条指令时,发生未定义指令异常。
D1.4.5.6 捕获到AArch64状态的同步异常的优先级(Prioritization of Synchronous exceptions taken to AArch64 state)
RZFGJP 以下列表显示捕获到使用AArch64的异常级别的同步异常的优先级。最高优先级为1。AArch64优先级编号与等效的AArch32和调试优先级列表相关。
表 D1-11 同步异常优先级
| 优先级 | 同步异常类型 |
|---|---|
| 1 | 重置捕获调试事件。参见重置捕获调试事件。 |
| 2 | 如果优先级为2的异常捕获调试事件。参见异常捕获调试事件。 |
| 3 | 停止步进调试事件。参见停止步进调试事件。 |
| 4 | 软件步进异常。参见软件步进异常。 |
| 5 | 如果优先级为5的异常捕获调试事件。参见异常捕获调试事件。 |
| 6 | PC对齐fault异常。参见PC对齐检查。 |
| 7 | 非法执行状态异常。此优先级或优先级10是实现定义的。参见从AArch64状态的非法异常返回。 |
| 8 | 指令中止异常,包括由指令取指翻译的MMU fault产生的异常。如果实现了FEAT_RME,这包括GPC异常和粒度保护fault。参见单个地址翻译阶段的MMU fault优先级。 |
| 9 | 断点异常,或AArch32地址匹配向量捕获异常。参见断点异常和向量捕获异常。 |
| 10 | 非法执行状态异常。此优先级或优先级7是实现定义的。参见从AArch64状态的非法异常返回。 |
| 11 | 如果实现了FEAT_UINJ,则由PSTATE.UINJ为1时尝试执行指令导致的未定义指令异常。 |
| 12 | 由断点指令执行导致的软件断点异常。 |
| 13 | 分支目标异常。参见PSTATE.BTYPE。 |
| 14 | EXLOCK异常。参见守卫控制栈异常。 |
| 15 | 由于MPAM3_EL3.TRAPLOWER捕获控制而捕获到EL3的异常。 |
| 16 | 由于MPAMBW3_EL3.nTRAPLOWER捕获控制而捕获到EL3的异常。 |
| 17 | 由于以下之一配置而从EL1捕获到EL2的异常:- HSTR_EL2.Tn。- HCR_EL2.TIDCP。- 如果实现了FEAT_NV,则HCR_EL2.{NV1, NV}的有效值。由于以下配置而从EL0捕获到EL1或EL2的异常:- 如果实现了FEAT_TIDCP1,则SCTLR_EL1.TIDCP。由于以下配置而从EL0捕获到EL2的异常:- 如果实现了FEAT_TIDCP1,则SCTLR_EL2.TIDCP。 |
表 D1-11(续)同步异常优先级
| 优先级 | 同步异常类型 |
|---|---|
| 18 | 由于以下一个或多个原因而尝试执行UNDEFINED指令而产生的异常:- 尝试执行UDF指令。- 尝试执行未分配的指令编码,包括PE实现中未实现的指令编码。- 尝试执行在任何异常级别和安全状态下均不可访问的指令,无论任何启用或捕获。- 指令编码在调试状态下不可访问时的调试状态执行。- 指令编码在非调试状态下不可访问时的非调试状态执行。- 尝试执行HVC指令,当SCR_EL3.HCE或HCR_EL2.HCD禁用HVC指令时。- 尝试执行对SP_EL0的MSR或MRS指令,当SPSel.SP为0时。- 尝试使用_EL12寄存器名执行MSR或MRS指令,当HCR_EL2.E2H的有效值为0时。- 如果实现了FEAT_FGT和FEAT_PMUv3,尝试在AArch64状态执行访问与未实现的PMU事件计数器关联的寄存器的MSR或MRS指令,或在AArch32状态执行访问的MCR或MRC指令。- 如果实现了FEAT_SRMASK,尝试执行对以下任何一项的MSR写访问: - 当EL1掩码寄存器非零且访问未被捕获时,从EL1对EL1掩码寄存器的访问。 - 当EL2掩码寄存器非零时,从EL2对EL2掩码寄存器的访问。- 尝试执行HLT指令,当EDSCR.HDE禁用HLT指令或禁止停止时。- 尝试执行SVE指令,因为最大实现的流式SVE模式和非流式SVE模式SVE向量长度都小于该指令所需的最小向量长度。参见最大实现的SVE向量长度。- 尝试执行SME指令,因为最大实现的流式SVE向量长度小于该指令所需的最小向量长度。参见最大实现的SVE向量长度。- 尝试执行SVE MOVPRFX指令,其后的指令是MOVPRFX无法可预测地添加前缀的,当导致任何指令产生未定义指令异常时选择行为。参见移动前缀。 |
| 18续 | - 如果在调试状态: - 在非安全EL0 HCR_EL2.TGE为1时尝试执行DCPS1指令。 - 当EL2在当前安全状态下禁用或未实现时,在EL1或EL0尝试执行DCPS2指令。 - 当EDSCR.SDD为1或EL3未实现时尝试执行DCPS3指令。 - 当EDSCR.SDD为1时,在EL2、EL1或EL0尝试执行由EL3控制寄存器配置为捕获到EL3的指令。此类异常是否在此优先级或原始捕获异常的优先级处优先处理是实现定义的。 |
| 18续 | - 如果在AArch32状态: - 如果SCTLR_EL1.ITD为1,尝试在IT块中执行指令。 - 如果SCTLR_EL1.SED为1,尝试执行SETEND指令。 - 如果SCTLR_EL1.CP15BEN为0,尝试执行CP15DMB、CP15DSB或CP15ISB屏障指令。- 由于以下所有原因而UNDEFINED的指令尝试执行: - EL0使用AArch32。 - EL1使用AArch64。 - 支持将FPCR.{Stride, Len}编程为非零值。 - FPCR.{Stride, Len}之一或多个非零。 |
| 19 | 如果实现了FEAT_SME或FEAT_SVE,则由于以下捕获控制之一而捕获到EL1,或如果HCR_EL2.TGE为1则捕获到EL2的异常:- CPACR_EL1.SMEN或CPACR_EL1.ZEN。 |
| 20 | 如果以下所有条件适用,则由可配置捕获或启用产生的任何异常:- 该异常不在优先级4-19中涵盖。- 异常被捕获到EL1,或者,如果HCR_EL2.TGE为1,则被捕获到EL2。 |
| 21 | 作为以下配置控制的结果,从EL0捕获到EL2的异常:- 当异常被捕获到AArch64状态时: - HSTR_EL2.Tn。 - HCR_EL2.TIDCP。- 当异常被捕获到AArch32状态时: - HSTR.Tn。 - HCR.TIDCP。 |
| 22 | 如果实现了FEAT_SME或FEAT_SVE,则由于以下捕获控制之一而捕获到EL2的异常:- CPTR_EL2.SMEN或CPTR_EL2.ZEN,当HCR_EL2.E2H的有效值为1时。- CPTR_EL2.TSM或CPTR_EL2.TZ,当HCR_EL2.E2H的有效值为0时。 |
| 23 | 作为以下配置控制之一的结果,捕获到EL2的异常:- 当异常被捕获到AArch64状态时:CPTR_EL2中的控件,不包括优先级22中涵盖的控件。- 当异常被捕获到AArch32状态时:HCPTR中的控件。 |
| 24 | 作为以下寄存器之一中的配置控制的结果,捕获到EL2的异常:- 当异常被捕获到AArch64状态时: - HCR_EL2:除了{TIDCP, NV}字段中的设置以及当HCR_EL2.E2H的有效值为0时使用_EL12寄存器名的MRS/MSR指令。 - CNTHCTL_EL2:任何设置。 - MDCR_EL2:任何设置。 以下任何细粒度捕获: - HAFGRTR_EL2。 - HDFGRTR_EL2。 - HDFGRTR2_EL2。 - HDFGWTR_EL2。 - HDFGWTR2_EL2。 - HFGITR_EL2。 - HFGITR2_EL2。 - HFGRTR_EL2。 - HFGRTR2_EL2。 - HFGWTR_EL2。 - HFGWTR2_EL2。- 当异常被捕获到AArch32状态时: - HCR:除了TIDCP位。 - CNTHCTL:任何设置。 - HDCR:任何设置。 |
| 25 | 除优先级4-24定义的异常外,作为可配置指令访问的结果而捕获到EL2的异常。 |
| 26 | 由于SMC指令因SCR_EL3.SMD为1而UNDEFINED导致的异常。 |
| 27 | 由于以下任何异常生成指令导致的异常:- HVC。- SMC。- SVC。对于AArch64状态,参见分支、异常生成和系统指令。 |
| 28 | 如果实现了FEAT_SME或FEAT_SVE,则由于以下捕获控制之一而捕获到EL3的异常:- CPTR_EL3.ESM或CPTR_EL3.EZ。 |
| 29 | 作为CPTR_EL3中配置控制的结果而捕获到EL3的异常,不包括优先级28中涵盖的那些。异常是被优先处理为UNDEFINED指令还是具有原始捕获异常的优先级是实现定义的。 |
| 30 | 从使用AArch32的安全EL1捕获到EL3的异常。 |
| 31 | 由于MDCR_EL3中的配置控制而从EL0、EL1或EL2捕获到EL3的异常。异常是被优先处理为UNDEFINED指令还是具有原始捕获异常的优先级是实现定义的。 |
| 32 | 除优先级4-31定义的异常外,作为可配置指令访问的结果而捕获到EL3的异常。如果异常由可配置指令控制生成,由于EDSCR.SDD配置而被视为UNDEFINED,则异常是被优先处理为UNDEFINED指令还是具有原始捕获异常的优先级是实现定义的。 |
| 33 | 由于在PSTATE.SM为0时尝试执行SME指令,或在PSTATE.SM为1时尝试执行某些高级SIMD或SVE指令而导致的SME非法指令异常。参见流式SVE模式。 |
| 34 | 由于在PSTATE.ZA为0时尝试访问ZA存储或ZT0寄存器而导致的SME非法指令异常。参见ZA存储和SME2 ZT0寄存器。 |
| 35 | 由于在SMCR_ELx.EZT0控件为0时尝试访问ZT0寄存器而导致的SME非法指令异常。参见SME2 ZT0寄存器和SME捕获和异常。 |
| 36 | 由于有效SVE向量长度小于该指令所需的最小向量长度而UNDEFINED的SVE或SME指令尝试执行而导致的异常。另请参见可配置SVE向量长度。 |
| 37 | 当实现了FEAT_FPAC时,PAC Fail异常。参见指针认证fault。 |
| 38 | 当实现了SIMD和浮点时,任何捕获的浮点异常。参见浮点异常和异常捕获。 |
| 39 | 此优先级编号由调试事件使用。 |
| 40 | SP对齐fault。参见SP对齐检查。 |
| 41 | 当实现了FEAT_MOPS时,由CPY或SET指令算法选项导致的内存复制和内存设置异常,异常捕获来源的实现与返回到的实现不同。参见内存复制和内存设置异常。 |
| 42 | 当实现了FEAT_MOPS时,未在优先级41中定义的内存复制和内存设置异常。参见内存复制和内存设置异常。 |
注意: 对于优先级43、44、45、46或47:当一条指令导致多个单拷贝原子内存访问时,架构不会优先处理由多个内存访问产生的各个同步异常。当实现了FEAT_GCS时,RXTZVS中为GCSSS2指令定义了更严格的要求。
表 D1-11(续)同步异常优先级
| 优先级 | 同步异常类型 |
|---|---|
| 43 | 按优先级降序:a) 翻译表遍历和翻译表条目更新上的数据中止异常。b) 翻译表遍历和翻译表条目更新上的GPC异常,如果实现了FEAT_RME。c) 翻译表遍历和翻译表条目更新上的同步外部中止导致的数据中止异常。d) 不在翻译表遍历上的MMU fault导致的数据中止异常,不在优先级44或46涵盖范围内。另请参见:- 单个地址翻译阶段的MMU fault优先级。- 外部中止。 |
| 44 | 如果在此优先级优先处理,则按优先级降序:a) 如果实现了FEAT_RME,则在地址翻译过程最终物理地址访问上由粒度保护fault(GPF)导致的数据中止异常。b) 如果实现了FEAT_RME,则在地址翻译过程最终物理地址访问上的GPC异常。c) 以下任一: i) 在地址翻译过程最终物理地址访问上的同步外部中止导致的数据中止异常。 ii) 如果实现了FEAT_MTE2,则标签检查fault上的数据中止异常。这些是在此处还是在优先级46优先处理是实现定义的。另请参见:- 标签检查fault。- 外部中止。 |
| 45 | 监视点异常。参见监视点异常。 |
| 46 | 如果在优先级46优先处理,则优先级44列出的异常。 |
| 47 | 守卫控制栈数据检查异常。参见守卫控制栈异常。 |
D1.4.5.7 浮点异常的捕获(Trapping of floating-point exceptions)
RTSQFJ 浮点指令的执行,或执行执行浮点运算的高级SIMD或SVE指令,可以产生称为浮点异常的异常情况。
RBBSGN 对于以下每个浮点异常,实现是否包含同步异常生成是实现定义的:
- 输入非正规化(Input Denormal)。
- 不精确(Inexact)。
- 下溢(Underflow)。
- 溢出(Overflow)。
- 除以零(Divide by Zero)。
- 无效操作(Invalid Operation)。
IYRVSW 架构不支持异步报告浮点异常。如果实现不支持从浮点异常生成同步异常,则该同步异常永远不会产生,且关于该同步异常何时产生的所有陈述均不适用。
IKJTLV 对于RBBSGN中列出的任何已实现的浮点异常,FPCR提供控制位以启用同步异常生成。
RVJFJR 捕获浮点异常被捕获到的异常级别定义如下:
- 如果在EL0执行:
- 如果HCR_EL2.TGE的有效值为0,则异常被捕获到EL1。
- 如果HCR_EL2.TGE的有效值为1,则异常被捕获到EL2。
- 如果在EL1执行,则异常被捕获到EL1。
- 如果在EL2执行,则异常被捕获到EL2。
- 如果在EL3执行,则异常被捕获到EL3。
RTRWMV 如果实现在AArch64状态包含浮点异常的同步异常生成,当单独操作在不同SIMD或SVE元素中执行导致多个浮点异常时,ESR_ELx仅报告该指令使用的一个元素的异常。架构不指定报告哪个元素。
RVJNYH 当浮点异常被捕获时,以下均适用:
- 当捕获浮点异常被捕获时,FPSR是否恢复到生成捕获浮点异常的指令之前的FPSR值是实现定义的。当捕获浮点异常被捕获时,如果FPSR未恢复,则哪个未捕获浮点异常(如果有)由相应FPSR累积浮点异常位指示为1是受限不可预测的。
- 在目标异常级别的ESR_ELx中,以下均适用:
- 最高优先级捕获浮点异常的浮点异常捕获位设置为1。
- 如果同一操作生成了任何其他未捕获浮点异常,每个未捕获异常的浮点异常捕获位设置为0。这适用于更高优先级和更低优先级的未捕获浮点异常。
- 如果同一操作生成了任何更低优先级的捕获浮点异常,则对于每个异常,浮点异常捕获位是设置为1还是受限不可预测的。
RFTPRW 对于来自高级SIMD或SVE指令的捕获浮点异常,架构不定义不同元素之间浮点异常的优先级。
D1.4.5.8 内存复制和内存设置异常(Memory Copy and Memory Set exceptions)
ITPJXM 如果在内存复制和内存设置指令执行期间捕获异常,且这些指令的执行在物理硬件PE实现上重新启动的位置与捕获异常的位置不同,则可能生成内存复制或内存设置异常。
RJQZHK 对于CPYE*、CPYFE*、CPYFM和CPYM指令,如果PSTATE.C值指示的指令算法选项与实现返回的PSTATE.C值不同,则生成内存复制异常。
RXQQXB 对于SETE*、SETGE*、SETGM和SETM指令,如果PSTATE.C值指示的指令算法选项与实现返回的PSTATE.C值不同,则生成内存设置异常。
RPHLLT 对于CPYE*、CPYFE*、CPYFM和CPYM指令,如果异常捕获来源的实现与返回到的实现的指令对齐和大小要求不同,则生成内存复制异常。
RBKCPW 对于SETE*、SETGE*、SETGM和SETM指令,如果异常捕获来源的实现与返回到的实现的指令对齐和大小要求不同,则生成内存设置异常。
IQJFTK 如果以下适用,可以避免由对齐和大小要求差异导致的内存复制和内存设置异常:
- 在同一实现上,在适当的CPYFM*、CPYM*、SETGM或SETM之前执行CPYFP*、CPYP*、SETGP或SETP指令。
- 在同一实现上,在适当的CPYFE*、CPYE*、SETGE或SETE之前执行CPYFM*、CPYM*、SETGM或SETM指令。
ILNTYW 内存复制和内存设置异常的通用返回例程是调整寄存器参数以与执行新的内存复制或内存设置一致,然后返回到CPYFP*、CPYP*、SETGP或SETP指令以重新启动内存复制或内存设置。
ITTVQX 内存复制和内存设置异常的通用返回例程可以利用内存复制和内存设置指令连续放置在内存中——首先是序言,然后是主部,最后是尾声。
ICNTMJ 内存复制异常的通用返回例程在以下假代码中显示:
1 | if FormatOption == 0b00 || FormatOption == 0b11 then |
IMWFQH 内存设置异常的通用返回例程在以下假代码中显示:
1 | if FormatOption == 0b01 || FormatOption == 0b10 then |
IPRXVQ SPSR_ELx.C中的信息(或等效地,ESR_ELx.ISS.FormatOption字段)、SPSR_ELx.N和Xn寄存器中的值的符号足以确定Xd、Xs和Xn寄存器的当前格式,并在重新启动内存复制或内存设置之前执行任何需要的重新格式化。但是,不需要使用FEAT_MOPS指令,也可以使用软件实现重新启动内存复制或内存设置。
RZHRJP 内存复制和内存设置异常被捕获到的异常级别如下:
- 从EL0,如果HCR_EL2.TGE为0则到EL1。否则到EL2。
- 从EL1,取决于HCRX_EL2.MCE2的值到EL1或EL2。
- 从EL2或EL3,到同一异常级别。
INXHPS HCRX_EL2.MCE2控制位允许在系统中处理内存复制和内存设置异常,在该系统中内存复制和内存设置指令可能在EL1使用,而在EL1捕获异常不可接受的时候。只有在EL1代码可能在物理硬件PE实现之间迁移而EL1不能容忍捕获异常时,这才是必要的。
IZWLQV Arm期望在EL1运行的软件仅在实现内存复制和内存设置异常的通用返回例程时才能使用SCTLR_EL1.MSCEn启用EL0对内存复制和内存设置指令的使用。
以上是D1.4节第一部分(D1.4.1至D1.4.5)的完整中文翻译,涵盖了异常入口术语、异常入口处理、同步异常类型等核心内容。
D1.4 异常(Exceptions)— 第二部分
D1.4.6 异步异常类型 {#d1-4-6}
RZNTKG ARM架构异常模型区分以下几类异步异常:
- 物理中断(Physical Interrupts)
- 虚拟中断(Virtual Interrupts)
- PMU异常,参见基于异常的事件分析(Exception-based event profiling)。
物理中断有以下类型:
- SError(也描述为系统错误(System Error))
- IRQ(中断请求,Interrupt Request)
- FIQ(快速中断请求,Fast Interrupt Request)
虚拟中断有以下类型:
- vSError(也描述为虚拟系统错误(Virtual System Error))
- 委托SError(Delegated SError)
- vIRQ(虚拟中断请求,Virtual IRQ)
- vFIQ(虚拟快速中断请求,Virtual FIQ)
RSLLMN IRQ、FIQ、vIRQ和vFIQ中断是精确异步异常。
RGGWMZ 如果实现了FEAT_NMI,则IRQ、FIQ、vIRQ和vFIQ中断可以具有超级优先级(Superpriority)作为额外属性。
IPYQBL 当SCTLR_ELx.NMI为0时,超级优先级属性对送往ELx的中断没有影响。参见:
- 物理中断屏蔽(Physical interrupt masking)。
- 虚拟异步异常屏蔽(Virtual asynchronous exception masking)。
RPBKNX 分配超级优先级的机制是实现定义的(IMPLEMENTATION DEFINED)。
RDXHJZ 每种物理中断类型可以被分配目标异常级别EL1、EL2或EL3。
IVMWYT ISR_EL1显示物理中断、物理SError异常、虚拟中断以及虚拟和委托SError异常的待处理状态,如下所示:
- 从EL1读取时:
- 虚拟中断(如果启用)的待处理状态,以及如果启用了虚拟SError异常,则为虚拟SError异常的待处理状态。如果虚拟SError异常未启用但委托SError异常已启用,则为委托SError异常的待处理状态。
- 从EL2读取时:
- 委托SError异常的待处理状态(如果委托SError异常已启用)。
否则,从EL1、EL2或EL3读取时,显示物理中断和物理SError异常的待处理状态。
IRWYFW 实现可能支持其他向PE发信号通知虚拟中断的机制。
IWRGNC 以下分析异常也可以是异步异常:
- PMU分析异常(PMU Profiling exceptions)。参见基于异常的事件分析(Exception-based event profiling)。
- TRBE分析异常(TRBE Profiling exceptions)。参见跟踪缓冲区管理(Trace buffer management)。
- SPE分析异常(SPE Profiling exceptions)。参见分析缓冲区管理(Profiling Buffer management)。
IXHCGZ 物理中断发信号通知PE的机制是实现定义的,可以是边沿敏感或电平敏感。常见实现选择是IRQ和FIQ中断为电平敏感,这由通用中断控制器(GIC)支持。
IYSKZH 物理SError异常常用于(除其他外)传达来自内存系统且需要异步获取的外部中止(External aborts)。更多信息,参见PE错误处理(PE error handling)。
RKTWMT 对于由内存系统生成且使用SError异常异步获取的外部中止,SError异常始终表现为边沿触发中断。对于SError异常的任何其他来源,它们是边沿触发还是电平敏感是实现定义的。
RHSFRC 当向使用AArch64的异常级别获取SError异常时,目标异常级别的ESR_ELx被更新以描述SError异常。
如果实现了FEAT_RAS,则:
- 当向使用AArch64的异常级别获取vSError异常时,目标异常级别的ESR_ELx使用来自VSESR_EL2的异常综合征信息更新。
- 如果实现了FEAT_E3DSE,则当获取委托SError异常时,目标异常级别的ESR_ELx使用来自VSESR_EL3的异常综合征信息更新。
RRKDNV 当向使用AArch64的异常级别获取IRQ、vIRQ、FIQ或vFIQ中断时,目标异常级别的ESR_ELx不会被更新。
D1.4.6.1 虚拟异步异常 {#d1-4-6-1}
RMLLVN 每种虚拟中断类型都可以从EL2独立启用。如果虚拟中断类型从EL2启用,则相应物理中断的目标异常级别不是EL1。
RRTLGR 待处理的vIRQ和vFIQ中断可以通过HCRX_EL2中的控制位分配超级优先级。
RBCXJB 如果HCR_EL2.TGE为0,则将HCR_EL2.{FMO, IMO}路由控制位设置为1可启用相应的虚拟中断。
如果HCR_EL2.TGE为1,则虚拟中断被禁用。
RCDCKC 如果HCR_EL2.TGE为0,则将HCR_EL2.AMO或HCRX_EL2.TMEA路由控制位的有效值设置为1可启用虚拟SError异常。
如果HCR_EL2.TGE为1,则虚拟SError异常被禁用。
RNVFXB 如果虚拟异步异常类型已启用,则可以通过以下任一方式生成该类型的中断:
- 如果相应的虚拟中断待处理位HCR_EL2.{VSE, VI, VF}为1,则在EL0或EL1执行时。
- 对于vIRQ或vFIQ,通过实现定义的机制。这可能是来自中断控制器的信号。
RSDVLM 如果虚拟中断被禁用,则不能获取该虚拟中断。
INJPHG 下表描述了启用虚拟中断的位、导致虚拟异步异常在HCR_EL2中待处理的位,以及在HCRX_EL2中启用以超级优先级发信号通知待处理虚拟中断的位:
表 D1-13 虚拟异步异常使能控制
| 虚拟异步异常类型 | 使能控制 | 导致虚拟异步异常待处理 | 待处理虚拟中断具有超级优先级 |
|---|---|---|---|
| vSError | HCR_EL2.AMO或HCRX_EL2.TMEA | HCR_EL2.VSE | n/a |
| vIRQ | HCR_EL2.IMO | HCR_EL2.VI | HCRX_EL2.VINMI |
| vFIQ | HCR_EL2.FMO | HCR_EL2.VF | HCRX_EL2.VFNMI |
RMZWNH 当获取vIRQ或vFIQ中断时,HCR_EL2中相应的虚拟中断待处理位保持其状态。
IQVCWH 如果使用虚拟中断待处理位,则vIRQ或vFIQ异常处理程序必须使在EL2或EL3执行软件将其相应的虚拟中断待处理位设置为0。
IYPRNB 当获取vSError异常时,HCR_EL2.VSE被清除为0。
ILFSXS 虚拟SError永远不会到达EL2或EL3,无论HCRX_EL2.TMEA和SCR_EL3.TMEA的值如何。
译者注: 虚拟SError的路由受到严格限制,这与物理SError可以路由到EL1/EL2/EL3不同。虚拟SError只能路由到EL1,这是因为虚拟SError是由EL2通过HCR_EL2.VSE位注入的,用于模拟虚拟机中的错误。
D1.4.6.2 委托SErrors {#d1-4-6-2}
INVRSW 如果实现了FEAT_E3DSE,则委托SError异常由SCR_EL3.EnDSE、SCR_EL3.DSE、VSESR_EL3和VDISR_EL3定义。
RTNWJT 如果SCR_EL3.{EA, TMEA}的有效值不是{0, 0},则将SCR_EL3.EnDSE控制位的有有效值设置为1可启用委托SError异常。
如果SCR_EL3.{EA, TMEA}的有效值是{0, 0},或者SCR_EL3.EnDSE的有效值是0,则委托SError异常被禁用。
RWLQXL 如果委托SError异常已启用,则在EL0、EL1或EL2执行时将SCR_EL3.DSE设置为1会使委托SError异常待处理。
RRWMSM 如果委托SError异常被禁用,则不能获取委托SError异常。
IQKSJR 当获取委托SError异常时,SCR_EL3.DSE被清除为0。
ILVWLF 委托SError永远不会到达EL3,无论SCR_EL3.TMEA的值如何。
译者注: 委托SError是ARMv8.4引入的FEAT_E3DSE特性,允许在EL2或EL3固件中处理SError而不是让硬件直接处理。设置SCR_EL3.DSE=1会pend一个委托SError,该异常然后被路由到由TMEA控制的异常级别,但永远不会到达EL3。
D1.4.6.3 建立异步异常的目标异常级别 {#d1-4-6-3}
RQZPXL RNMMXK表使用以下术语:
表 D1-12 术语定义
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值 |
| NS | 如果实现了FEAT_RME,则如果未实现安全状态,SCR_EL3.NS的有效值为1 |
| EEL2 | 如果EL3未实现,SCR_EL3.EEL2的有效值为1 |
| IRQ FIQ | 如果EL3未实现,这些字段的有效值为0 |
| RW | 如果EL3未实现,SCR_EL3.RW的有效值为1 |
| HCR | 如果EL2使用AArch32,这是HCR中字段的有效值。如果EL2使用AArch64,这是HCR_EL2中字段的有效值 |
| TGE | 如果EL2未实现,HCR.TGE或HCR_EL2.TGE的有效值为0 |
| IMO FMO | 如果EL2未实现,这些字段的有效值为0 |
| E2H | 如果EL2未实现,HCR.E2H或HCR_EL2.E2H的有效值为0 |
| RW | 如果EL2未实现,HCR_EL2.RW的有效值与SCR_EL3.RW的有效值相同 |
| 术语 | 含义 |
|---|---|
| EL1 | 异常使用AArch64到达EL1 |
| EL2 | 异常使用AArch64到达EL2 |
| EL3 | 异常使用AArch64到达EL3 |
| C | 中断不被获取并保持待处理,无论PSTATE.{I, F, ALLINT}中断屏蔽位如何 |
| IRQ, FIQ | 异常分别到达AArch32 IRQ模式或AArch32 FIQ模式 |
| Hyp | 异常到达AArch32 Hyp模式 |
| n/a | 不适用。在该配置中寄存器中不存在该字段或该异常级别不可访问 |
RNMMXK 下表描述了如果最高实现的异常级别使用AArch64且EDSCR.INTdis为0b00或入侵调试被禁用时,物理FIQ和IRQ中断的路由。
表 D1-12 FIQ和IRQ中断异常目标
| SCR_EL3 | | | HCR | | | | | | | 目标(从以下级别获取时) |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| NS | EEL2 | IRQ | | | IMO | | | | | EL0 | EL1 | EL2 | EL3 |
| | | FIQ | RW | TGE | FMO | E2H | RW | | | | |
| 0 | 0 | 0 | 0 | x | x | x | x | | IRQ, FIQ | IRQ, FIQ | n/a | C |
| 0 | 0 | 0 | 1 | x | x | x | x | | EL1 | EL1 | n/a | C |
| 0 | 0 | 1 | x | x | x | x | x | | EL3 | EL3 | n/a | EL3 |
| 0 | 1 | 0 | x | 0 | 0 | 0 | 0 | | IRQ, FIQ | IRQ, FIQ | C | C |
| 0 | 1 | 0 | x | 0 | 0 | 0 | 1 | | EL1 | EL1 | C | C |
| 0 | 1 | 0 | x | 0 | 0 | 1 | x | | EL1 | EL1 | C | C |
| 0 | 1 | 0 | x | 0 | 1 | x | x | | EL2 | EL2 | EL2 | C |
| 0 | 1 | 0 | x | 1 | x | x | x | | EL2 | n/a | EL2 | C |
| 0 | 1 | 1 | x | 0 | x | x | x | | EL3 | EL3 | EL3 | EL3 |
| 0 | 1 | 1 | x | 1 | x | x | x | | EL3 | n/a | EL3 | EL3 |
| 1 | x | 0 | 0 | 0 | 0 | n/a | n/a | | IRQ, FIQ | IRQ, FIQ | Hyp | C |
| 1 | x | 0 | 0 | 0 | 1 | n/a | n/a | | Hyp | Hyp | Hyp | C |
| 1 | x | 0 | 0 | 1 | x | n/a | n/a | | Hyp | n/a | Hyp | C |
| 1 | x | 0 | 1 | 0 | 0 | 0 | 0 | | FIQ | FIQ | C | C |
| 1 | x | 0 | 1 | 0 | 0 | 0 | 1 | | EL1 | EL1 | C | C |
| 1 | x | 0 | 1 | 0 | 0 | 1 | x | | EL1 | EL1 | C | C |
| 1 | x | 0 | 1 | 0 | 1 | x | x | | EL2 | EL2 | EL2 | C |
| 1 | x | 0 | 1 | 1 | x | x | x | | EL2 | n/a | EL2 | C |
| 1 | x | 1 | x | 0 | x | x | x | | EL3 | EL3 | EL3 | EL3 |
| 1 | x | 1 | x | 1 | x | x | x | | EL3 | n/a | EL3 | EL3 |
RZZYHK RMGNFZ和RVRBFW表使用以下术语:
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值 |
| EA | 如果EL3未实现,SCR_EL3.EA的有效值为0 |
| TMEA | 如果未实现FEAT_DoubleFault2,SCR_EL3.TMEA的有效值为0 |
| NMEA | 如果未实现FEAT_DoubleFault,SCR_EL3.NMEA的有效值为0 |
| HCR_EL2 | HCR_EL2中字段的有效值 |
| HCR | HCR中字段的有效值 |
| TGE | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.TGE或HCR.TGE的有效值为0 |
| E2H | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.E2H的有效值为0 |
| AMO | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.AMO或HCR.AMO的有效值为0 |
| SCTLR2_EL2 | SCTLR2_EL2中字段的有效值 |
| NMEA | 如果未实现FEAT_DoubleFault2,SCTLR2_EL2.NMEA的有效值为0。如果EL2未实现或在当前安全状态中被禁用,或者SCR_EL3.SCTLR2En的有效值为0,则SCTLR2_EL2.NMEA的有效值为0 |
| HCRX_EL2 | HCRX_EL2中字段的有效值 |
| TMEA | 如果未实现FEAT_DoubleFault2,HCRX_EL2.TMEA的有效值为0。如果EL2未实现或在当前安全状态中被禁用,或者SCR_EL3.HXEn的有效值为0,则HCRX_EL2.TMEA的有效值为0 |
| SCTLR2_EL1 | SCTLR2_EL1中字段的有效值 |
| NMEA | 如果未实现FEAT_DoubleFault2,SCTLR2_EL1.NMEA的有效值为0。如果HCRX_EL2.SCTLR2En的有效值为0或SCR_EL3.SCTLR2En的有效值为0,则SCTLR2_EL1.NMEA的有效值为0 |
| PSTATE | PSTATE中字段的值 |
| A | PSTATE.A的值 |
| EL1 | 异常到达EL1。如果EL1使用AArch32,则异常到达中止模式 |
| EL2 | 异常使用AArch64到达EL2 |
| EL3 | 异常使用AArch64到达EL3 |
| C | 中断不被获取并保持待处理,无论PSTATE.A屏蔽位如何 |
| Abt | 异常到达AArch32中止模式 |
| Hyp | 异常到达AArch32 Hyp模式 |
| n/a | 不适用。在该配置中寄存器中不存在该字段或该异常级别不可访问 |
RMGNFZ 以下表描述了从ELx获取的SError异常的路由。
以下所有条件适用于这些表:
- SCR_EL3.{NS, EEL2}未显示,因为RZZYHK描述了涉及安全状态的有效值。
- EDSCR.INTdis为0b00或入侵调试被禁用。
表 D1-14 当EL2使用AArch64时SError异常目标
| SCR_EL3 | HCR_EL2 | PSTATE | 从以下级别获取 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EA | TMEA | NMEA | TGE | E2H | AMO | A | EL0 | EL1 | ||||||||
| SCTLR2_EL1 | ||||||||||||||||
| HCRX_EL2 | ||||||||||||||||
| NMEA | TMEA | NMEA | ||||||||||||||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | X | X | EL1 | EL1 | C | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | 0b0 | 0b1 | EL2 | EL2 | C | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | X | 0b0 | EL1 | EL1 | C | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL2 | C | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | X | X | EL1 | EL1 | EL2 | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | 0b0 | 0b1 | EL2 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | X | 0b0 | EL1 | EL1 | EL2 | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b1 | X | X | X | X | X | EL2 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b0 | 0b1 | X | X | X | X | X | X | X | EL2 | n/a | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | X | X | EL1 | EL1 | C | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | EL2 | EL2 | C | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | X | 0b0 | EL1 | EL1 | C | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL2 | C | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | X | X | EL1 | EL1 | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | 0b0 | 0b1 | EL2 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | X | 0b0 | EL1 | EL1 | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b1 | X | X | X | X | X | EL2 | EL2 | EL2 | |||
| 0b0 | 0b0 | 0b1 | 0b1 | X | X | X | X | X | X | X | EL2 | n/a | EL2 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | 0b0 | X | X | X | 0b0 | EL1 | EL1 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | EL3 | EL3 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | X | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL3 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | X | 0b1 | 0b0 | 0b0 | 0b1 | EL2 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | X | 0b1 | 0b0 | 0b1 | 0b1 | EL1 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b0 | 0b1 | X | X | X | 0b0 | EL1 | EL1 | EL2 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b1 | X | X | X | X | 0b0 | EL2 | EL2 | EL2 | |||
| 0b0 | 0b1 | 0b0 | 0b0 | X | 0b1 | X | X | X | X | 0b1 | EL2 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b1 | 0b0 | X | X | X | X | X | 0b1 | EL2 | n/a | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b1 | X | X | X | X | X | X | 0b0 | EL2 | n/a | EL2 | |||
| 0b0 | 0b1 | 0b0 | 0b1 | 0b1 | X | 0b0 | X | X | X | 0b1 | EL3 | n/a | EL3 | |||
| 0b0 | 0b1 | 0b0 | 0b1 | 0b1 | X | 0b1 | X | X | X | 0b1 | EL2 | n/a | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | 0b0 | X | X | X | 0b0 | EL1 | EL1 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | EL3 | EL3 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | X | 0b0 | 0b1 | 0b1 | 0b1 | EL1 | EL3 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | X | 0b1 | 0b0 | 0b0 | 0b1 | EL2 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | X | 0b1 | 0b0 | 0b1 | 0b1 | EL1 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | 0b1 | X | X | X | 0b0 | EL1 | EL1 | EL2 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b1 | X | X | X | X | 0b0 | EL2 | EL2 | EL2 | |||
| 0b0 | 0b1 | 0b1 | 0b0 | X | 0b1 | X | X | X | X | 0b1 | EL2 | EL2 | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b1 | 0b0 | X | X | X | X | X | 0b1 | EL2 | n/a | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b1 | X | X | X | X | X | X | 0b0 | EL2 | n/a | EL2 | |||
| 0b0 | 0b1 | 0b1 | 0b1 | 0b1 | X | 0b0 | X | X | X | 0b1 | EL3 | n/a | EL3 | |||
| 0b0 | 0b1 | 0b1 | 0b1 | 0b1 | X | 0b1 | X | X | X | 0b1 | EL2 | n/a | EL3 | |||
| 0b1 | X | X | 0b0 | X | X | X | X | X | X | X | EL3 | EL3 | EL3 | |||
| 0b1 | X | X | 0b1 | X | X | X | X | X | X | X | EL3 | n/a | EL3 |
表 D1-15 当EL2使用AArch32时SError异常目标
| SCR_EL3 | | | HCR | | | PSTATE | 从以下级别获取 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| EA | TMEA | TGE | AMO | A | EL0 | EL1 | EL2 |
| 0b0 | 0b0 | 0b0 | 0b0 | X | Abt | Abt | Hyp |
| 0b0 | 0b0 | 0b0 | 0b1 | X | Hyp | Hyp | Hyp |
| 0b0 | 0b0 | 0b1 | X | X | Hyp | n/a | Hyp |
| 0b0 | 0b1 | 0b0 | 0b0 | 0b0 | Abt | Abt | Hyp |
| 0b0 | 0b1 | 0b0 | 0b0 | 0b1 | EL3 | EL3 | EL3 |
| 0b0 | 0b1 | 0b0 | 0b1 | 0b0 | Hyp | Hyp | Hyp |
| 0b0 | 0b1 | 0b0 | 0b1 | 0b1 | Hyp | Hyp | EL3 |
| 0b0 | 0b1 | 0b1 | X | 0b0 | Hyp | n/a | Hyp |
| 0b0 | 0b1 | 0b1 | X | 0b1 | Hyp | n/a | EL3 |
| 0b1 | X | 0b0 | X | X | EL3 | EL3 | EL3 |
| 0b1 | X | 0b1 | X | X | EL3 | n/a | EL3 |
D1.4.6.3.1 建立委托SError异常的目标异常级别 {#d1-4-6-3-1}
RVRBFW 下表描述了从ELx获取的委托SError异常的路由。参见RZZYHK使用的术语。
以下所有条件适用于此表:
- SCR_EL3.{NS, EEL2}未显示,因为RZZYHK描述了涉及安全状态的有效值。
- EDSCR.INTdis为0b00或入侵调试被禁用。
表 D1-16 当EL2使用AArch64时委托SError异常目标(包含FEAT_E3DSE的实现)
| HCR_EL2 | | | | HCRX_EL2 | PSTATE | 从以下级别获取 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| TGE | E2H | AMO | TMEA | A | EL0 | EL1 | EL2 |
| 0b0 | X | 0b0 | 0b0 | X | EL1 | EL1 | C |
| 0b0 | X | 0b0 | 0b1 | 0b0 | EL1 | EL1 | C |
| 0b0 | X | 0b0 | 0b1 | 0b1 | EL2 | EL2 | C |
| 0b0 | X | 0b1 | X | X | EL2 | EL2 | EL2 |
| 0b1 | 0b0 | X | X | X | EL2 | n/a | EL2 |
| 0b1 | 0b1 | X | X | X | EL2 | n/a | EL2 |
译者注: 当HCR_EL2.TGE=1时(EL0使用虚拟化且在EL2托管),委托SError被强制路由到EL2,即使HCRX_EL2.TMEA被设置。在TGE=1时,EL1被”透明”化(如同不存在),所以不能路由到EL1。
D1.4.6.4 异步异常屏蔽 {#d1-4-6-4}
RHDMYQ 中断可以被屏蔽。被屏蔽的中断不会被获取并保持待处理。
RPVHHQ 中断是否被屏蔽由以下所有因素决定:
- PSTATE.{A, I, F, ALLINT, SP}位。
- AllIntMask变量的值,如RXZPDT中所述。
- IRQ或FIQ中断是否具有超级优先级。
- 实现的异常级别。
- 超visor配置寄存器的配置。
- 对于SError,异常是否不可屏蔽。
- 安全配置寄存器的配置。
RLMWZH 如果处于AArch64状态且中断的目标异常级别低于当前异常级别,则中断被屏蔽。
RXZPDT 如果实现了FEAT_NMI且SCTLR_ELx.NMI为1,则以下所有条件适用:
- 创建AllIntMask变量,定义如下:
AllIntMask == PSTATE.ALLINT || (PSTATE.SP && SCTLR_ELx.SPINTMASK) - 当AllIntMask为1且在ELx执行时,针对ELx的IRQ或FIQ中断被屏蔽,无论超级优先级如何。
- 当AllIntMask为0且在ELx执行时:
- 具有超级优先级且针对ELx的IRQ或FIQ中断不会被PSTATE.I或PSTATE.F分别屏蔽。
- 不具有超级优先级且针对ELx的IRQ或FIQ中断分别被PSTATE.I或PSTATE.F屏蔽,与SCTLR_ELx.NMI的有效值为0时相同。
IBXXWT AllIntMask不影响中断到更高异常级别的屏蔽或路由。
RSFMGZ 如果未实现FEAT_NMI或SCTLR_ELx.NMI为0,则AllIntMask的有效值为0。
D1.4.6.4.1 物理中断屏蔽 {#d1-4-6-4-1}
RMHWBP 如果物理IRQ中断的目标异常级别是当前异常级别ELx,则以下控制位决定中断是否被屏蔽:
表 D1-18 IRQ屏蔽控制
| PSTATE.I | SCTLR_ELx.NMI | AllIntMask | IRQ | 具有超级优先级的IRQ |
|---|---|---|---|---|
| 0 | 0 | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | 0 | 未屏蔽 | 未屏蔽 |
| 0 | 1 | 1 | 屏蔽 | 屏蔽 |
| 1 | 0 | x | 屏蔽 | 屏蔽 |
| 1 | 1 | 0 | 屏蔽 | 未屏蔽 |
| 1 | 1 | 1 | 屏蔽 | 屏蔽 |
RGFXKY 如果物理FIQ中断的目标异常级别是当前异常级别ELx,则以下控制位决定中断是否被屏蔽:
表 D1-19 FIQ屏蔽控制
| PSTATE.F | SCTLR_ELx.NMI | AllIntMask | FIQ | 具有超级优先级的FIQ |
|---|---|---|---|---|
| 0 | 0 | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | 0 | 未屏蔽 | 未屏蔽 |
| 0 | 1 | 1 | 屏蔽 | 屏蔽 |
| 1 | 0 | x | 屏蔽 | 屏蔽 |
| 1 | 1 | 0 | 屏蔽 | 未屏蔽 |
| 1 | 1 | 1 | 屏蔽 | 屏蔽 |
| PSTATE.F | FIQ |
|---|---|
| 0 | 未屏蔽 |
| 1 | 屏蔽 |
RGCTZC 如果物理SError的目标异常级别是当前异常级别,则PSTATE.A控制位决定中断是否被屏蔽。
但是,如果目标异常级别是当前异常级别,且以下任一条件为真,则忽略PSTATE.A控制位,并获取异常:
- 目标异常级别是EL3,实现了FEAT_DoubleFault且SCR_EL3.NMEA的有效值为1。
- 目标异常级别是EL2,实现了FEAT_DoubleFault2且SCTLR2_EL2.NMEA的有效值为1。
- 目标异常级别是EL1,实现了FEAT_DoubleFault2且SCTLR2_EL1.NMEA的有效值为1。
RXBYXL 如果物理中断的目标异常级别高于当前异常级别,则以下所有条件适用:
- 如果目标异常级别是EL3,则中断不能被PSTATE.{A, I, F}位屏蔽。
- 如果目标异常级别是EL2且以下任一条件为真,则中断不能被PSTATE.{A, I, F}位屏蔽:
- HCR_EL2.E2H的有效值为0。
- HCR_EL2.TGE的有效值为0。
- 如果目标异常级别是EL2且以下所有条件为真,则中断可以被PSTATE.{A, I, F}位屏蔽:
- HCR_EL2.E2H的有效值为1。
- HCR_EL2.TGE的有效值为1。
- 中断不具有超级优先级或SCTLR_EL2.NMI为0。
- 如果目标异常级别是EL1且中断不具有超级优先级或SCTLR_EL1.NMI为0,则中断可以被PSTATE.{A, I, F}位屏蔽。
IKDYCN 在EL0中执行时允许中断被获取到EL1被屏蔽,这是某些用户级驱动程序代码所要求的。
译者注: 物理中断屏蔽规则比较复杂,总结如下:
- 对于发往比当前EL更高EL的中断,通常不能被屏蔽(EL3的IRQ/FIQ完全不可屏蔽,SError在特定条件下可以通过NMEA配置变为不可屏蔽)
- 当HCR_EL2.TGE=1且E2H=1时(即AArch64虚拟化环境),发往EL2的中断可以被PSTATE位屏蔽
- NMI(非屏蔽中断)特性通过SCTLR_ELx.NMI和AllIntMask提供额外的屏蔽控制
RHPRNX RSXLWJ表使用以下术语:
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值 |
| NS | 如果实现了FEAT_RME,则如果未实现安全状态,SCR_EL3.NS的有效值为1 |
| EEL2 | 如果EL3未实现,SCR_EL3.EEL2的有效值为1。如果未实现FEAT_SEL2,则SCR_EL3.EEL2的有效值为0 |
| IRQ FIQ | 如果EL3未实现,则这些字段的有效值为0 |
| RW | 如果EL3未实现,SCR_EL3.RW的有效值为1 |
| HCR | 如果EL2使用AArch32,这是HCR中字段的有效值。如果EL2使用AArch64,这是HCR_EL2中字段的有效值 |
| TGE | 如果EL2未实现,HCR.TGE或HCR_EL2.TGE的有效值为0 |
| E2H | 如果EL2未实现,HCR.E2H或HCR_EL2.E2H的有效值为0 |
| IMO FMO | 如果EL2未实现,这些字段的有效值为0 |
| A | 当中断待处理时,无论PSTATE.{A, I, F, ALLINT}中断屏蔽位的值如何,都会被获取 |
| B | 当中断待处理时,可能受到屏蔽,如RMHWBP或RGFXKY中所定义。如果中断被屏蔽,则不会被获取。如果中断未屏蔽,则会被获取 |
| C | 当中断待处理时,无论PSTATE.{A, I, F, ALLINT}中断屏蔽位的值如何,都不会被获取 |
| n/a | 不适用。对于指定的HCR和SCR_EL3状态,PE不能在此异常级别执行 |
RSXLWJ 下表描述了如果最高实现的异常级别使用AArch64时,物理FIQ和IRQ中断的目标和屏蔽。
表 D1-21 FIQ和IRQ中断异常目标及屏蔽
| SCR_EL3 | | | | HCR | | | | | | | | 执行时的中断屏蔽效果 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| NS | EEL2 | IRQ | | | | IMO | | | | | EL0 | EL1 | EL2 | EL3 |
| | | FIQ | RW | TGE | E2H | FMO | | | | | | | |
| 0 | 0 | 0 | x | x | x | x | | B | B | n/a | C |
| 0 | 0 | 1 | x | x | x | x | | A | A | n/a | B |
| 0 | 1 | 0 | x | 0 | x | 0 | | B | B | C | C |
| 0 | 1 | 0 | x | 0 | x | 1 | | A | A | B | C |
| 0 | 1 | 0 | x | 1 | 0 | x | | A | n/a | B | C |
| 0 | 1 | 0 | x | 1 | 1 | x | | B | n/a | B | C |
| 0 | 1 | 1 | x | 0 | x | x | | A | A | A | B |
| 0 | 1 | 1 | x | 1 | x | x | | A | n/a | A | B |
| 1 | x | 0 | 0 | 0 | n/a | 0 | | B | B | B | C |
| 1 | x | 0 | 0 | 0 | n/a | 1 | | A | A | B | C |
| 1 | x | 0 | 0 | 1 | n/a | x | | A | n/a | B | C |
| 1 | x | 0 | 1 | 0 | x | 0 | | B | B | C | C |
| 1 | x | 0 | 1 | 0 | x | 1 | | A | A | B | C |
| 1 | x | 0 | 1 | 0 | x | 1 | | A | A | B | C |
| 1 | x | 0 | 1 | 1 | 0 | x | | A | n/a | B | C |
| 1 | x | 0 | 1 | 1 | 1 | x | | B | n/a | B | C |
| 1 | x | 1 | x | 0 | x | x | | A | A | A | B |
| 1 | x | 1 | x | 1 | x | x | | A | n/a | A | B |
RZSRWR RJFKMF表使用以下术语:
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值 |
| EA | 如果EL3未实现,SCR_EL3.EA的有效值为0 |
| TMEA | 如果未实现FEAT_DoubleFault2,SCR_EL3.TMEA的有效值为0 |
| NMEA | 如果未实现FEAT_DoubleFault,SCR_EL3.NMEA的有效值为0 |
| HCR_EL2 | HCR_EL2中字段的有效值 |
| HCR | HCR中字段的有效值 |
| TGE | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.TGE或HCR.TGE的有效值为0 |
| E2H | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.E2H的有效值为0 |
| AMO | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.AMO或HCR.AMO的有效值为0 |
| SCTLR2_EL2 | SCTLR2_EL2中字段的有效值 |
| NMEA | 如果未实现FEAT_DoubleFault2,SCTLR2_EL2.NMEA的有效值为0。如果EL2未实现或在当前安全状态中被禁用,或者SCR_EL3.SCTLR2En的有效值为0,则SCTLR2_EL2.NMEA的有效值为0 |
| HCRX_EL2 | HCRX_EL2中字段的有效值 |
| TMEA | 如果未实现FEAT_DoubleFault2,HCRX_EL2.TMEA的有效值为0。如果EL2未实现或在当前安全状态中被禁用,或者SCR_EL3.HXEn的有效值为0,则HCRX_EL2.TMEA的有效值为0 |
| SCTLR2_EL1 | SCTLR2_EL1中字段的有效值 |
| NMEA | 如果未实现FEAT_DoubleFault2,SCTLR2_EL1.NMEA的有效值为0。如果HCRX_EL2.SCTLR2En的有效值为0或SCR_EL3.SCTLR2En的有效值为0,则SCTLR2_EL1.NMEA的有效值为0 |
| A | 当异常待处理时,无论PSTATE.A屏蔽位的值如何,都会被获取 |
| B | 当异常待处理时,可能受到屏蔽,如RGCTZC中所定义。如果中断被屏蔽,则不会被获取。如果中断未屏蔽,则会被获取 |
| C | 异常不会被获取并保持待处理,无论PSTATE.A屏蔽位的值如何 |
| n/a | 不适用。在该配置中寄存器中不存在该字段或该异常级别不可访问 |
RJFKMF 以下表描述了SError异常的屏蔽。
以下所有条件适用于这些表:
- SCR_EL3.{NS, EEL2}未显示,因为RZSRWR描述了涉及安全状态的有效值。
- EDSCR.INTdis为0b00或入侵调试被禁用。
表 D1-23 当EL2使用AArch64时SError异常屏蔽
| SCR_EL3 | | | | HCR_EL2 | | | | | | | | | | | 执行时的中断屏蔽效果 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| EA | TMEA | NMEA | TGE | E2H | AMO | | | | | | | | | | EL0 | EL1 | EL2 | EL3 |
| | | | | | | SCTLR2_EL1 | | | | | | | | | | | | |
| | | | | | | HCRX_EL2 | | | | | | | | | | | | |
| | | | | | | NMEA | TMEA | NMEA | | | | | | | | | | |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | X | X | B | B | C | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | A | A | C | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | X | 0b0 | A | A | C | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | 0b0 | X | B | B | A | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | 0b1 | 0b1 | A | A | A | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | X | 0b0 | A | A | A | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b1 | 0b0 | X | X | X | X | A | A | B | C |
| 0b0 | 0b0 | 0b0 | 0b0 | X | 0b1 | 0b1 | X | X | X | X | A | A | A | C |
| 0b0 | 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | X | X | X | X | A | n/a | B | C |
| 0b0 | 0b0 | 0b0 | 0b1 | X | X | 0b1 | X | X | X | X | A | n/a | A | C |
| 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | X | 0b0 | X | X | X | X | B | n/a | B | C |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | 0b0 | X | B | B | C | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b0 | 0b1 | 0b1 | A | A | C | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b0 | 0b0 | 0b1 | X | 0b0 | A | A | C | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | 0b0 | X | B | B | A | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b0 | 0b1 | 0b1 | A | A | A | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b0 | 0b1 | 0b0 | 0b1 | X | 0b0 | A | A | A | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b1 | 0b0 | X | X | X | X | A | A | B | A |
| 0b0 | 0b0 | 0b1 | 0b0 | X | 0b1 | 0b1 | X | X | X | X | A | A | A | A |
| 0b0 | 0b0 | 0b1 | 0b1 | 0b0 | X | 0b0 | X | X | X | X | A | n/a | B | A |
| 0b0 | 0b0 | 0b1 | 0b1 | X | X | 0b1 | X | X | X | X | A | n/a | A | A |
| 0b0 | 0b0 | 0b1 | 0b1 | 0b1 | X | 0b0 | X | X | X | X | B | n/a | B | A |
| 0b0 | 0b1 | 0b0 | 0b0 | X | X | X | X | X | X | X | A | A | A | C |
| 0b0 | 0b1 | 0b0 | 0b1 | X | X | X | X | X | X | X | A | n/a | A | C |
| 0b0 | 0b1 | 0b1 | 0b0 | X | X | X | X | X | X | X | A | A | A | A |
| 0b0 | 0b1 | 0b1 | 0b1 | X | X | X | X | X | X | X | A | n/a | A | A |
| 0b1 | X | 0b0 | 0b0 | X | X | X | X | X | X | X | A | A | A | B |
| 0b1 | X | 0b0 | 0b1 | X | X | X | X | X | X | X | A | n/a | A | B |
| 0b1 | X | 0b1 | 0b0 | X | X | X | X | X | X | X | A | A | A | A |
| 0b1 | X | 0b1 | 0b1 | X | X | X | X | X | X | X | A | n/a | A | A |
表 D1-24 当EL2使用AArch32时SError异常屏蔽
| SCR_EL3 | | | HCR | | | 执行时的中断屏蔽效果 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| EA | TMEA | TGE | AMO | EL0 | EL1 | EL2 |
| 0b0 | 0b0 | 0b0 | 0b0 | B | B | B |
| 0b0 | 0b0 | 0b0 | 0b1 | A | A | B |
| 0b0 | 0b0 | 0b1 | X | A | n/a | B |
| 0b0 | 0b1 | 0b0 | X | A | A | A |
| 0b0 | 0b1 | 0b1 | X | A | n/a | A |
| 0b1 | X | 0b0 | X | A | A | A |
| 0b1 | X | 0b1 | X | A | n/a | A |
D1.4.6.4.2 虚拟异步异常屏蔽 {#d1-4-6-4-2}
RSNLJH 以下控制位决定虚拟IRQ中断是否被屏蔽:
表 D1-26 vIRQ屏蔽控制
| PSTATE.I | SCTLR_EL1.NMI | PSTATE.EL | AllIntMask | vIRQ | 具有超级优先级的vIRQ |
|---|---|---|---|---|---|
| 0 | 0 | xx | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL0 | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL1 | 0 | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL1 | 1 | 屏蔽 | 屏蔽 |
| 1 | 0 | xx | x | 屏蔽 | 屏蔽 |
| 1 | 1 | EL0 | x | 屏蔽 | 未屏蔽 |
| 1 | 1 | EL1 | 0 | 屏蔽 | 未屏蔽 |
| 1 | 1 | EL1 | 1 | 屏蔽 | 屏蔽 |
RXSPSG 以下控制位决定虚拟FIQ中断是否被屏蔽:
表 D1-27 vFIQ屏蔽控制
| PSTATE.F | SCTLR_EL1.NMI | PSTATE.EL | AllIntMask | vFIQ | 具有超级优先级的vFIQ |
|---|---|---|---|---|---|
| 0 | 0 | xx | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL0 | x | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL1 | 0 | 未屏蔽 | 未屏蔽 |
| 0 | 1 | EL1 | 1 | 屏蔽 | 屏蔽 |
| 1 | 0 | xx | x | 屏蔽 | 屏蔽 |
| 1 | 1 | EL0 | x | 屏蔽 | 未屏蔽 |
| 1 | 1 | EL1 | 0 | 屏蔽 | 未屏蔽 |
| 1 | 1 | EL1 | 1 | 屏蔽 | 屏蔽 |
RGYGBD 虚拟异步异常只能从EL0或EL1获取,且只能获取到EL1。如果EL2在当前安全状态中未启用,则所有类型的虚拟异步异常始终被屏蔽。如果在EL2或EL3执行,则所有类型的虚拟异步异常始终被屏蔽。
RMMYBS 以下控制位决定虚拟SError中断是否被屏蔽:
表 D1-28 vSError屏蔽控制
| PSTATE.A | PSTATE.EL | vSError |
|---|---|---|
| 0 | xx | 未屏蔽 |
| 1 | xx | 屏蔽 |
IBNCCH 在EL0中执行时允许虚拟中断被获取到EL1被屏蔽,这是某些用户级驱动程序代码所要求的。
RWVZVM RBKHXL表使用以下术语:
| 术语 | 含义 |
|---|---|
| SCR_EL3 | SCR_EL3中字段的有效值 |
| EEL2 | 如果EL3未实现,SCR_EL3.EEL2的有效值为1 |
| NS | 如果实现了FEAT_RME,则如果未实现安全状态,SCR_EL3.NS的有效值为1 |
| EA IRQ FIQ | 如果EL3未实现,这些字段的有效值为0 |
| HCR | 如果EL2使用AArch32,这是HCR中字段的有效值。如果EL2使用AArch64,这是HCR_EL2中字段的有效值 |
| E2H | 如果EL2使用AArch32,HCR.E2H的有效值为0 |
| TGE | 如果EL2未实现,HCR.TGE或HCR_EL2.TGE的有效值为0 |
| AMO IMO FMO | 如果EL2未实现,这些字段的有效值为0 |
| B | 当中断待处理时,可能受到屏蔽,如RSNLJH、RXSPSG和RMMYBS中所定义。如果中断被屏蔽,则不会被获取。如果中断未屏蔽,则会被获取 |
| C | 当中断待处理时,无论PSTATE.{A, I, F, ALLINT, SP, PM}中断屏蔽位的值如何,都不会被获取 |
| n/a | 不适用。对于指定的HCR和SCR_EL3状态,PE不能在此异常级别执行 |
RBKHXL 下表描述了当最高实现的异常级别使用AArch64时虚拟中断的屏蔽:
表 D1-29 虚拟中断屏蔽
| SCR_EL3 | HCR | 执行时的中断屏蔽效果 | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| EEL2 | NS | IRQ | IMO | EL0 | EL1 | ||||||
| FIQ | E2H | TGE | FMO | ||||||||
| 0 | 0 | x | x | x | x | C | C | n/a | C | ||
| 1 | 0 | x | x | 0 | 0 | C | C | C | C | ||
| 1 | 0 | x | x | 0 | 1 | B | B | C | C | ||
| 1 | 0 | x | x | 1 | x | C | n/a | C | C | ||
| x | 1 | x | x | 0 | 0 | C | C | C | C | ||
| x | 1 | x | x | 0 | 1 | B | B | C | C | ||
| x | 1 | x | x | 1 | x | C | n/a | C | C |
译者注: 虚拟中断屏蔽规则:
- 虚拟中断只能由EL2注入并路由到EL1(guest虚拟机)
- 当HCR_EL2.TGE=1时(EL0虚拟化),虚拟中断被禁用
- 虚拟中断在EL2和EL3始终被屏蔽
- 如果EL2未在当前安全状态中启用,所有虚拟中断始终被屏蔽
D1.4.6.4.3 委托SError异常屏蔽 {#d1-4-6-4-3}
RZZXBJ RLPCYB表使用以下术语:
| 术语 | 含义 |
|---|---|
| HCR_EL2 | HCR_EL2中字段的有效值 |
| TGE | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.TGE的有效值为0 |
| E2H | 如果实现了FEAT_VHE且未实现FEAT_E2H0,则HCR_EL2.E2H的有效值为1。否则,如果未实现FEAT_VHE,或EL2未实现,或EL2在当前安全状态中被禁用,则HCR_EL2.E2H的有效值为0 |
| AMO | 如果EL2未实现或在当前安全状态中被禁用,则HCR_EL2.AMO的有效值为0 |
| HCRX_EL2 | HCRX_EL2中字段的有效值 |
| TMEA | 如果未实现FEAT_DoubleFault2,EL2未实现,EL2在当前安全状态中被禁用,或SCR_EL3.HXEn的有效值为0,则HCRX_EL2.TMEA的有效值为0 |
| A | 当异常待处理时,无论PSTATE.A屏蔽位的值如何,都会被获取。但是,异常的目标异常级别可能取决于PSTATE.A的值。参见RVRBFW |
| B | 当异常待处理时,可能受到屏蔽。如果PSTATE.A为1,则异常被屏蔽且不会被获取。如果PSTATE.A为0,则异常未被屏蔽且会被获取 |
| C | 错误异常不会被获取并保持待处理,无论PSTATE.A屏蔽位的值如何 |
| n/a | 不适用。在该配置中不存在此异常级别 |
RLPCYB 下表描述了委托SError异常的屏蔽。
以下所有条件适用于此表:
- SCR_EL3.{NS, EEL2}未显示,因为RZZXBJ描述了涉及安全状态的有效值。
- EDSCR.INTdis为0b00或入侵调试被禁用。
表 D1-31 委托SError异常屏蔽(包含FEAT_E3DSE的实现)
| HCR_EL2 | | | | HCRX_EL2 | 执行时的中断屏蔽效果 |
|——–|——–|——–|——–|——–|——–|——–|——–|——–|
| TGE | E2H | AMO | TMEA | EL0 | EL1 | EL2 |
| 0b0 | X | 0b0 | 0b0 | B | B | C |
| 0b0 | X | 0b0 | 0b1 | A | A | C |
| 0b0 | X | 0b1 | X | A | A | B |
| 0b1 | 0b0 | X | X | A | n/a | B |
| 0b1 | 0b1 | X | X | B | n/a | B |
译者注: 委托SError异常屏蔽机制使用PSTATE.A作为主要屏蔽控制,这与物理SError类似。但当HCRX_EL2.TMEA=1时(即启用了双错误报告到EL2),从EL0和EL1获取的委托SError变得不可屏蔽(标记为A)。
D1.4.6.5 异步异常优先级 {#d1-4-6-5}
RBKHSW 使用HCR_EL2.VSE注入的虚拟SError异常优先于使用SCR_EL3.DSE注入的委托SError异常。否则,物理异步异常和虚拟异步异常的优先级是实现定义的。
RRBZYL 对于以下所有上下文同步事件,如果异步异常在上下文同步事件之前待处理,且异步异常在上下文同步事件之后仍保持待处理且未被屏蔽,则异步异常在上下文同步事件之后的第一条指令之前被获取:
- 执行ISB指令。
- 如果未实现FEAT_ExS,则异常入口。
- 如果实现了FEAT_ExS且相应的SCTLR_ELx.EIS位为1,则异常入口。
- 如果未实现FEAT_ExS,则异常返回。
- 如果实现了FEAT_ExS且相应的SCTLR_ELx.EOS位为1,则异常退出。
- 退出调试状态。
如果上下文同步事件之后的第一条指令生成同步异常,则架构不定义PE是先获取异步异常还是先获取同步异常。
IRDBWJ RAS错误同步事件对获取SError异常有额外要求。参见错误同步事件(Error synchronization event)。
RQVRHH 除RRB ZYL中描述的行为外,未屏蔽的待处理异步异常必须在有限时间内被获取。
RZQPLL 如果未屏蔽的异步异常之前待处理但在获取之前变为非待处理,则获取异步异常是受约束的不可预测(CONSTRAINED UNPREDICTABLE)。如果获取了异步异常,则在异步异常变为非待处理之后的第一个上下文同步事件之前获取。
D1.4.6.6 在多访问加载或存储期间获取异步异常 {#d1-4-6-6}
RZBFSL 如果处于AArch64状态,异步异常可以在单个加载或存储指令引起的内存访问序列期间被获取。这适用于所访问的任何内存类型。
在这种情况下,行为与RTNVSL在精确异常和模糊异常的定义中所述的要求一致。
D1.4.6.7 在SVE指令期间获取异步异常 {#d1-4-6-7}
RTFLTX 允许SVE指令被异步异常中断是实现定义的。
RWFMZK 当从异步异常返回时,被中断的SVE指令被重新启动,不能从指令被中断的点恢复。
IQRQJP 对于异步获取的数据中止,参见精确异常和模糊异常的定义。
D1.4.7 未定义指令 {#d1-4-7}
RZLJDF 未定义(UNDEFINED)的指令会为该指令生成同步异常,除非该指令生成了更高优先级的异常。
RSXYZB 同步未定义指令异常被获取到的异常级别定义如下:
- 如果在EL0执行:
- 如果HCR_EL2.TGE的有效值为0,则异常被获取到EL1。
- 如果HCR_EL2.TGE的有效值为1,则异常被获取到EL2。
- 如果在EL1执行,则异常被获取到EL1。
- 如果在EL2执行,则异常被获取到EL2。
- 如果在EL3执行,则异常被获取到EL3。
译者注: 未定义指令异常的目的是允许操作系统或Hypervisor在应用程序执行了不支持的指令时捕获并处理。这与”非法指令”不同,后者通常是执行了不符合架构的指令位模式。
D1.4.8 可配置指令控制 {#d1-4-8}
RQMWPZ 可配置指令控制是保存在系统寄存器中的控制位,决定尝试执行指令是否在该指令的指令流中生成同步异常,且该指令不被执行。
IZSSHJ 可配置指令控制可能被称为以下任何名称:
- 指令使能(Instruction enables)。
- 指令禁用(Instruction disables)。
- 陷阱控制(Trap controls)。
每种类型的定义有重叠,在某些情况下是历史性的。将寄存器控制字段描述为指令使能、指令禁用或陷阱控制,并不表示对该字段值产生的异常的处理或报告方式。每个可配置指令控制都定义了因可配置指令控制而产生的异常的处理或报告方式。
RVWWGJ 只有在以下所有条件适用时,才能因可配置指令控制而产生异常:
- 生成异常的指令不会同时生成更高优先级的异常。
- 生成异常的指令在执行该指令的PE状态中不是不可预测(UNPREDICTABLE)或受约束的不可预测(CONSTRAINED UNPREDICTABLE)。
RJTXTF 当指令在执行该指令的PE状态中是UNPREDICTABLE或CONSTRAINED UNPREDICTABLE时,可配置指令控制是否产生异常是UNPREDICTABLE/CONSTRAINED UNPREDICTABLE,有以下所有约束:
- 如果指令描述明确声明可配置指令控制以高于CONSTRAINED UNPREDICTABLE行为的优先级应用,则可配置指令控制产生异常。
- CONSTRAINED UNPREDICTABLE行为不能导致任何被UNPREDICTABLE的一般定义所禁止的行为。
IBJBMF UNPREDICTABLE和CONSTRAINED UNPREDICTABLE指令可以因可配置指令控制而产生异常,但架构不要求它们这样做。
译者注: 许多指令的CONSTRAINED UNPREDICTABLE行为包括允许CONSTRAINED UNPREDICTABLE指令表现得与密切相关的非CONSTRAINED UNPREDICTABLE指令相同。在这种情况下,导致密切相关指令产生异常的指令使能、禁用或陷阱控制将对CONSTRAINED UNPREDICTABLE指令产生相同的异常。
ITFGPW 实现可能在实现定义的寄存器中提供更多控制,以提供对实现定义特性的陷阱控制。
RQQLHG 当可配置指令控制导致异常时,异常被获取且指令不被执行,因此以下所有条件为真:
- 异常的优先异常返回地址是生成异常的指令。
- 指令访问的寄存器没有变化,包括作为寄存器访问副作用的变化。
RSZCKN 当可配置指令控制导致AArch32状态中的条件指令生成异常时,条件AArch32指令是否因条件代码检查失败而产生异常是实现定义的。
D1.4.8.1 EL0和EL1可配置指令控制 {#d1-4-8-1}
ITJPQP 以下EL0和EL1系统寄存器包含可配置指令控制:
表 D1-32 EL0和EL1可配置指令控制寄存器
| 寄存器名称 | 寄存器描述 |
|---|---|
| AMUSERENR_EL0 | 活动监视器用户使能寄存器(Activity Monitors User Enable Register) |
| CPACR_EL1 | 架构特性访问控制寄存器(Architectural Feature Access Control Register) |
| MDSCR_EL1 | 监视器系统调试控制寄存器(Monitor System Debug Control Register) |
| PMUSERENR_EL0 | 性能监视器用户使能寄存器(Performance Monitors User Enable Register) |
| SCTLR_EL1 | 系统控制寄存器(EL1)(System Control Register (EL1)) |
| TCR_EL1 | 转换控制寄存器(EL1)(Translation Control Register (EL1)) |
RKYYYZ 因EL1中的可配置指令控制而产生的异常可以从AArch64状态或AArch32状态获取。
D1.4.8.2 EL2可配置指令控制 {#d1-4-8-2}
IFFLBF 以下EL2系统寄存器包含可配置指令控制:
表 D1-33 EL2可配置指令控制寄存器
| 寄存器名称 | 寄存器描述 |
|---|---|
| CPTR_EL2 | 架构特性陷阱寄存器,EL2(Architectural Feature Trap Register, EL2) |
| HAFGRTR_EL2 | 超visor活动监视器细粒度读陷阱寄存器(Hypervisor Activity Monitors Fine-Grained Read Trap Register) |
| HCR_EL2 | 超visor配置寄存器(Hypervisor Configuration Register) |
| HCRX_EL2 | 扩展超visor配置寄存器(Extended Hypervisor Configuration Register) |
| HDFGRTR_EL2 | 超visor调试细粒度读陷阱寄存器(Hypervisor Debug Fine-Grained Read Trap Register) |
| HDFGRTR2_EL2 | 超visor调试细粒度读陷阱寄存器2(Hypervisor Debug Fine-Grained Read Trap Register 2) |
| HDFGWTR_EL2 | 超visor调试细粒度写陷阱寄存器(Hypervisor Debug Fine-Grained Write Trap Register) |
| HDFGWTR2_EL2 | 超visor调试细粒度写陷阱寄存器2(Hypervisor Debug Fine-Grained Write Trap Register 2) |
| HFGITR_EL2 | 超visor细粒度指令陷阱寄存器(Hypervisor Fine-Grained Instruction Trap Register) |
| HFGITR2_EL2 | 超visor细粒度指令陷阱寄存器2(Hypervisor Fine-Grained Instruction Trap Register 2) |
| HFGRTR_EL2 | 超visor细粒度读陷阱寄存器(Hypervisor Fine-Grained Read Trap Register) |
| HFGRTR2_EL2 | 超visor细粒度读陷阱寄存器2(Hypervisor Fine-Grained Read Trap Register 2) |
| HFGWTR_EL2 | 超visor细粒度写陷阱寄存器(Hypervisor Fine-Grained Write Trap Register) |
| HFGWTR2_EL2 | 超visor细粒度写陷阱寄存器2(Hypervisor Fine-Grained Write Trap Register 2) |
| HSTR_EL2 | 超visor系统陷阱寄存器(Hypervisor System Trap Register) |
| MDCR_EL2 | 监视器调试配置寄存器,EL2(Monitor Debug Configuration Register, EL2) |
| SCTLR_EL2 | 系统控制寄存器,EL2(System Control Register, EL2) |
| TCR_EL2 | 转换控制寄存器,EL2(Translation Control Register, EL2) |
RJZJRG 因EL2中的可配置指令控制而产生的异常可以从AArch64状态或AArch32状态获取。
RSNLNY 如果未实现或未启用安全EL2,则EL2可配置指令控制在安全状态中被忽略。
D1.4.8.3 EL3可配置指令控制 {#d1-4-8-3}
RLTKXZ 以下EL3系统寄存器包含可配置指令控制:
表 D1-34 EL3可配置指令控制寄存器
| 寄存器名称 | 寄存器描述 |
|---|---|
| CPTR_EL3 | 架构特性陷阱寄存器,EL3(Architectural Feature Trap Register, EL3) |
| FGWTE3_EL3 | 细粒度写陷阱EL3(Fine-Grained Write Traps EL3) |
| MDCR_EL3 | 监视器调试配置寄存器,EL3(Monitor Debug Configuration Register, EL3) |
| SCTLR_EL3 | 系统控制寄存器,EL3(System Control Register, EL3) |
| SCR_EL3 | 安全配置寄存器(Secure Configuration Register) |
| TCR_EL3 | 转换控制寄存器,EL3(Translation Control Register, EL3) |
RNMCCJ 因EL3中的可配置指令控制而产生的异常可以从AArch64状态或AArch32状态获取。
译者注: 可配置指令控制是ARM架构中非常重要的安全隔离机制。通过这些控制:
- Hypervisor(EL2)可以捕获来自Guest虚拟机(EL1/EL0)的敏感操作
- 安全监视器(EL3)可以控制对安全世界(Secure world)资源的访问
- OS内核(EL1)可以限制应用程序(EL0)直接访问某些处理器资源
D1.4 异常(Exceptions)— 第三部分
D1.4.9 异常生成指令(Exception generating instructions)
IYRYNQ 异常生成指令通常被称为系统调用(system calls),指的是生成以下任何同步异常类型的指令:
- 超级调用(Supervisor Call)异常。
- 超级调用(Hypervisor Call)异常。
- 安全监控调用(Secure Monitor Call)异常。
RBRCQB 通过执行SVC指令生成超级调用(Supervisor Call)。
RTNSNV 超级调用异常被 taken 到以下异常级别:
- 如果在EL0执行:
- 如果HCR_EL2.TGE的有效值为0,则异常被 taken 到EL1。
- 如果HCR_EL2.TGE的有效值为1,则异常被 taken 到EL2。
- 如果在EL1执行,则异常被 taken 到EL1。
- 如果在EL2执行,则异常被 taken 到EL2。
- 如果在EL3执行,则异常被 taken 到EL3。
INCTDB 超级调用使在EL0执行的软件能够调用在EL1执行的操作系统或其他软件。
译者注: “Supervisor Call”在ARM文档中通常指操作系统级的系统调用,在传统ARM体系中对应SVC指令(曾是SWI,Software Interrupt)。此处SVC为”Supervisor Call”的缩写。
RLLLGJ 如果EL2已实现且HVC指令不是UNDEFINED,则通过执行HVC指令生成超级调用(Hypervisor Call)。
RRWKMY 超级调用异常被 taken 到以下异常级别:
- 如果EL2已实现并在当前安全状态下启用,从EL1 taken 时,异常被 taken 到EL2。
- 从EL2 taken 时,异常被 taken 到EL2。
- 从EL3 taken 时,异常被 taken 到EL3。
RZVTPR 以下任一情况为真时,HVC指令为UNDEFINED:
- PE正在EL0执行。
- 如果EL2在当前安全状态下未启用,且PE正在EL1执行。
- SCR_EL3.HCE的有效值为0。
- EL2未实现。
RNDGTC 如果EL3已实现且SMC指令不是UNDEFINED或未被捕获,则通过执行SMC指令生成安全监控调用(Secure Monitor Call)。安全监控调用是一种同步异常,被 taken 到EL3。
RHMXQS 以下任一情况为真时,SMC指令为UNDEFINED:
- PE正在EL0执行。
- EL3未实现且SMC指令未被HCR_EL2.TSC捕获到EL2。
- SCR_EL3.SMD为1且SMC指令未被HCR_EL2.TSC捕获到EL2。
D1.4.10 程序计数器和栈指针对齐(Program Counter and stack pointer alignment)
D1.4.10.1 PC对齐检查(PC alignment checking)
RQCCWG 如果PC的位[1:0]不是0b00,则存在未对齐的PC。
RSJLDM 执行具有未对齐PC的指令会在该指令上产生同步PC对齐异常。
RJKZZX PC对齐异常被 taken 到以下异常级别:
- 如果在EL0执行:
- 如果HCR_EL2.TGE为0,则异常被 taken 到EL1。
- 如果HCR_EL2.TGE为1,则异常被 taken 到EL2。
- 如果在EL1执行,则异常被 taken 到EL1。
- 如果在EL2执行,则异常被 taken 到EL2。
- 如果在EL3执行,则异常被 taken 到EL3。
RMVTQT 当PC对齐故障异常被 taken 到使用AArch64的异常级别ELx时,ELR_ELx和FAR_ELx都以其未对齐形式保存整个PC。
IVFXPV PC的未对齐是严重错误的指示,例如软件损坏了地址。
译者注: 在ARM架构中,PC必须四字节对齐(bits [1:0] = 00),因为ARM指令长度为32位(4字节)或16位(Thumb模式)。PC未对齐通常表示程序错误或数据损坏。
D1.4.10.2 SP对齐检查(SP alignment checking)
RRDMXG 当SP用作计算的基础地址时,无论指令应用任何偏移,如果SP的位[3:0]不是0b0000,则存在未对齐的SP。
RTFVSM 如果启用了SP对齐检查,则使用SP进行加载或存储时使用未对齐的SP会在该加载或存储上产生同步SP对齐异常。
RJQXVP 使用SP的PRFM指令不执行栈对齐检查。
译者注: PRFM(Prefetch Memory)指令虽然也使用SP作为基地址,但架构明确声明其不进行栈对齐检查。这可能是由于预取操作的性质决定的。
RSTDYJ 以下位在每个异常级别使用AArch64时启用SP对齐检查:
- 如果HCR_EL2.{E2H, TGE}的有效值为{1, 1},则SCTLR_EL2.SA0控制EL0。否则,SCTLR_EL1.SA0控制EL0。
- SCTLR_EL1.SA控制EL1。
- SCTLR_EL2.SA控制EL2。
- SCTLR_EL3.SA控制EL3。
RNCGYQ SP对齐异常被 taken 到以下异常级别:
- 如果在EL0执行:
- 如果HCR_EL2.TGE为0,则异常被 taken 到EL1。
- 如果HCR_EL2.TGE为1,则异常被 taken 到EL2。
- 如果在EL1执行,则异常被 taken 到EL1。
- 如果在EL2执行,则异常被 taken 到EL2。
- 如果在EL3执行,则异常被 taken 到EL3。
RDLDVL 如果启用了SP对齐检查且具有任何活动元素的SVE谓词加载或存储指令使用当前SP作为基地址,则SP寄存器按16字节对齐检查。
RFNCJX 如果启用了SP对齐检查且具有无活动元素的SVE谓词加载或存储指令使用当前SP作为基地址,则SP寄存器是否按16字节对齐检查是CONSTRAINED UNPREDICTABLE的。
译者注: SVE(可扩展向量长度)操作中,当所有元素都处于非活动状态时,是否执行16字节SP对齐检查是不确定的。这体现了对此类边界情况处理的灵活性设计。
D1.5 进程状态,PSTATE(Process state, PSTATE)
RSPCZF 进程状态(Process state),或称 PSTATE,是对进程状态信息的抽象。
ILPKMT 所有 ARM 指令集都提供操作 PSTATE 元素的指令。
IKXKMY PSTATE 包含以下所有内容:
- 仅在 AArch32 状态时有意义的字段。
- 仅在 AArch64 状态时有意义的字段。
- 在两种执行状态中都有意义的字段。
IZHGST PSTATE 在伪代码中定义为 PSTATE 结构体。
D1.5.1 在 AArch64 状态时有意义的 PSTATE 字段
ILLLXL 在 AArch64 状态时有意义的 PSTATE 字段分为以下类别:
- 条件标志(Condition flags)。
- 执行状态控制(Execution state controls)。
- 异常屏蔽位(Exception mask bits)。
- 访问控制位(Access control bits)。
- 时序控制位(Timing control bits)。
- 推测控制位(Speculation control bits)。
RPCDTX 以下 PSTATE 位在 AArch64 状态时有意义:
| PSTATE 字段名 | PSTATE 字段分组 | 必需实现特性 | Warm reset 断言时的值 | 额外详情 |
|---|---|---|---|---|
| N, Negative condition flag(负条件标志) | 条件标志 | - | - | - |
| Z, Zero condition flag(零条件标志) | 条件标志 | - | - | - |
| C, Carry condition flag(进位条件标志) | 条件标志 | - | - | - |
| V, Overflow condition flag(溢出条件标志) | 条件标志 | - | - | - |
| SS, Software Step bit(软件步进位) | 执行状态控制 | - | 0 | - |
| IL, Illegal Execution state bit(非法执行状态位) | 执行状态控制 | - | 0 | - |
| nRW, Current Execution state bit(当前执行状态位) | 执行状态控制 | - | 0 | 如果当前执行状态为 AArch64,则 PSTATE.nRW 位为 0。 |
| EL, Current Exception level field(当前异常级字段) | 执行状态控制 | - | 当 Warm reset 断言进入使用 AArch64 的异常级时,PSTATE.EL 字段保存最高已实现异常级的编码。 | - |
| SP, Stack pointer register selection bit(栈指针寄存器选择位) | 执行状态控制 | - | 1 | - |
| D, Debug exception mask bit(调试异常屏蔽位) | 异常屏蔽位 | - | 1 | - |
| A, I, F, Asynchronous exception mask bits(异步异常屏蔽位) | 异常屏蔽位 | - | 1 | - |
| PSTATE 字段名 | PSTATE 字段分组 | 必需实现特性 | Warm reset 断言时的值 | 额外详情 |
|---|---|---|---|---|
| ALLINT, All interrupt mask bit(所有中断屏蔽位) | 异常屏蔽位 | FEAT_NMI | - | - |
| PAN, Privileged Access Never state bit(特权访问永不状态位) | 访问控制位 | FEAT_PAN | - | - |
| UAO, User Access Override bit(用户访问覆盖位) | 访问控制位 | FEAT_UAO | - | - |
| TCO, Tag Check Override bit(标签检查覆盖位) | 访问控制位 | FEAT_MTE | - | - |
| BTYPE, Branch target identification bit(分支目标标识位) | 访问控制位 | FEAT_BTI | - | - |
| DIT, Data Independent Timing bit(数据无关时序位) | 时序控制位 | FEAT_DIT | 0 | - |
| SSBS, Speculative Store Bypass Safe bit(推测存储旁路安全位) | 推测控制位 | FEAT_SSBS | 实现定义(IMPLEMENTATION DEFINED) | - |
| PM, PMU exception mask(PMU 异常屏蔽) | 异常屏蔽位 | FEAT_EBEP | - | - |
| EXLOCK, GCS exception state lock(GCS 异常状态锁) | 访问控制位 | FEAT_GCS | 0 | - |
| SM, Enables Streaming SVE mode(启用 Streaming SVE 模式) | 执行状态控制 | FEAT_SME | 0 | - |
| ZA, Enables SME ZA storage(启用 SME ZA 存储) | 访问控制位 | FEAT_SME | 0 | - |
| PACM. PACM instruction executed(PACM 指令已执行) | 执行状态控制 | FEAT_PAuth_LR | 0 | - |
| UINJ, Inject Undefined Instruction exception(注入未定义指令异常) | 执行状态控制 | FEAT_UINJ | 0 | - |
D1.5.1.1 访问 PSTATE 字段(Accessing PSTATE fields)
RLYGBS 在 AArch64 状态中,PSTATE 字段通过特殊用途寄存器(Special-purpose registers)访问,使用 MRS(寄存器)指令直接读取,使用 MSR(寄存器)指令直接写入。
RDGPCL 如果处于 AArch64 状态,以下特殊用途寄存器可以访问持有 AArch64 状态的 PSTATE 字段:
| 特殊用途寄存器 | PSTATE 字段 |
|---|---|
| NZCV | N, Z, C, V |
| DAIF | D, A, I, F |
| CurrentEL | EL |
| SPSel | SP |
| PAN | PAN |
| UAO | UAO |
| DIT | DIT |
| SSBS | SSBS |
| TCO | TCO |
| ALLINT | ALLINT |
| PM | PM |
| SVCR | SM, ZA |
译者注: 以上列出的特殊用途寄存器提供了对特定 PSTATE 字段的直接读写访问。所有其他 PSTATE 字段没有直接读写访问。
RBRSMZ 软件可以使用 MSR(立即数)指令直接写入 PSTATE.{D, A, I, F, SP, PAN, UAO, DIT, SSBS, TCO, ALLINT, PM, SM, ZA}。
RLDXKJ 以下 PSTATE 字段可以在 EL0 级别访问:
- PSTATE.{N, Z, C, V, SSBS, DIT, TCO, SM, ZA}。
- 如果 SCTLR_EL1.UMA 为 1,且 HCR_EL2.{E2H, TGE} 的有效值不是 {1, 1},则可以访问 PSTATE.{D, A, I, F}。
- PSTATE.{SM, ZA} 访问指令可以在 EL0 或更高级别执行。
- 所有其他 PSTATE 访问指令可以在 EL1 或更高级别执行,在 EL0 为未定义(UNDEFINED)。
译者注: EL(Exception Level,异常级)是 ARMv8/AArch64 架构中的特权级别概念,EL0 为最低特权级(通常用于用户态应用),EL1 通常为操作系统内核级别,EL2 支持虚拟化,EL3 为安全世界与普通世界间的切换层。PSTATE 字段的访问受异常级约束,这体现了 ARM 架构的安全分层设计。
RHXYGT 对 PSTATE 字段的写入会对 PE(处理元件)操作的各个方面产生副作用。对于因写入 PSTATE 字段而产生的副作用,以下所有条件均成立:
- 副作用保证对执行流中更早的指令不可见。
- 副作用保证对执行流中更晚的指令可见。
- 可能发生其他副作用,但不保证。
译者注: 这段描述了 PSTATE 写入的可见性语义——即写入 PSTATE 的效果何时对后续指令可见。这对于异常处理、状态切换等场景至关重要,确保了程序状态的正确性和可预测性。
D1.6 复位和电源域(Resets and power domains)
D1.6 复位和电源域
IDQXXZ PE逻辑被划分为一个调试电源域(Debug power domain)和一个核心电源域(Core power domain)。冷复位(cold reset)和热复位(warm reset)复位核心电源域中的元素。外部调试复位(External debug reset)可以复位调试电源域。还可能实现其他复位。
D1.6.1 电源域和复位域
RJMTZY 架构定义了以下电源域:
- 核心电源域(Core power domain)。
- 调试电源域(Debug power domain)。
- 系统计数器电源域(system counter power domain)。
- 如果实现了跟踪功能,则为跟踪单元(Trace Unit)提供一个电源域。
- 如果实现了FEAT_RAS,则可能有一个或多个实现定义(IMPLEMENTATION DEFINED)的错误恢复电源域。这些电源域与其他电源域之间的关系是实现定义的。对于与PE关联的错误记录,这与核心电源域相同。
- 如果实现了FEAT_AMUv1,则为AMU(Activity Monitors Unit)提供一个电源域。
- 对于MPAM存储器系统组件(MSC),为每个MSC提供一个电源域。
IQBPTS 电源域被描述为逻辑电源域,因为架构不要求两个物理电源域。
RPDMKB 每个电源域是独立上电和下电,还是一起上电和下电,是由实现定义的。
RZDVQQ 核心电源域包含:
- 非调试寄存器和逻辑。
- 自托管调试寄存器和逻辑。
- 共享调试寄存器和逻辑。
- 一些外部调试寄存器和逻辑。
RGTVLN 调试电源域包含:
- PE与外部调试器之间的接口。
- 一些外部调试寄存器。
RMLXWM 如果外部调试器连接到PE,调试电源域必须上电。
IKTSWK 有关外部调试接口寄存器访问权限的更多信息,请参阅外部调试接口寄存器的访问权限或各寄存器描述。
D1.6.2 复位类型
IHDQLB 架构定义了以下复位:
- 热复位(Warm reset)。
- 冷复位(Cold reset)。
- 外部调试复位(External Debug reset)。
- 跟踪单元复位。请参阅跟踪单元的复位。
- 计时器复位。
- 如果实现了FEAT_RAS,则可能有一个或多个实现定义的错误恢复复位。这些复位与其他复位之间的关系是实现定义的。对于与PE关联的错误记录,错误恢复复位与热复位相同。
- 如果实现了FEAT_AMUv1,则为AMU复位。
- 对于MPAM存储器系统组件(MSC),为每个MSC提供一个复位。
IFMTCY 其他复位是实现定义的,可以映射到架构定义的复位上。
RPXXYQ 断言复位的机制(RMR_ELx除外)是实现定义的。一种这样的机制是EDPRCR.CWRR。任何软件可以命令的复位断言机制(包括直接暴露给软件的硬件机制)必须只能从最高异常级别(Exception level)访问。
译者注: RMR_ELx是Reset Management Register,位于ELx级别,用于请求热复位或冷复位。EDPRCR.CWRR是External Debug Processor Control Register中的一位,用于请求热复位。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.6 Resets and power domains
RHLDGD 当冷复位被断言时,对于核心电源域中的每个寄存器,复位将该寄存器设置为其架构定义的复位值。
RPJXVL 当热复位被断言时,核心电源域中受热复位影响的寄存器和逻辑被复位到其架构定义的复位值。仅被冷复位复位的寄存器和逻辑不受热复位影响。
RNBKHK 当外部调试复位被断言时,外部调试复位域被复位,受影响的寄存器被设置为其架构定义的外部调试复位值。冷复位域不受影响。
RRKSZM 当冷复位被断言时,热复位也会被断言。
IVBZBW 每个具有存储空间的寄存器字段恰好属于一个复位域。每个系统寄存器字段定义都定义了复位域和复位值。
IMWTXK 如果RMR_ELx被实现,向RMR_ELx.RR写入1请求热复位。
RSGXSW 向RMR_ELx.RR写入1只是对热复位的请求。除非执行以下代码序列,否则不能保证复位会发生:
- 此外,在运行此序列之前,应在该PE的系统范围内禁用中断和调试请求,以确保WFI暂停执行:
- MOV Wy, #3(对于AArch64,#2对于AArch32),y是任意寄存器
- DSB(确保所有存储等操作完成)
- MSR RMR_ELx, Wy(请求复位)
- ISB(同步对RMR的更改)
Loop - WFI(进入静止状态)
- B Loop
译者注: RMR_ELx.RR(Reset Request)位用于请求热复位。该代码序列确保在请求复位前所有待处理的操作都已完成,并且处理器处于可安全复位的状态。
RDDTVZ 热复位是否可以不使用RMR_ELx而被断言是实现定义的。
ILWNDC Arm建议热复位可以独立于冷复位被断言。
IQLZGF 热复位允许在核心电源域PE逻辑复位后进行调试。
RSKGMH 外部调试复位和冷复位是否可以独立地被断言是实现定义的。
IWTJYS Arm建议当实现独立的核心电源域和调试电源域时,外部调试复位和冷复位可以独立地被断言。
D1.6.3 复位行为
ITWYCF 复位后,PE状态的很大一部分在架构上是未知的(UNKNOW)。然而,部分PE状态是已定义的,请参阅各寄存器描述以获取更多信息。被复位为已知值的状态足以允许在最高异常级别进行可预测的初始执行,且该执行能够在此后根据需要初始化系统的剩余状态后再使用。
译者注: 这意味着复位后处理器可以立即执行某些初始化代码,无需先配置内存管理单元(MMU)等。
RJYLQV 当冷复位或热复位被断言时,会发生以下所有情况:
- PE进入已实现的最高异常级别。
- 选择最高已实现异常级别的栈指针SP_ELx。
RZBHGJ 当冷复位或热复位被解除断言时,执行从实现定义的地址开始,位于物理地址(PA)范围内的任意位置。与最高已实现异常级别关联的RVBAR(RVBAR_EL1、RVBAR_EL2或RVBAR_EL3)保存PE开始执行处的地址。
译者注: RVBAR(Reset Vector Base Address Register)保存复位向量基地址。
IQSCPY 当冷复位或热复位被解除断言时,PE开始执行的实现定义地址通常由PE的硬连线配置或配置输入信号设置。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.6 Resets and power domains
RRRJLM 当热复位被断言时,以下所有内容在架构上都是未知的:
- 所有通用寄存器、SVE、SIMD和浮点寄存器。
- PE的全局独占监视器。
- PE的本地独占监视器。
- 具有架构未知复位值的系统和特殊用途寄存器。
IKWHDG 当冷复位或热复位被断言时,PSTATE.{SS, IL, nRW, EL, SP, D, A, I, F, DIT, EXLOCK, ZA, SM, PACM, UINJ}字段被设置为已知值。
译者注: PSTATE是处理器状态寄存器,这些字段包括: SS(Software Step,软件单步)、IL(Illegal Execution state,非法执行状态)、nRW(Not-Root World,用于Realm Management)、EL(Exception Level,异常级别)、SP(Stack Pointer,栈指针选择)、D/A/I/F(Debug、Async Abort、IRQ、FIQ中断掩码)、DIT(Data Independent Timing,数据独立时序)、EXLOCK(Exception Lock,复位锁定)、ZA(Zero Address,零地址)、SM(Stack Mixer,栈混合器)、PACM(Pointer Authentication Code Modifier,指针认证码修饰符)、UINJ(Unmasked Interrupt injection,未屏蔽中断注入)。
RBGSHC 当冷复位或热复位被断言时,TLB和缓存在实现定义的状态。
RXNNNH 当冷复位或热复位已被断言且在启用内存管理系统之前,可能需要通过实现定义的无效化序列来使TLB、缓存或两者无效。
RTZHFZ 当冷复位或热复位已被断言且在允许对可缓存的正常内存访问之前,可能需要通过实现定义的无效化序列来使TLB、缓存或两者无效。
RKMCGN 如果实现了实现定义的复位,每个实现定义的复位可以不同地处理缓存和TLB状态。
RTJGFQ 如果实现了实现定义的复位,对于每个实现定义的复位,TLB、缓存或两者可能需要不同的实现定义的无效化序列。
IPHDMZ 实现定义的无效化序列可能是空操作(NOP)。
D1.6.3.1 复位时外部调试对寄存器的访问
RVFMKQ 如果外部调试复位被断言,对于每个可由外部调试接口访问的寄存器,外部调试接口的寄存器访问具有以下实现定义的结果之一:
- 外部调试接口可以访问该寄存器,访问结果是实现定义的。
- 外部调试接口不能访问该寄存器。
IQHHMQ 如果冷复位或热复位中的任一个被断言,寄存器或寄存器字段的访问可能是直接访问,也可能是访问的间接副作用。
RYKRBF 如果冷复位或热复位中的任一个被断言,外部调试接口对寄存器或寄存器字段的访问具有以下效果:
| 访问类型 | 寄存器或寄存器字段的复位行为 | 对寄存器或寄存器字段的影响 |
|---|---|---|
| 写入 | 被该复位信号复位 | 设置为受限不可预测(CONSTRAINED UNPREDICTABLE)选择:复位值或写入值 |
| 写入 | 不被该复位信号复位 | 设置为写入的值 |
| 读取 | 被该复位信号复位 | 返回未知值 |
| 读取 | 不被该复位信号复位 | 返回寄存器或寄存器字段的值 |
译者注: CONSTRAINED UNPREDICTABLE是ARM架构中定义的一组可能的行为,具体的实现必须在架构允许的范围内。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.7 进入低功耗状态的机制
D1.7 进入低功耗状态的机制(Mechanisms for entering a low-power state)
D1.7 进入低功耗状态的机制(Mechanisms for entering a low-power state)
IRTNZD 架构提供了以下机制,软件可使用这些机制来指示PE可以进入低功耗状态:
• Wait for Event(等待事件)。
• Wait for Interrupt(等待中断)。
D1.7.1 Wait for Event(等待事件机制)
IZZQGW Wait for Event(等待事件)机制的行为取决于以下所有因素的相互作用:
• PE的事件寄存器(Event Register)。参见事件寄存器(The Event Register)。
• Wait for Event(WFE)或 Wait for Event with Timeout(WFET)指令。参见 Wait for Event 和 Wait for Event with Timeout 指令(The Wait for Event and Wait for Event with Timeout instructions)。
• WFE唤醒事件。参见 AArch64 状态下的 WFE 唤醒事件(WFE wakeup events in AArch64 state)。
• 可引发 WFE 唤醒事件的 Send Event 指令 SEV 和 SEVL。参见 Send Event 指令(The Send Event instructions)。
RTJTFC 架构没有定义 WFE 或 WFET 进入的低功耗状态的确切性质,只是规定当执行 WFE 或 WFET 指令时,内存一致性和架构状态不会丢失。
IWBMQQ Wait for Event 机制与在 PE 上暂停执行以节省功耗相关,因此 Arm 建议事件寄存器的设置频率较低。软件必须仅将事件寄存器的设置作为提示,不能假设事件寄存器的设置会导致发送任何特定消息。
D1.7.1.1 事件寄存器(The Event Register)
RPVKKP 事件寄存器是每个 PE 的一个单比特寄存器。
ITZVVM 事件寄存器是一个概念性寄存器,无法被显式访问。
IPDJMB 如果事件寄存器为 1,则表示自上次清除该寄存器以来已发生一个事件,并且该事件可能需要 PE 执行某些操作。
RRJYVC 当 PE 执行 WFE 或 WFET 指令时,以下条件均适用:
• 如果事件寄存器为 0,则 PE 可以进入低功耗状态。
• 如果事件寄存器为 1,则以下所有条件适用:
— PE 不会暂停操作。
— 事件寄存器被清除为 0。
— WFE 或 WFET 指令立即完成。
RDDGLZ 事件寄存器的复位值是 UNKNOWN(未知)。
RXRZRK PE 的事件寄存器可通过以下任一方式设置:
• 由系统中任何 PE 执行的 Send Event 指令(SEV)。
• 由该 PE 执行的 Send Event Local 指令(SEVL)。
• 异常返回。
• 清除该 PE 的全局监视器(global monitor)。
• 来自 Generic Timer 事件流的事件,参见事件流(Event streams)。
• 通过某些 IMPLEMENTATION DEFINED(实现定义)机制发送的事件。
IPJZBB 事件寄存器只能通过 Wait for Event(WFE)指令或 Wait for Event with Timeout(WFET)指令清除。
IZXJPD 软件无法直接读取或写入事件寄存器的值。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.7 Mechanisms for entering a low-power state
D1.7.1.2 Wait for Event 和 Wait for Event with Timeout 指令(The Wait for Event and Wait for Event with Timeout instructions)
RQRXWZ 如果 FEAT_WFxT 已实现,则会实现 Wait for Event with Timeout(WFET)指令。
RCSKPF 如果事件寄存器为 0,当执行 WFE 或 WFET 指令时,PE 可以暂停执行并进入低功耗状态。
RGZZQM 如果 PE 进入低功耗状态,PE 将保持低功耗状态直到以下任一情况发生:
• PE 检测到 WFE 唤醒事件。
• 一个 IMPLEMENTATION DEFINED 唤醒事件,该事件在架构上允许随时发生。
• 复位被置位。
IQGHTM 架构允许以下所有情况:
• 允许 PE 以任何原因退出低功耗状态。
• 允许将 WFE 视为 NOP,但这对于最低功耗操作不推荐。
RSLQVQ 如果 PE 处于低功耗状态,当 PE 检测到 WFE 唤醒事件时,或更早(如果实现选择),WFE 或 WFET 指令完成。如果唤醒事件设置了事件寄存器,则当重新启动执行时,事件寄存器的状态是 IMPLEMENTATION DEFINED。
IDRSJV 使用 Wait for Event 机制的软件必须容忍虚假的唤醒事件,包括多个唤醒事件。
D1.7.1.3 WFE 和 WFET 的陷入(Trapping of WFE and WFET)
IKMHTB WFE 和 WFET 指令在所有异常级别(Exception Level)均可使用。在 EL0、EL1 或 EL2 执行软件的进入低功耗状态的尝试可以被配置为陷入更高的异常级别。
RJWKTL 如果实现了 FEAT_TWED,则以下所有条件适用:
• 可以配置在发生 WFE 或 WFET 陷入之前引入延迟。
• 如果配置了 WFE 或 WFET 陷入前的延迟,则该延迟不影响陷入的优先级。
IRDYQK 例如,如果执行由于 SCTLR_EL1.nTWE 为 0 且 HCR_EL2.TWE 为 1 而受到 EL1 处的陷入,则唯一会发生的陷入是陷入 EL1,即使 EL1 处的延迟比 EL2 处的延迟更长。
D1.7.1.4 AArch64 状态下的 WFE 唤醒事件(WFE wakeup events in AArch64 state)
IRJRLR 在本节中,AllIntMask 指的是 RXZPDT 中描述的值。
ILRPVP 如果 WFE 或 WFET 指令使 PE 进入低功耗状态,则 PE 接收到的 WFE 唤醒事件会导致该 PE 退出低功耗状态。
RKBMFC 以下所有事件均为 WFE 唤醒事件:
• 在多处理器系统中的任何 PE 上执行 SEV 指令。
• PE 接收到的任何物理 SError 异常、物理 IRQ 中断或物理 FIQ 中断,且该中断未被 EDSCR.INTdis 禁用,并且以下任一条件为真:
— 该中断在异步异常屏蔽(Asynchronous exception masking)表格中标记为 A,而不考虑相应 PSTATE.{A, I, F} 屏蔽比特的值。
— 该中断在异步异常屏蔽表格中标记为 B,并且以下任一条件为真:
— 相应 PSTATE.{A, I, F} 屏蔽比特的值为 0。
— AllIntMask 为 0 且 IRQ 或 FIQ 中断具有超级优先级(Superpriority)。
参见 RMHWBP 和 RGFXKY。
• 如果以下所有条件适用,则为 PE 接收到的任何虚拟 SError 异常、虚拟 IRQ 中断或虚拟 FIQ 中断:
— PE 正在 EL1 或 EL0 执行。
— 该中断未被 EDSCR.INTdis 禁用。
— 该中断或异常在虚拟异步异常屏蔽(Virtual asynchronous exception masking)表格中标记为 B,并且以下任一条件为真:
— 相应 PSTATE.{A, I, F} 屏蔽比特的值为 0。
— AllIntMask 为 0 且 vIRQ 或 vFIQ 中断具有超级优先级。
参见 RSNLJH 和 RXSPSG。
• 如果以下所有条件适用,则为 PE 接收到的任何委托 SError 异常(delegated SError exception):
— PE 正在 EL2、EL1 或 EL0 执行。
— 该异常未被 EDSCR.INTdis 禁用。
— 以下任一条件为真:
— 该异常在委托 SError 异常屏蔽(Delegated SError exception masking)表格中标记为 A。
— 该异常在委托 SError 异常屏蔽表格中标记为 B 且 PSTATE.A 为 0。
• 如果允许停机(halting is allowed),则为异步外部调试请求调试事件(asynchronous External Debug Request debug event)。关于停机的定义,参见允许停机(Halting allowed and halting prohibited)和外部调试请求调试事件(External Debug Request debug event)。
• 由 PE 的计时器事件流发送的事件。参见事件流(Event streams)。
• 由清除 PE 的全局监视器引起的事件。
• 由某些 IMPLEMENTATION DEFINED 机制发送的事件。
• 当实现了 FEAT_WFxT 时,对于 WFET 指令,由虚拟计数阈值(以 CNTVCT_EL0 表示)相等或超过引起的本地超时事件(local timeout event)。
IFRZZX RKBMFC 中的唤醒事件并非全部都会设置事件寄存器。
D1.7.1.5 Send Event 指令(The Send Event instructions)
RDQRMZ Send Event 指令包括:
• SEV(Send Event):向多处理器系统中的所有 PE 发送事件信号。
• SEVL(Send Event Local):在本地发送事件信号,无需将事件信号发送到多处理器系统中的其他 PE。
IFVQBK SEVL 指令可能通过 IMPLEMENTATION DEFINED 机制向其他 PE 发送事件信号,但并非必须这样做。
RHTDFW 向其他 PE 发送事件的机制是 IMPLEMENTATION DEFINED。
RRLHHM 当通过 SEV 指令发送事件时,该事件相对于 SEV 指令之前指令的内存访问完成的顺序是无法保证的。
IDVZXD Arm 建议软件在任何 SEV 指令之前包含 DSB 指令。DSB 指令确保在 DSB 指令完成之前,位于 DSB 指令程序顺序之后的任何指令(包括任何 SEV 指令)都不能执行。参见数据同步屏障(Data Synchronization Barrier)。
RQJDQV SEVL 指令相对于在同一 PE 上执行的任何后续 WFE 或 WFET 指令,似乎是按程序顺序执行的。
IHWHBP RQJDQV 中的行为无需任何显式插入屏障指令即可适用。
D1.7.2 Wait for Interrupt 机制(Wait for Interrupt mechanism)
ILMJGQ PE 可以使用 Wait for Interrupt 机制进入低功耗状态。
RJHZBN 当实现了 FEAT_WFxT 时,Wait for Interrupt with Timeout(WFIT)指令会被实现。
RDBXLJ 软件可以使用 Wait for Interrupt(WFI)和 Wait for Interrupt with Timeout(WFIT)指令使 PE 进入低功耗状态。
RHSPJD 如果 Wait for Interrupt(WFI)和 Wait for Interrupt with Timeout(WFIT)指令使 PE 进入低功耗状态,PE 将保持该低功耗状态直到以下任一情况发生:
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.7 Mechanisms for entering a low-power state
• PE 检测到 WFI 唤醒事件。
• 一个 IMPLEMENTATION DEFINED 唤醒事件,该事件在架构上允许随时发生。
• 复位被置位。
IMFLXH 架构允许以下所有情况:
• 允许 PE 以任何原因退出低功耗状态。
• 允许将 WFI 视为 NOP,但这对于最低功耗操作不推荐。
RMRVLC 当 PE 退出因 WFI 或 WFIT 指令而进入的低功耗状态时,WFI 或 WFIT 指令完成。
RHJPJY 除以下情况外,架构没有定义低功耗状态的确切性质:
• 当执行 WFI 或 WFIT 指令时,架构要求不丢失内存一致性。
• 如果系统配置使得 WFI 或 WFIT 指令可以完成,则架构要求不丢失架构状态。
IWWYXS 在某些实现中,基于系统特定寄存器的配置,WFI 可以用作断电序列的一部分,在该序列中不会有中断导致 WFI 唤醒事件,而恢复供电涉及 PE 的复位。在这种情况下,允许 WFI 导致架构状态丢失,因为假定该状态已在 WFI 之前的断电序列中被软件保存。
ICHMWP WFI 和 WFIT 指令在所有异常级别均可使用。在 EL0、EL1 或 EL2 执行软件的进入低功耗状态的尝试可以被配置为陷入更高的异常级别。
D1.7.2.1 WFI 唤醒事件(WFI wakeup events)
ICYKVZ 在本节中,AllIntMask 指的是 RXZPDT 中描述的值。
RVRLPB 以下所有事件均为 WFI 唤醒事件:
• PE 接收到的任何物理 SError 异常、物理 IRQ 中断或物理 FIQ 中断,该中断在异步异常屏蔽表格中标记为 A 或 B,而不考虑相应 PSTATE.{A, I, F} 屏蔽比特的值。
• 如果 PE 正在 EL1 或 EL0 执行,则为 PE 接收到的任何虚拟 SError 异常、虚拟 IRQ 中断或虚拟 FIQ 中断,该中断在虚拟异步异常屏蔽表格中标记为 B,而不考虑相应 PSTATE.{A, I, F} 屏蔽比特的值。
• 如果 PE 正在 EL2、EL1 或 EL0 执行,则为 PE 接收到的任何委托 SError 异常,该异常在委托 SError 异常屏蔽表格中标记为 A 或 B,而不考虑 PSTATE.A 的值。
• 如果允许停机,则为异步外部调试请求调试事件。关于停机的定义,参见允许停机和外部调试请求调试事件。
• 由 IMPLEMENTATION DEFINED 机制发送的事件。
• 当实现了 FEAT_WFxT 时,对于 WFIT 指令,由虚拟计数阈值(以 CNTVCT_EL0 表示)相等或超过引起的本地超时事件。
RNLVGY WFI 唤醒事件从不被 EDSCR.INTdis 禁用,也从不被 PSTATE.{A, I, F} 屏蔽比特或 AllIntMask 的状态屏蔽。如果通过被禁用或屏蔽的中断调用唤醒,则不会触发该中断。
IVCDGW 由于调试事件是 WFI 唤醒事件,Arm 建议将 Wait for Interrupt 作为空闲循环的一部分使用,而不是等待单个特定中断事件发生然后继续前进。这确保了在等待时调试器的干预不会显著改变被调试程序的功能。
IFXRXC 如果 PE 在发生 PMU 捕获事件时处于 WFx 状态,则必须唤醒以服务该请求。Arm 建议不将捕获事件视为 IMPLEMENTATION DEFINED 的 WFx 唤醒事件,并且 PE 之后应返回待机状态。参见 PMU 快照(PMU snapshots)。
IZQWXZ 架构不要求 WFI 机制在暂停执行之前排出任何待处理的内存活动,软件不能依赖 WFI 机制以这种方式运行。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.7 Mechanisms for entering a low-power state
D1.7.3 待处理的性能分析异常(Pending Profiling exceptions)
IWNMSV 待处理的异步性能分析异常(Profiling exception)不一定是 WFE 唤醒事件或 WFI 唤醒事件。Arm 建议将待处理的未屏蔽异步性能分析异常视为 IMPLEMENTATION DEFINED 唤醒事件,以允许及时处理性能分析事件。例如,如果需要软件从系统中收集其他遥测数据。但是,如果性能分析异常在 PE 进入低功耗 WFx 状态时变为待处理,则 PE 可能在进入 WFx 状态之前没有注册待处理的性能分析异常。在使用 PMU、SPE 或 TRBE 中断时也存在类似情况,因为 PE 必须在其进入 WFx 状态之前已向中断控制器发出中断请求,才能成为唤醒事件。这是由于 IMPLEMENTATION SPECIFIC 的时序决定的,这些时序决定了性能分析事件是导致 WFx 唤醒还是阻止 PE 进入 WFx 状态。
IVPTQY 在 IWNMSV 中,”待处理”意味着,如果性能分析异常未被屏蔽,则通过简单顺序执行程序,在执行下一条指令之前,将捕获该性能分析异常。
D1.7.4 使用 WFI 指示总线接口上的空闲状态(Using WFI to indicate an idle state on bus interfaces)
RTZPSV 当以下所有条件为真时,可以完成进入断电状态的 IMPLEMENTATION DEFINED 机制:
• IMPLEMENTATION DEFINED 机制强制 PE 处于静止状态(quiescence)。
• IMPLEMENTATION DEFINED 机制阻止任何可能的 WFI 唤醒事件。
RVWDWJ 进入断电状态的机制是 IMPLEMENTATION DEFINED。
IFFGGG 尽管进入断电状态的机制是 IMPLEMENTATION DEFINED,但 WFI 和 WFE 机制常被用于进入断电状态。
RRMBKR 如果实现了 WFI 断电机制,则当执行 WFI 或 WFIT 指令时,PE 完成所有当前操作,任何相关的总线活动也会完成。当所有当前 PE 操作和相关总线活动完成时,PE 可以向外部电源控制器发信号,表明没有正在进行的总线活动。
RCLTZY 执行 WFI 指令后,所有当前执行的指令和相关总线活动已完成,PE 正在等待中断并处于空闲状态。如果处于空闲状态,PE 可以处理对调试寄存器的内存映射或外部调试接口访问。
ICYBLG 向系统指示空闲状态通常仅适用于 PE 使用的非调试功能接口,而不适用于调试接口。
RDHHKY 如果 OSDLR_EL1.DLK 为 1,则 PE 不会向控制逻辑发信号指示空闲状态,除非它还能保证调试接口处于空闲状态。关于 OS Double Lock 的更多信息,参见调试行为当 OS Double Lock 被锁定时(Debug behavior when the OS Double Lock is locked)。
IWRZGC 在实现了独立 Core 和 Debug 电源域的 PE 中,本节中提到的调试接口是 Core 和 Debug 电源域之间的接口,因为向电源控制器发信号表明 Core 电源域处于空闲状态。关于电源域的更多信息,参见电源域和调试(Power domains and debug)。
IRFLDH 调试接口的确切性质是 IMPLEMENTATION DEFINED,但由于 Wait for Interrupt 是唯一在架构上定义的完全暂停执行的机制,因此它适合作为首选的断电入口机制。
M.b Non-Confidential
The AArch64 System Level Programmers’ Model
D1.8 Self-hosted debug
译者注:
- Event Register(事件寄存器) 是一个概念性的一比特寄存器,用于协调多处理器系统中的低功耗状态进入和唤醒事件。它不能被软件直接访问。
- WFE(Wait for Event) 和 WFET(Wait for Event with Timeout) 指令用于让 PE 进入等待事件的低功耗状态,当事件寄存器为 0 时生效。
- WFI(Wait for Interrupt) 和 WFIT(Wait for Interrupt with Timeout) 指令用于让 PE 进入等待中断的低功耗状态,是一种更彻底的暂停执行机制。
- SEV(Send Event) 和 SEVL(Send Event Local) 是向其他 PE 发送唤醒事件的指令。
- DSB(Data Synchronization Barrier) 指令用于确保在继续执行之前完成所有内存访问。
- AllIntMask 是一个综合屏蔽状态,影响中断的处理方式。
- Superpriority(超级优先级) 是中断优先级的特殊级别,在特定条件下可以覆盖常规屏蔽。
- PMU(Performance Monitor Unit) 和 SPE(Statistical Profiling Extension) 等性能分析相关的中断在 WFx 状态下的行为需要特别关注。
D1.8 自托管调试(Self-hosted debug)
D1.8 自托管调试
| 标签ID | 内容 |
|---|---|
| IMJGPY | 该架构支持以下两种调试方式: |
| 自托管调试(Self-hosted debug) | |
| PE 本身托管调试器。调试器对 PE 进行编程以生成调试异常。调试异常在 ARM 异常模型中得到支持。 | |
| 外部调试(External debug) | |
| PE 由外部调试器控制。调试器对 PE 进行编程以生成调试事件,使 PE 进入调试状态。在调试状态下,PE 处于停止(halted)状态。 |
译者注: 自托管调试与外部调试是ARM架构支持的两种调试模式。自托管调试的调试器运行在PE本身内部(例如操作系统内置的调试器),而外部调试则由连接到处理器的外部调试器控制(如JTAG调试器)。两种模式的主要区别在于控制权归属和PE状态的保持方式。
D1.8.1 调试异常(Debug exceptions)
| 标签ID | 内容 |
|---|---|
| IPWPHY | 如果调试器已对 PE 进行编程以生成调试异常,则调试异常会在正常程序执行过程中发生。 |
| IDSWBH | 例如,软件开发者可能使用操作系统中包含的调试器来调试应用程序。为此,调试器可能会启用一个或多个调试异常。 |
| IBXVCF | 调试异常包括以下所有类型: |
| • 断点指令异常(Breakpoint Instruction exceptions) | |
| • 断点异常(Breakpoint exceptions) | |
| • 监视点异常(Watchpoint exceptions) | |
| • 向量捕获异常(Vector Catch exceptions) | |
| • 软件单步异常(Software Step exceptions) | |
| IVYKHK | PE 只能在其满足以下所有条件时才能生成特定的调试异常: |
| • 调试异常从当前异常级别(Exception level)和安全状态(Security state)启用。请参阅”从当前异常级别和安全状态启用调试异常”。断点指令异常始终从当前异常级别和安全状态启用。 | |
| • 调试器已启用该特定调试异常。除断点指令异常外的所有调试异常都在 MDSCR_EL1 中包含启用控制位。请参阅”调试异常启用控制”。 | |
| IGRWSG | 断点和监视点可能导致进入调试状态,而不是引发调试异常。请参阅”关于外部调试”。 |
译者注: 调试异常与外部调试事件(debug events)的区别值得注意:当断点或监视点被配置为产生调试事件时,PE会进入调试状态并停止运行;而当它们被配置为产生调试异常时,异常会被送到异常处理程序处理。MDSCR_EL1(Monitor Debug Status and Control Register)是控制这些行为的关键寄存器。
D1.8.2 PSTATE 调试掩码位 D(The PSTATE debug mask bit, D)
| 标签ID | 内容 |
|---|---|
| RDYRLS | 调试异常掩码位 PSTATE.D 可以屏蔽监视点、断点和软件单步异常,如果目标异常级别是当前异常级别的话。 |
| RRDYDM | 如果处于 AArch64 状态且调试异常的目标异常级别低于当前异常级别,则该调试异常被屏蔽。 |
| RJWZFQ | 如果目标异常级别高于当前异常级别,则调试异常不会被 PSTATE.D 屏蔽。 |
| RKCHGM | 如果 PSTATE.D 为 1 且 PE 已在 AArch64 状态下处理异常,则监视点、断点和软件单步异常被屏蔽。 |
| ILVYYH | 如果已在处理异常,屏蔽可以防止软件生成另一个异常实例,并防止递归进入异常处理程序和返回状态的丢失。 |
| RNCHXS | 使用 PSTATE.D 屏蔽调试中断可以防止生成新的调试异常,因此,如果之后 PSTATE.D 被设置为 0,任何被屏蔽的调试异常都不会被触发。 |
| IVSTYD | RNCHXS 中描述的行为与中断的行为不同,中断的 PSTATE.{A, I, F} 掩码会阻止中断被触发,但中断保持待处理(pending)状态。 |
| IKWFMZ | 当发生异常时,PSTATE.D 被设置为 1。 |
译者注: PSTATE.D 是 AArch64 状态下的调试掩码位,用于控制是否屏蔽调试异常。与普通中断掩码位(PSTATE.{A, I, F})的行为不同:普通中断被屏蔽后会保持待处理状态,等待掩码被清除后仍然会被触发;而调试异常被屏蔽后则直接丢失,不会”记住”等待处理。这是考虑到调试场景的特殊性——如果已经在处理某个异常期间再次触发相同的调试异常,会导致返回状态丢失,因此选择直接屏蔽而非保持待处理。
D1.9 事件监视器(Event monitors)
D1.9 Event monitors
IYVDTB 架构支持以下非侵入式架构组件,用于事件监视:
- 性能监视器(Performance Monitors):性能监视器具有广泛的功能集、灵活的计数事件选择,并且支持读写操作。
- 活动监视器(Activity Monitors):活动监视器具有狭窄的功能集、有限的计数事件选择,并且仅支持读操作。
D1.9.1 性能监视器扩展(The Performance Monitors Extension)
IZSPVV 系统寄存器提供对性能监视单元(PMU)的访问,定义为架构的可选性能监视器扩展,这是一种非侵入式调试资源,提供关于 PE 操作的信息。
PMU 提供:
- 一个 64 位周期计数器。
- 实现定义数量的事件计数器。如果实现了 FEAT_PMUv3p5,则事件计数器为 64 位无符号计数器;否则,事件计数器为 32 位事件计数器。每个事件计数器可以配置为计数指定事件的发生次数。可计数的事件包括:
- 架构和微架构事件,这些事件可能在许多微架构中保持一致。PMU 架构使用事件编号来识别事件,PMU 规范定义了对每个这些架构和微架构事件必须使用的事件编号。
- 实现特定事件。PMU 规范为实现特定事件保留了事件编号。
- 一个可选的 64 位指令计数器。
更多信息参见《性能监视器扩展》(The Performance Monitors Extension)。
D1.9.2 活动监视器扩展(The Activity Monitors Extension)
IPCKDC 如果实现了可选的活动监视器扩展,系统寄存器提供对活动监视器单元(AMU)的控件和计数器的访问。
更多信息参见《活动监视器扩展》(The Activity Monitors Extension)。
D1.10 交互处理(Interprocessing)
RFKKJY 在AArch64执行状态与AArch32执行状态之间进行切换称为交互处理(interprocessing)。
RNKBQL 执行状态只能在异常级别(Exception level)变更时发生变化。
IWNJBK 因此,执行状态只能在以下情况下发生变化:向更高异常级别引发异常,或从异常返回至更低异常级别。对于在同一异常级别引发的异常或从同一异常级别返回的情况,执行状态不能发生变化。
RGLNVF 向更高异常级别引发异常时,执行状态为以下其中之一:
- 保持不变。
- 从AArch32状态更改为AArch64状态。
RKTCXV 从异常返回至更低异常级别时,执行状态为以下其中之一:
- 保持不变。
- 从AArch64状态更改为AArch32状态。
D1.10.1 AArch32状态与AArch64状态之间的寄存器映射(Register mappings between AArch32 state and AArch64 state)
IXVDJR AArch32状态与AArch64状态之间的寄存器映射用于描述以下内容:
- 对于从AArch32状态引发至AArch64状态的异常,AArch32寄存器内容被保存在何处。
- 对于从AArch64状态异常返回至AArch32状态,AArch32寄存器内容如何被推导。
RPCCLL AArch32状态寄存器内容占用AArch64状态寄存器的低32位。
RCTBNQ 如果处于AArch32状态,AArch64状态寄存器的更高32位不可访问且被忽略。
RGMLYF 对于未映射到AArch32寄存器的AArch64寄存器位[63:32],未映射位在AArch32状态执行时保持不变。
D1.10.1.1 执行状态之间通用寄存器的映射(Mapping of the general-purpose registers between the Execution states)
IPYKVS 下表展示了执行状态之间通用寄存器的映射关系:
| AArch32寄存器 | AArch64寄存器 |
|---|---|
| R0 | X0 |
| R1 | X1 |
| R2 | X2 |
| R3 | X3 |
| R4 | X4 |
| R5 | X5 |
| R6 | X6 |
| R7 | X7 |
| R8_usr | X8 |
| R9_usr | X9 |
| R10_usr | X10 |
| R11_usr | X11 |
| R12_usr | X12 |
| AArch32寄存器 | AArch64寄存器 |
|---|---|
| SP_usr | X13 |
| LR_usr | X14 |
| SP_hyp | X15 |
| LR_irq | X16 |
| SP_irq | X17 |
| LR_svc | X18 |
| SP_svc | X19 |
| LR_abt | X20 |
| SP_abt | X21 |
| LR_und | X22 |
| SP_und | X23 |
| R8_fiq | X24 |
| R9_fiq | X25 |
| R10_fiq | X26 |
| R11_fiq | X27 |
| R12_fiq | X28 |
| SP_fiq | X29 |
| LR_fiq | X30 |
IJCWRB 对于某些异常,ESR_ELx中给出的异常综合征识别了引发该异常的执行指令中的一个或多个寄存器编号。如果这些异常是从使用AArch32的异常级别引发的,则寄存器编号给出的是寄存器的AArch64视图。
IVSFBC 例如,如果异常是从AArch32中止模式引发的,且故障指令指定了R14,则ESR_ELx.ISS字段将使用EC值0b10100报告此情况,因为寄存器X20提供了LR_abt的AArch64视图,而LR_abt是在中止模式下使用的R14副本。
D1.10.1.2 执行状态之间SIMD和浮点寄存器的映射(Mapping of the SIMD and floating-point registers between the Execution states)
IDPNRF 下表展示了执行状态之间SIMD和浮点寄存器的映射关系:
| AArch32寄存器 | AArch64寄存器 |
|---|---|
| V0 | Q0 |
| V1 | Q1 |
| V2 | Q2 |
| . | . |
| . | . |
| . | . |
| V15 | Q15 |
RTJJVC AArch64状态寄存器V16-V31不能从AArch32状态访问。
IVTZXL AArch64状态中V、D和S寄存器之间的映射与AArch32状态中Q、D和S寄存器之间的映射不同。
RVSTPQ 在AArch64状态中,存在:
- 32个128位V寄存器,V0-V31。
- 32个64位D寄存器,D0-D31。
- 32个32位S寄存器,S0-S31。
RWJGSQ 较小的寄存器占用相应较大寄存器的最低有效字节。
IFFHKC 以下图示展示了AArch64状态中V、D和S寄存器的映射关系:
RDHVZF 在AArch32状态中,存在:
- 16个128位Q寄存器,Q0-Q15。
- 32个64位D寄存器,D0-D31。
- 32个32位S寄存器,S0-S31。
RBPYPZ 较小的寄存器被打包到较大的寄存器中。
IYHYWN 以下图示展示了AArch32状态中Q、D和S寄存器的映射关系:
RGXGJK 在AArch32状态中:
- 不存在与Q8-Q15对应的S寄存器。
- D16-D31被打包到Q8-Q15中。
IMKXYB 如果在AArch64状态执行的软件解释来自AArch32状态的D或S寄存器,软件必须在使用前从V寄存器中解压D或S寄存器。
译者注: 在AArch64状态中,V寄存器是128位的,Q0映射到V0的低128位,D寄存器对应V寄存器的低64位,S寄存器对应V寄存器的低32位。而在AArch32状态中,Q0-Q15和D0-D31、S0-S31是独立的视图,D16-D31被打包到Q8-Q15中。因此当从AArch32切换到AArch64时,需要注意这种打包关系的差异。
D1.10.1.3 执行状态之间系统寄存器的映射(Mapping of the System registers between the Execution states)
IMPMNZ 有关可写AArch64系统寄存器到AArch32系统寄存器的完整映射列表,请参见表K14-5。
RBQSMK AArch64系统寄存器与AArch32系统寄存器之间的关系由架构定义。
RLPDQL 对AArch32系统寄存器的修改仅影响映射到AArch32系统寄存器的AArch64状态寄存器部分。
IHTCVH 在AArch64状态执行的高级代码(如虚拟机监控程序)可以保存、恢复和解释属于使用AArch32的较低异常级别的系统寄存器。
ILYHXS 在某些情况下,两个AArch32系统寄存器被打包到一个AArch64系统寄存器中。
RQXNZN 如果EL3已实现且使用AArch32,则某些系统寄存器在安全状态与非安全状态之间是分banked的。在这种类型的banking中,安全状态和非安全状态各有一个寄存器实例。
RTVZJS 如果以下任一条件为真,则不支持在安全状态与非安全状态之间进行banking:
- EL3未实现。
- EL3已实现且使用AArch64。
IJRZXQ 如果EL3已实现且使用AArch64,则在以下状态访问相同的、非banked的寄存器:
- 安全EL1,且EL1使用AArch32。
- 非安全EL1,且EL1使用AArch32。
IHSRHJ 如果EL3已实现且使用AArch64,则无法从架构上确定AArch64寄存器是映射到相应AArch32寄存器的安全实例还是非安全实例。
RMCZCY 如果EL3已实现且使用AArch64,则AArch64 CNTP_*定时器触发的中断与EL3使用AArch32时非安全AArch32 CNTP_*定时器触发的中断相同。
IJSZYM 虽然不是必需的,但Arm期望实现将许多供EL3使用的AArch64寄存器映射到banked AArch32寄存器的安全实例,并将许多供EL1使用的AArch64寄存器映射到banked AArch32寄存器的非安全实例。但是,如果EL2和EL3均已实现且都支持使用AArch32,则以下寄存器无法进行此映射:
- IFAR——因为当EL3使用AArch32时,HIFAR是安全IFAR的别名。
- DFAR——因为当EL3使用AArch32时,HDFAR是安全DFAR的别名。
IBYYWR 存在一些仅在AArch32状态使用的AArch32系统寄存器,这些寄存器没有等效的AArch64系统寄存器。但是,存在一些AArch64寄存器可以从更高异常级别访问没有AArch64状态等效量的AArch32寄存器。
IVGXRB 有关访问没有AArch64等效量的AArch32系统寄存器的AArch64寄存器的完整列表,请参见表K14-6。
IWRKYQ 有关允许从AArch64状态访问AArch32 ID寄存器的AArch64寄存器的完整列表,请参见表K14-7。
D1.10.1.4 引发异常至AArch64状态时通用寄存器的状态(State of the general-purpose registers on taking an exception to AArch64 state)
D1.10.1.4.1 如果通用寄存器可从AArch32状态访问(If the general-purpose register was accessible from AArch32 state)
RWWJWP 当从AArch32状态引发异常至AArch64状态且通用寄存器可从AArch32状态访问时,其高32位具有以下其中一种实现定义(IMPLEMENTATION DEFINED)的值,并且可能在实现内部动态变化:
- 高32位保留同一架构寄存器在任何AArch32执行之前持有的值。
- 高32位被设置为零。
实现定义的行为适用,无论在使用AArch32的异常级别是否有任何执行发生。
ITKQYW 例如,RWWJWP中描述的实现定义行为适用于以下情况:AArch32状态是通过从AArch64状态的异常返回进入的,且另一个异常立即被引发至AArch64状态,期间没有在AArch32状态执行任何指令。
IQFBYM 当从AArch32状态引发异常至AArch64状态时,软件必须将高32位的值视为RWWJWP中描述的两个值之间的约束不可预测(CONSTRAINED UNPREDICTABLE)选择。
D1.10.1.4.2 如果通用寄存器不可从AArch32状态访问(If the general-purpose register was not accessible from AArch32 state)
RRHRQX 如果满足以下所有条件,则当从AArch32状态引发异常至AArch64状态时,X15寄存器被视为可访问的,因此X15的高32位可能被设置为零或保留其先前的值:
- 目标异常级别为EL3。
- EL2未实现或EL1处于安全状态。
- SCR_EL3.RW为0。
否则,当从AArch32状态引发异常至AArch64状态时,对于不可从AArch32状态访问的通用寄存器,该寄存器保留在任何AArch32执行之前持有的值。
D1.10.1.4.3 确定从AArch32状态引发异常时AArch64寄存器的高32位(Determining the upper 32 bits of AArch64 registers on taking an exception from AArch32 state)
RZJBSH 在从AArch32引发异常至AArch64时,通用寄存器的高32位是被设置为零还是保留,受以下所有因素影响:
- AArch64状态目标异常级别。
- 以下两者的值:
- SCR_EL3.RW。
- HCR_EL2.RW或HCR.RW,其中HCR.RW是一个理论上的位,为RES0。
RDGVGF 下表展示了在从AArch32状态引发异常至AArch64状态时,哪些通用寄存器的高32位可能被设置为零。在本表中,短横线(-)表示RW值对目标异常级别无效。
| SCR_EL3.RW | HCR_EL2.RW或HCR.RW | 目标异常级别时的寄存器 |
|---|---|---|
| EL3 | ||
| 0 | 0 | X0-X30 |
| 0 | 1 | 由于RW位值意味着EL2为AArch32且EL1为AArch64,因此无效 |
| 1 | 0 | X0-X14, X16-X30 |
| 1 | 1 | X0-X14 |
RWKWVT 如果EL2未实现,或SCR_EL3.NS或SCR.NS位阻止其使用,则在从AArch32状态引发异常至AArch64状态时,其高32位可能被设置为零的寄存器与HCR_EL2.RW具有与SCR_EL3.RW相同值时相同。
RWPVQR 下表展示了在从AArch32状态引发异常至AArch64状态时,哪些通用寄存器的高32位可以保留。在本表中,短横线(-)表示RW值对目标异常级别无效。
| SCR_EL3.RW | HCR_EL2.RW或HCR.RW | 目标异常级别时的寄存器 |
|---|---|---|
| EL3 | ||
| 0 | 0 | 无 |
| 0 | 1 | 由于RW位值意味着EL2为AArch32且EL1为AArch64,因此无效 |
| 1 | 0 | X15 |
| 1 | 1 | X15-X30 |
RLGSLY 如果EL2未实现,或SCR_EL3.NS阻止其使用,则在从AArch32状态引发异常至AArch64状态时,其高32位可以保留的寄存器与HCR_EL2.RW具有与SCR_EL3.RW相同值时相同。
D1.10.1.5 更改执行状态时SPSR、ELR和AArch64 SP的关系(SPSR, ELR, and AArch64 SP relationships on changing Execution state)
IPSRRS 下表展示了在AArch32状态与AArch64状态之间架构上映射的SPSR和ELR寄存器:
| AArch32寄存器 | AArch64寄存器 |
|---|---|
| SPSR_svc | SPSR_EL1 |
| SPSR_hyp | SPSR_EL2 |
| ELR_hyp | ELR_EL2 |
RCHHXX 当从使用AArch32的异常级别引发异常至使用AArch64的EL3,且EL2之前一直使用AArch32状态时,ELR_EL2的高32位具有以下其中一种实现定义的值:
- 高32位保留同一架构寄存器在任何AArch32执行之前持有的值。
- 高32位被设置为零。
RWFDMR 以下AArch32寄存器仅在AArch32状态执行期间使用。但是,如果EL1执行且EL1使用AArch64状态,它们会保留其状态。
- SPSR_abt。
- SPSR_und。
- SPSR_irq。
- SPSR_fiq。
ITBFWN 出于上下文切换的目的,RWFDMR中的寄存器在使用AArch64状态在高于EL1的异常级别执行期间可访问。
IWRPZP 如果EL1不支持AArch32状态执行,则RWFDMR中的寄存器为RES0。
RMBVJZ 如果从使用AArch32的异常级别引发异常至使用AArch64的异常级别,则与某一异常级别相关联的、在引发异常的异常级别执行AArch32期间无法访问的AArch64栈指针和异常链接寄存器保留其在任何AArch32执行之前持有的状态。这适用于以下寄存器:
- SP_EL0。
- SP_EL1。
- SP_EL2。
- ELR_EL1。
D1.10.1.6 更改执行状态时PSTATE.SM和PSTATE.ZA的行为(PSTATE.SM and PSTATE.ZA behaviors on changing Execution state)
RSWQGH 以下任一情况发生时,PSTATE.{SM, ZA}的值不会改变:
- 从AArch64到AArch32执行状态的异常返回。
- 从AArch32到AArch64执行状态引发的异常。
RGXKNK 在AArch32状态中,PSTATE.SM的有效值为0。
IMWQNV 当PSTATE.SM为1时,执行状态从AArch64到AArch32或从AArch32到AArch64的更改会导致所有已实现的SVE寄存器(包括SIMD&FP寄存器)和FPSR的位被重置为固定值。
IWYKRM PSTATE.ZA的值在AArch32执行状态中不会改变。因此,当PSTATE.ZA为1时,AArch64和AArch32执行状态之间的切换对ZA存储的内容或当FEAT_SME2实现时ZT0寄存器的内容没有影响。
D1.11 特性检查(Check Feature)
D1.11 Check Feature
IFCDFK FEAT_CHK 为 CHKFEAT 提供以下属性:
- CHKFEAT 从 Hint(提示)指令空间中分配,允许它在任何 PE 上使用,无论 FEAT_CHK 是否实现。
- CHKFEAT 接受一个值作为输入,其中输入值的其中一个或多个位被设置为 1,以测试请求的特性是否启用;如果特性已启用,则相关位被清除为 0;否则,该位保持不变。
- 当 FEAT_CHK 未实现时,输入值保持不变,表明请求的特性未启用。
- CHKFEAT 返回 GCSEnabled() 的状态。
译者注: Hint 指令是一类特殊的指令,它们向处理器提示某些操作可以优化,但处理器可以选择忽略这些提示。CHKFEAT 被分配到 Hint 指令空间意味着它不会影响程序的正确性,即使在不支持 FEAT_CHK 的处理器上也能安全执行。
ICZRRH 关于 CHKFEAT 的编码分配,参见 op0 == 0b00、Architectural hints、barriers and CLREX,以及 PSTATE access。
IQMQXS 由于 CHKFEAT 指令位于 Hint 指令编码空间中,它实际上在所有支持 AArch64 的 PE 上都已实现。然而,只有当 CHKFEAT 所识别的任何特性已实现时,CHKFEAT 才会返回一个与输入值不同的结果值。
RVXBTN 下面展示了如何在实现无关的方式下使用 CHKFEAT 的示例。
示例 D1-1 使用 CHKFEAT 的示例代码
1 | Example D1-1 Example code for using CHKFEAT |
译者注: 此示例展示了如何使用 CHKFEAT 检查 GCS(Generic Counter Scaling)特性是否启用。CHKFEAT 指令尝试检查 X16 中位 [0] 所对应的特性,如果该特性启用则该位被清除为 0,否则保持为 1。TBNZ(Test Bit and Branch if Non-Zero)指令随后根据该位的状态决定是否跳过 GCS 相关代码。这种模式允许代码在不支持特定特性的处理器上优雅地降级运行。
M.b Non-Confidential
图片索引
| 图片编号 | 文件路径 |
|---|---|
| Figure D1-1 | /images/arm-d1-programmers-model/figure_D1-1.png |
术语表
| 英文 | 中文 |
|---|---|
| Exception level (EL) | 异常级别 |
| Processing Element (PE) | 处理单元 |
| PSTATE | 进程状态 |
| Security state | 安全状态 |
| AArch64 | 64位架构 |
| AArch32 | 32位架构 |
| Self-hosted debug | 自托管调试 |
| Performance Monitors | 性能监视器 |
| Activity Monitors | 活动监视器 |
| Reset | 复位 |
| Warm reset | 热复位 |
| Cold reset | 冷复位 |
| Low-power state | 低功耗状态 |
| Wait for Event (WFE) | 等待事件 |
| Wait for Interrupt (WFI) | 等待中断 |
| Interprocessing | 交互处理 |
本文档基于 ARM DDI 0487 文档翻译,版权所有 © 2013-2026 Arm Limited。