HCR_EL2,Hypervisor 配置寄存器

HCR_EL2 的特性:

**用途**

为虚拟化提供配置控制,包括定义各种操作是否被陷入到 EL2。

**配置**

AArch64 系统寄存器 HCR_EL2 的位 [31:0] 在架构上映射到 AArch32 系统寄存器 HCR[31:0]。

AArch64 系统寄存器 HCR_EL2 的位 [63:32] 在架构上映射到 AArch32 系统寄存器 HCR2[31:0]。

如果未实现 EL2,则从 EL3 角度看,该寄存器为 RES0。

如果在当前安全状态下 EL2 未被使能,则除了直接读取寄存器外,该寄存器中的位行为如同为 0。

该寄存器中的 RW 字段复位为架构上未知的值。

**属性**

HCR_EL2 是一个 64 位寄存器。

**字段描述**

HCR_EL2 的位分配如下:

63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32

| TWEDEL | TWEDEn | TID5 | DCT | ATA | TTLBOS | TTLBIS | EnSCXT | TOCU | AMVOFFEN | TICAB | TID4 | RES0 | FIEN | FWB | NV2 | AT | NV1 | NV | API | APK | RES0 | MIOCNCE | TEA | TERR | TLOR | E2H | ID | CD |

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

| RW | TRVM | HCD | TDZ | TGE | TVM | TTLB | TPU | TPCP | TSW | TACR | TIDCP | TSC | TID3 | TID2 | TID1 | TID0 | TWE | TWI | DC | BSU | FB | VSE | VI | VF | AMO | IMO | FMO | PTW | SWIO | VM |


**TWEDEL,位 [63:60]**

当实现了 ARMv8.6-TWED 时:

TWE 延迟。一个 4 位无符号数,当 HCR_EL2.TWEDEn 为 1 时,编码因 HCR_EL2.TWE 引起的 WFE 陷入的最小延迟为 2^(TWEDEL + 8) 个周期。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TWEDEn,位 [59]**

当实现了 ARMv8.6-TWED 时:

TWE 延迟使能。使能由 HCR_EL2.TWE 引起的 WFE 指令的可配置延迟陷入。

| TWEDEn | 含义 |

|--------|------|

| 0b0 | 执行 WFE 陷入的延迟由实现定义。 |

| 0b1 | 执行 WFE 陷入的延迟至少为 HCR_EL2.TWEDEL 中定义的周期数。 |

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TID5,位 [58]**

当实现了 ARMv8.5-MemTag 时:

陷入 ID 组 5。当在当前安全状态下 EL2 被使能时,将以下寄存器访问陷入到 EL2:

AArch64:

• GMID_EL1。

| TID5 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 指定的 EL1 和 EL0 对 ID 组 5 寄存器的访问被陷入到 EL2。 |

当 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的有效值为 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**DCT,位 [57]**

当实现了 ARMv8.5-MemTag 时:

默认缓存性标记。当 HCR_EL2.DC 生效时,控制第一级转换是否被视为已标记或未标记。

| DCT | 含义 |

|-----|------|

| 0b0 | 第一级转换被视为未标记。 |

| 0b1 | 第一级转换被视为已标记。 |

该字段复位为架构上未知的值。

否则:

保留,RES0。

**ATA,位 [56]**

当实现了 ARMv8.5-MemTag 时:

分配标签访问。当 SCR_EL3.ATA=1 且 HCR_EL2.{E2H,TGE} != {1,1} 时,控制 EL1 和 EL0 对分配标签的访问。

当访问被阻止时:

• 加载或存储数据的指令是无检查的。

• 加载或存储分配标签的指令将分配标签视为 RAZ/WI。

• 将逻辑地址标签插入地址的指令,用于生成逻辑地址标签的分配标签被视为 0。

• 从缓存中无效分配标签的缓存维护指令的行为类似于对分配标签执行清除并无效操作。

• 在 EL1 层使用 GCR_EL1, RGSR_EL1, TFSR_EL1, TFSR_EL2 或 TFSRE0_EL1 且未定义的 MRS 和 MSR 指令,会被陷入到 EL2。

| ATA | 含义 |

|-----|------|

| 0b0 | 访问被阻止。 |

| 0b1 | 访问不被阻止。 |

该字段允许缓存在 TLB 中。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TTLBOS,位 [55]**

当实现了 ARMv8.2-EVT 时:

陷入在外可共享域上操作的 TLB 维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 使用 AArch64 执行的这些 TLB 维护指令陷入到 EL2。这适用于以下指令:

TLBI VMALLE1OS, TLBI VAE1OS, TLBI ASIDE1OS, TLBI VAAE1OS, TLBI VALE1OS, TLBI VAALE1OS, TLBI RVAE1OS, TLBI RVAAE1OS, TLBI RVALE1OS, TLBI RVAALE1OS。

| TTLBOS | 含义 |

|--------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 指定指令的执行被陷入到 EL2。 |

如果未实现 ARMv8.2-EVT,则该字段为 RES0。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TTLBIS,位 [54]**

当实现了 ARMv8.2-EVT 时:

陷入在内可共享域上操作的 TLB 维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 使用 AArch64 以及 EL1 使用 AArch32 执行的这些 TLB 维护指令陷入到 EL2。这适用于以下指令:

• 当 EL1 使用 AArch64 时:TLBI VMALLE1IS, TLBI VAE1IS, TLBI ASIDE1IS, TLBI VAAE1IS, TLBI VALE1IS, TLBI VAALE1IS, TLBI RVAE1IS, TLBI RVAAE1IS, TLBI RVALE1IS, TLBI RVAALE1IS。

• 当 EL1 使用 AArch32 时:TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS, TLBIMVALIS, TLBIMVAALIS。

| TTLBIS | 含义 |

|--------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 指定指令的执行被陷入到 EL2。 |

如果未实现 ARMv8.2-EVT,则该字段为 RES0。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**EnSCXT,位 [53]**

当实现了 ARMv8.0-CSV2 时:

使能对 SCXTNUM_EL1 和 SCXTNUM_EL0 寄存器的访问。定义的值如下:

| EnSCXT | 含义 |

|--------|------|

| 0b0 | 当 (HCR_EL2.TGE==0 或 HCR_EL2.E2H==0) 且当前安全状态下 EL2 被使能时,此机制禁用 EL1 和 EL0 对 SCXTNUM_EL0 的访问以及 EL1 对 SCXTNUM_EL1 的访问,导致异常陷入 EL2,并且这些寄存器的值被视为 0。当 ((HCR_EL2.TGE==1 且 HCR_EL2.E2H==1) 且当前安全状态下 EL2 被使能时,此机制禁用 EL0 对 SCXTNUM_EL0 的访问,导致异常陷入 EL2,并且该寄存器的值被视为 0。 |

| 0b1 | 此控制不会导致对 SCXTNUM_EL0 或 SCXTNUM_EL1 的访问被陷入。 |

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1,1} 时,该位对 EL0 的执行没有影响。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TOCU,位 [52]**

当实现了 ARMv8.2-EVT 时:

陷入操作到统一点的缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 或 EL0 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2。这适用于以下指令:

• 当 SCTLR_EL1.UCI 为 1,HCR_EL2.{TGE, E2H} 不为 {1, 1},且 EL0 使用 AArch64 时:IC IVAU, DC CVAU。

• 当 EL1 使用 AArch64 时:IC IVAU, IC IALLU, DC CVAU。

• 当 EL1 使用 AArch32 时:ICIMVAU, ICIALLU, DCCMVAU。

**注意**

因为指令在 EL0 未定义而产生的异常优先级高于此陷入到 EL2。此外:

• IC IALLUIS 和 IC IALLU 在使用 AArch64 的 EL0 总是未定义的。

• ICIMVAU, ICIALLU, ICIALLUIS, DCCMVAU 在使用 AArch32 的 EL0 总是未定义的。

| TOCU | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 指定指令的执行被陷入到 EL2。 |

如果统一点位于任何数据缓存级别之前,则当该控制值为 1 时,是否能够陷入任何通过 VA 到统一点的数据或统一缓存清除指令的执行由实现定义。

如果统一点位于任何指令缓存级别之前,则当该控制值为 1 时,是否能够陷入任何到统一点的指令缓存无效指令的执行由实现定义。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**AMVOFFEN,位 [51]**

当实现了 ARMv8.6-AMU 时:

活动监视器虚拟偏移使能。

| AMVOFFEN | 含义 |

|----------|------|

| 0b0 | 活动监视器的虚拟化被禁用。对虚拟偏移寄存器的间接读返回零。 |

| 0b1 | 活动监视器的虚拟化被使能。 |

否则:

保留,RES0。

**TICAB,位 [50]**

当实现了 ARMv8.2-EVT 时:

陷入 ICIALLUIS/IC IALLUIS 缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2。这适用于以下指令:

• 当 EL1 使用 AArch64 时:IC IALLUIS。

• 当 EL1 使用 AArch32 时:ICIALLUIS。

| TICAB | 含义 |

|-------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | EL1 执行指定指令被陷入到 EL2。 |

如果未实现 ARMv8.2-EVT,则该字段为 RES0。

如果统一点位于任何指令缓存级别之前,则当该控制值为 1 时,是否能够陷入任何到统一点的指令缓存无效指令的执行由实现定义。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TID4,位 [49]**

当实现了 ARMv8.2-EVT 时:

陷入 ID 组 4。当在当前安全状态下 EL2 被使能时,将以下寄存器访问陷入到 EL2:

AArch64:

• EL1 读 CCSIDR_EL1, CCSIDR2_EL1, CLIDR_EL1, CSSELR_EL1。

• EL1 写 CSSELR_EL1。

AArch32:

• EL1 读 CCSIDR, CCSIDR2, CLIDR, CSSELR。

• EL1 写 CSSELR。

| TID4 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 指定的 EL1 和 EL0 对 ID 组 4 寄存器的访问被陷入到 EL2。 |

如果未实现 ARMv8.2-EVT,则该字段为 RES0。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**位 [48]**

保留,RES0。

**FIEN,位 [47]**

当实现了 ARMv8.4-RAS 时:

故障注入使能。除非该位被设置为 1,否则当在当前安全状态下 EL2 被使能时,从 EL1 对 ERXPFGCDN_EL1, ERXPFGCTL_EL1, ERXPFGF_EL1 寄存器的访问会产生陷入异常到 EL2,使用 EC 综合征值 0x18 报告。

| FIEN | 含义 |

|------|------|

| 0b0 | 当在当前安全状态下 EL2 被使能时,从 EL1 对指定寄存器的访问被陷入到 EL2。 |

| 0b1 | 此控制不会导致任何指令被陷入。 |

如果 EL2 在当前安全状态下被禁用,则 HCR_EL2.FIEN 的有效值为 0b1。

如果 ERRIDR_EL1.NUM 为零(表示未实现错误记录),或者没有实现 RAS 公共故障注入模型扩展的节点所拥有的、可通过系统寄存器访问的错误记录,则该位可能为 RES0。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**FWB,位 [46]**

当实现了 ARMv8.4-S2FWB 时:

定义两阶段转换机制中的组合缓存性属性。

| FWB | 含义 |

|-----|------|

| 0b0 | 当该位为 0 时:• 内存类型和缓存性属性的第一级和第二级转换的组合如 Armv8.0 架构所述。更多信息请参见 D4.5.4 组合第一级和第二级属性。• 第二级页或块描述符的位[5:2]中第二级内存类型和缓存性属性的编码如 Armv8.0 架构所述。 |

| 0b1 | 当该位为 1 时:• 第二级页或块描述符的位[5]为 RES0。• 当第二级页或块描述符的位[4]为 1 时:- 如果位[3:2]为 0b11,则结果内存类型和内/外缓存性属性与第一级内存类型和内/外缓存性属性相同。- 如果位[3:2]为 0b10,则结果内存类型和属性为 Normal Write-Back。- 如果位[3:2]为 0b0x,则结果内存类型为 Normal Non-cacheable,除非第一级内存类型为 Device,此时结果内存类型为 Device。• 当第二级页或块描述符的位[4]为 0 时,内存类型为 Device:- 如果位[3:2]为 0b00,第二级内存类型为 Device-nGnRnE。- 如果位[3:2]为 0b01,第二级内存类型为 Device-nGnRE。- 如果位[3:2]为 0b10,第二级内存类型为 Device-nGRE。- 如果位[3:2]为 0b11,第二级内存类型为 Device-GRE。• 如果第一级转换指定了可缓存的内存类型,则第一级缓存分配提示应用于最终缓存分配提示(如果最终内存类型是可缓存的)。• 如果第一级转换未指定可缓存的内存类型,则如果最终内存类型是可缓存的,则将其视为读分配、写分配。第一级和第二级内存类型按照 D4.5.4 中描述的方式组合。 |

在安全状态下,该位同时适用于安全第二级转换和非安全第二级转换。

该位允许缓存在 TLB 中。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**NV2,位 [45]**

当实现了 ARMv8.4-NV 时:

嵌套虚拟化。改变 HCR_EL2.{NV, NV1} 的行为,提供一种机制让硬件将对系统寄存器的读写转换为对内存的读写。

| NV2 | 含义 |

|-----|------|

| 0b0 | 该位对 HCR_EL2.{NV, NV1} 的行为没有影响。 |

| 0b1 | 重新定义 HCR_EL2{NV, NV1} 的行为以使能:• 将寄存器的读写转换为对内存的读写。• 将 EL2 寄存器重定向到 EL1 寄存器。 |

当该位为 0 时,HCR_EL2.{NV, NV1} 的行为如 ARMv8.3-NV 所定义。

当该位为 1 时,任何从 EL1 产生并被路由到 EL1 的异常都会导致 SPSR_EL1.M[3:2] 被设置为 0b10 而不是 0b01。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**AT,位 [44]**

当实现了 ARMv8.3-NV 时:

地址转换。当在当前安全状态下 EL2 被使能时,EL1 执行以下地址转换指令会被陷入到 EL2,使用 EC 综合征值 0x18 报告:

• AT S1E0R, AT S1E0W, AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP

| AT | 含义 |

|----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | EL1 执行指定指令被陷入到 EL2。 |

该字段复位为架构上未知的值。

否则:

保留,RES0。

**NV1,位 [43]**

当实现了 ARMv8.4-NV 时:

嵌套虚拟化。

| NV1 | 含义 |

|-----|------|

| 0b0 | 如果 HCR_EL2.{NV, NV2} 都为 1,则从 EL1 对已实现的 EL12、EL02 或 EL2 寄存器的访问被转换为加载和存储。如果 HCR_EL2.NV2 为 0 或 HCR_EL2.{NV, NV2} == {0, 1},则此控制不会导致任何指令被陷入。 |

| 0b1 | 如果 HCR_EL2.NV2 为 1,则从 EL1 对已实现的 EL2 寄存器的访问被转换为加载和存储。如果 HCR_EL2.NV2 为 0,则当在当前安全状态下 EL2 被使能时,EL1 对 VBAR_EL1, ELR_EL1, SPSR_EL1 的访问被陷入到 EL2,使用 EC 综合征值 0x18 报告。 |

如果 HCR_EL2.NV2 为 1,则 HCR_EL2.NV1 的值定义哪些 EL1 寄存器访问被转换为加载和存储。这些转换后的访问优先级高于寄存器的陷入。

由其他控制位引起的 EL1 寄存器的陷入优先级高于这些访问的转换。

如果指定的寄存器未被实现,则对该寄存器的访问是未定义的。

受影响的寄存器列表,请参见嵌套虚拟化的增强支持。

如果 HCR_EL2.{NV, NV1, NV2} 为 {1, 0, 0},则任何从 EL1 产生并被路由到 EL1 的异常都会导致 SPSR_EL1.M[3:2] 被设置为 0b10,而不是 0b01。

如果 HCR_EL2.{NV, NV1, NV2} 为 {1, 1, 0},则:

• EL1 转换表块和页描述符:◦ 位[54] 保存 PXN 而不是 UXN。◦ 位[53] 为 RES0。◦ 位[6] 无论实际值如何都被视为 0。

• 如果使能了分层权限,则 EL1 转换表表描述符如下:◦ 位[61] 无论实际值如何都被视为 0。◦ 位[60] 保存 PXNTable 而不是 UXNTable。◦ 位[59] 为 RES0。

• 在 EL1 执行时,除了读取该位的值外,PSTATE.PAN 位被视为 0。

• 在 EL1 执行时,LDTR* 指令被视为等效的 LDR* 指令,STTR* 指令被视为等效的 STR* 指令。

如果 HCR_EL2.{NV, NV1, NV2} 为 {0, 1, 0},则行为是受限不可预测的,可以选择:

• 除了读取 HCR_EL2.NV 位的值外,行为如同 HCR_EL2.NV 为 1 且 HCR_EL2.NV1 为 1。

• 除了读取 HCR_EL2.NV1 位的值外,行为如同 HCR_EL2.NV 为 0 且 HCR_EL2.NV1 为 0。

• 按照本描述其余部分定义的 HCR_EL2.NV 和 HCR_EL2.NV1 位行为行事。

该位允许缓存在 TLB 中。

该字段复位为架构上未知的值。

**当实现了 ARMv8.3-NV 时:**

嵌套虚拟化。当在当前安全状态下 EL2 被使能时,EL1 对某些寄存器的访问被陷入到 EL2。

| NV1 | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对 VBAR_EL1, ELR_EL1, SPSR_EL1 的访问被陷入到 EL2,使用 EC 综合征值 0x18 报告。 |

如果 HCR_EL2.NV 为 1 且 HCR_EL2.NV1 为 0,则以下效果也适用:

• 任何从 EL1 产生并被路由到 EL1 的异常都会导致 SPSR_EL1.M[3:2] 被设置为 0b10,而不是 0b01。

如果 HCR_EL2.NV 和 HCR_EL2.NV1 位都被设置为 1,则以下效果也适用:

• EL1 转换表块和页描述符:◦ 位[54] 保存 PXN 而不是 UXN。◦ 位[53] 为 RES0。◦ 位[6] 无论实际值如何都被视为 0。

• 如果使能了分层权限,则 EL1 转换表表描述符如下:◦ 位[61] 无论实际值如何都被视为 0。◦ 位[60] 保存 PXNTable 而不是 UXNTable。◦ 位[59] 为 RES0。

• 在 EL1 执行时,除了读取该位的值外,PSTATE.PAN 位被视为 0。

• 在 EL1 执行时,LDTR* 指令被视为等效的 LDR* 指令,STTR* 指令被视为等效的 STR* 指令。

如果 HCR_EL2.NV 为 0 且 HCR_EL2.NV1 为 1,则行为是受限不可预测的,可以选择:

• 除了读取 HCR_EL2.NV 位的值外,行为如同 HCR_EL2.NV 为 1 且 HCR_EL2.NV1 为 1。

• 除了读取 HCR_EL2.NV1 位的值外,行为如同 HCR_EL2.NV 为 0 且 HCR_EL2.NV1 为 0。

• 按照本描述其余部分定义的 HCR_EL2.NV 和 HCR_EL2.NV1 位行为行事。

该位允许缓存在 TLB 中。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**NV,位 [42]**

当实现了 ARMv8.4-NV 时:

嵌套虚拟化。

当 HCR_EL2.NV2 为 1 时,重新定义寄存器访问,使得:

• 访问特殊目的寄存器 SPSR_EL2 和 ELR_EL2 的指令改为分别访问 SPSR_EL1 和 ELR_EL1。

• 访问系统寄存器 ESR_EL2 和 FAR_EL2 的指令改为访问 ESR_EL1 和 FAR_EL1。

当 HCR_EL2.NV2 为 0 时,或者如果未实现 ARMv8.4-NV,则在当前安全状态下 EL2 被使能时,陷入那些在 EL2 允许、但如果该字段为 0 则在 EL1 会是未定义的功能。这适用于以下操作:

• EL1 访问在 EL2 非未定义的特殊目的寄存器。

• EL1 访问在 EL2 非未定义的系统寄存器。

• 执行 EL1 或 EL2 转换机制的、针对 EL2 及以上等级的地址转换和 TLB 维护指令。

| NV | 含义 |

|----|------|

| 0b0 | 当该位设置为 0 时,除了读取该寄存器外,HCR_EL2.NV2 == 0。此控制不会导致任何指令被陷入。当 HCR_EL2.NV2 为 1 时,不实现任何 ARMv8.4-NV 功能。 |

| 0b1 | 当 HCR_EL2.NV2 为 0,或者如果未实现 ARMv8.4-NV 时,当在当前安全状态下 EL2 被使能时,EL1 对指定寄存器的访问或指定指令的执行被陷入到 EL2。EL1 对 CurrentEL 寄存器的读访问返回值 0x2。当 HCR_EL2.NV2 为 1 时,此控制重新定义 EL1 寄存器访问,使得访问 SPSR_EL2, ELR_EL2, ESR_EL2, FAR_EL2 的指令改为分别访问 SPSR_EL1, ELR_EL1, ESR_EL1, FAR_EL1。 |

当 HCR_EL2.NV2 为 0,或者如果未实现 ARMv8.4-NV 时,则:

• 访问被陷入并使用 EC 综合征值 0x18 报告的系统或特殊目的寄存器如下:◦ 使用 MRS 或 MSR 访问、名称以 _EL2 结尾的寄存器,但 SP_EL2 除外。◦ 使用 MRS 或 MSR 访问、名称以 _EL12 结尾的寄存器。◦ 使用 MRS 或 MSR 访问、名称以 _EL02 结尾的寄存器。◦ 使用 MRS 或 MSR 访问的特殊目的寄存器 SPSR_irq, SPSR_abt, SPSR_und, SPSR_fiq。◦ 使用专用 MRS 或 MSR 指令访问的特殊目的寄存器 SP_EL1。

• 执行被陷入并使用 EC 综合征值 0x18 报告的指令如下:◦ EL2 转换机制的地址转换指令和 TLB 维护指令。◦ 仅能从 EL2 和 EL3 访问的 EL1 转换机制的地址转换指令和 TLB 维护指令。

• 执行被陷入的指令如下:◦ 在未包含 EL3 的实现中且当 HCR_EL2.TSC 为 1 时的 SMC 指令。此时 HCR_EL2.TSC 位不是 RES0。使用 EC 综合征值 0x17 报告。◦ ERET, ERETAA, ERETAB 指令,使用 EC 综合征值 0x1A 报告。

**注意**

此陷阱的优先级高于 HCR_EL2.API 陷阱。如果这两个位都被设置,使得 EL1 执行 ERETAA 或 ERETAB 指令陷入到 EL2,则报告的综合征为 0x1A。

该字段复位为架构上未知的值。

**当实现了 ARMv8.3-NV 时:**

嵌套虚拟化。当在当前安全状态下 EL2 被使能时,陷入那些在 EL2 允许、但如果该字段为 0 则在 EL1 会是未定义的功能。这适用于以下操作:

• EL1 访问在 EL2 非未定义的特殊目的寄存器。

• EL1 访问在 EL2 非未定义的系统寄存器。

• 执行 EL1 或 EL2 转换机制的、针对 EL2 及以上等级的地址转换和 TLB 维护指令。

可能的值为:

| NV | 含义 |

|----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对指定寄存器的访问或指定指令的执行被陷入到 EL2。EL1 对 CurrentEL 寄存器的读访问返回值 0x2。 |

访问被陷入并使用 EC 综合征值 0x18 报告的系统或特殊目的寄存器如下:

• 使用 MRS 或 MSR 访问、名称以 _EL2 结尾的寄存器,但 SP_EL2 除外。

• 使用 MRS 或 MSR 访问、名称以 _EL12 结尾的寄存器。

• 使用 MRS 或 MSR 访问、名称以 _EL02 结尾的寄存器。

• 使用 MRS 或 MSR 访问的特殊目的寄存器 SPSR_irq, SPSR_abt, SPSR_und, SPSR_fiq。

• 使用专用 MRS 或 MSR 指令访问的特殊目的寄存器 SP_EL1。

执行被陷入并使用 EC 综合征值 0x18 报告的指令如下:

• EL2 转换机制的地址转换指令和 TLB 维护指令。

• 仅能从 EL2 和 EL3 访问的 EL1 转换机制的地址转换指令和 TLB 维护指令。

ERET, ERETAA, ERETAB 指令的执行被陷入并使用 EC 综合征值 0x1A 报告。

**注意**

此陷阱的优先级高于 HCR_EL2.API 陷阱。如果这两个位都被设置,使得 EL1 执行 ERETAA 或 ERETAB 指令陷入到 EL2,则报告的综合征为 0x1A。

在未包含 EL3 的实现中且当 HCR_EL2.TSC 为 1 时,SMC 指令的执行被陷入并使用 EC 综合征值 0x17 报告。此时 HCR_EL2.TSC 位不是 RES0。

该位允许缓存在 TLB 中。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**API,位 [41]**

当实现了 ARMv8.3-PAuth 时:

控制与指针认证相关的指令的使用:

• 在 EL0 层,当 HCR_EL2.TGE==0 或 HCR_EL2.E2H==0,且关联的 SCTLR_EL1.En<N><M>==1 时。

• 在 EL1 层,关联的 SCTLR_EL1.En<N><M>==1 时。

陷阱使用 EC 综合征值 0x09 报告。被陷入的指针认证指令有:

• AUTDA, AUTDB, AUTDZA, AUTDZB, AUTIA, AUTIA1716, AUTIASP, AUTIAZ, AUTIB, AUTIB1716, AUTIBSP, AUTIBZ, AUTIZA, AUTIZB。

• PACGA, PACDA, PACDB, PACDZA, PACDZB, PACIA, PACIA1716, PACIASP, PACIAZ, PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZA, PACIZB。

• RETAA, RETAB, BRAA, BRAB, BLRAA, BLRAB, BRAAZ, BRABZ, BLRAAZ, BLRABZ。

• ERETAA, ERETAB, LDRAA, LDRAB。

| API | 含义 |

|-----|------|

| 0b0 | 当在当前安全状态下 EL2 被使能且指令对 EL1&0 转换机制使能时,从 EL0(当 HCR_EL2.TGE==0 或 HCR_EL2.E2H==0 时)或 EL1 执行的与指针认证相关的指令被陷入到 EL2。如果 HCR_EL2.NV 为 1,则对于 ERETAA 和 ERETAB 指令,HCR_EL2.NV 陷阱优先于 HCR_EL2.API 陷阱。 |

| 0b1 | 此控制不会导致任何指令被陷入。 |

如果实现了 ARMv8.3-PAuth 但 EL2 未实现或在当前安全状态下被禁用,则系统的行为如同该位为 1。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**APK,位 [40]**

当实现了 ARMv8.3-PAuth 时:

陷入保存指针认证"密钥"值的寄存器。当在当前安全状态下 EL2 被使能时,将从 EL1 对以下寄存器的访问陷入到 EL2,使用 EC 综合征值 0x18 报告:

• APIAKeyLo_EL1, APIAKeyHi_EL1, APIBKeyLo_EL1, APIBKeyHi_EL1, APDAKeyLo_EL1, APDAKeyHi_EL1, APDBKeyLo_EL1, APDBKeyHi_EL1, APGAKeyLo_EL1, APGAKeyHi_EL1。

| APK | 含义 |

|-----|------|

| 0b0 | 当在当前安全状态下 EL2 被使能时,从 EL1 对保存指针认证"密钥"值的寄存器的访问被陷入到 EL2。 |

| 0b1 | 此控制不会导致任何指令被陷入。 |

**注意**

如果实现了 ARMv8.3-PAuth 但 EL2 未实现或在当前安全状态下被禁用,则系统的行为如同该位为 1。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**位 [39]**

保留,RES0。

**MIOCNCE,位 [38]**

针对 EL1&0 转换机制的内/外可缓存不匹配非一致性使能。

| MIOCNCE | 含义 |

|---------|------|

| 0b0 | 对于 EL1&0 转换机制,如果对某个内存位置的允许访问使用了该位置的可共享性和缓存性的公共定义,那么如果这些访问的内部缓存性属性与外部缓存性属性不同,则不能有一致性丢失。 |

| 0b1 | 对于 EL1&0 转换机制,如果对某个内存位置的允许访问使用了该位置的可共享性和缓存性的公共定义,那么如果这些访问的内部缓存性属性与外部缓存性属性不同,可能会有一致性丢失。 |

更多信息请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)第 B2 节(AArch64 应用级内存模型)中的"不匹配内存属性"。

该字段可以实现为 RAZ/WI。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TEA,位 [37]**

将同步外部中止异常路由到 EL2。如果实现了 RAS 扩展,该位的可能值为:

| TEA | 含义 |

|-----|------|

| 0b0 | 此控制不会导致异常从 EL0 和 EL1 路由到 EL2。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,如果未路由到 EL3,则将来自 EL0 和 EL1 的同步外部中止异常路由到 EL2。 |

当未实现 RAS 扩展时,该字段为 RES0。

该字段复位为架构上未知的值。

**TERR,位 [36]**

当实现了 RAS 时:

陷入错误记录访问。将从 EL1 对 RAS 错误寄存器的访问陷入到 EL2,如下所示:

• 如果 EL1 使用 AArch64 状态,对以下寄存器的访问被陷入到 EL2,使用 EC 综合征值 0x18 报告:◦ ERRIDR_EL1, ERRSELR_EL1, ERXADDR_EL1, ERXCTLR_EL1, ERXFR_EL1, ERXMISC0_EL1, ERXMISC1_EL1, ERXSTATUS_EL1。◦ 当实现了 ARMv8.4-RAS 时,还包括 ERXMISC2_EL1, ERXMISC3_EL1。

• 如果 EL1 使用 AArch32 状态,MCR 或 MRC 访问被陷入到 EL2,使用 EC 综合征值 0x03 报告;MCRR 或 MRRC 访问被陷入到 EL2,使用 EC 综合征值 0x04 报告:◦ ERRIDR, ERRSELR, ERXADDR, ERXADDR2, ERXCTLR, ERXCTLR2, ERXFR, ERXFR2, ERXMISC0, ERXMISC1, ERXMISC2, ERXMISC3, ERXSTATUS。◦ 当实现了 ARMv8.4-RAS 时,还包括 ERXMISC4, ERXMISC5, ERXMISC6, ERXMISC7。

| TERR | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,从 EL1 对指定寄存器的访问会产生陷入异常到 EL2。 |

该字段复位为架构上未知的值。

否则:

保留,RES0。

**TLOR,位 [35]**

当实现了 ARMv8.1-LOR 时:

陷入 LOR 寄存器。当在当前安全状态下 EL2 被使能时,将从 EL1 对 LORSA_EL1, LOREA_EL1, LORN_EL1, LORC_EL1, LORID_EL1 寄存器的访问陷入到 EL2。

| TLOR | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对 LOR 寄存器的访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**E2H,位 [34]**

当实现了 ARMv8.1-VHE 时:

EL2 主机。使能一种配置,其中主机操作系统在 EL2 运行,主机操作系统的应用程序在 EL0 运行。

| E2H | 含义 |

|-----|------|

| 0b0 | 禁用支持 EL2 主机操作系统的设施。 |

| 0b1 | 使能支持 EL2 主机操作系统的设施。 |

关于该位行为的信息,请参见 HCR_EL2.E2H 的行为。

该位允许缓存在 TLB 中。

该字段复位为架构上未知的值。

否则:

保留,RES0。

**ID,位 [33]**

第二级指令访问缓存性禁用。对于 EL1&0 转换机制,当在当前安全状态下 EL2 被使能且 HCR_EL2.VM==1 时,此控制强制所有对 Normal 内存的指令访问的第二级转换为非可缓存。

| ID | 含义 |

|----|------|

| 0b0 | 此控制对 EL1&0 转换机制的第二级没有影响。 |

| 0b1 | 强制所有对 Normal 内存的指令访问的第二级转换为非可缓存。 |

该位对 EL2、EL2&0 或 EL3 转换机制没有影响。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**CD,位 [32]**

第二级数据访问缓存性禁用。对于 EL1&0 转换机制,当在当前安全状态下 EL2 被使能且 HCR_EL2.VM==1 时,此控制强制所有对 Normal 内存的数据访问和转换表遍历的第二级转换为非可缓存。

| CD | 含义 |

|----|------|

| 0b0 | 此控制对 EL1&0 转换机制的数据访问和转换表遍历的第二级没有影响。 |

| 0b1 | 强制所有对 Normal 内存的数据访问和转换表遍历的第二级转换为非可缓存。 |

该位对 EL2、EL2&0 或 EL3 转换机制没有影响。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**RW,位 [31]**

较低异常等级的执行状态控制:

| RW | 含义 |

|----|------|

| 0b0 | 所有较低等级均为 AArch32。 |

| 0b1 | EL1 的执行状态为 AArch64。EL0 的执行状态由在 EL0 执行时 PSTATE.nRW 的当前值决定。 |

如果实现中 EL1 不支持 AArch32 状态,则该位为 RAO/WI。

在包含 EL3 的实现中,当 EL2 在安全状态下未被使能时,除了直接读写 HCR_EL2 外,PE 的行为如同该位与 SCR_EL3.RW 位具有相同的值。

RW 位允许缓存在 TLB 中。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 1。

该字段复位为架构上未知的值。

**TRVM,位 [30]**

陷入虚拟内存控制寄存器的读操作。当在当前安全状态下 EL2 被使能时,将 EL1 对虚拟内存控制寄存器的读访问陷入到 EL2,两种执行状态均适用,具体如下:

• 如果 EL1 使用 AArch64 状态,以下寄存器被陷入到 EL2,并使用 EC 综合征值 0x18 报告:SCTLR_EL1, TTBR0_EL1, TTBR1_EL1, TCR_EL1, ESR_EL1, FAR_EL1, AFSR0_EL1, AFSR1_EL1, MAIR_EL1, AMAIR_EL1, CONTEXTIDR_EL1。

• 如果 EL1 使用 AArch32 状态,使用 MRC 对以下寄存器的访问被陷入到 EL2,并使用 EC 综合征值 0x03 报告;使用 MRRC 的访问被陷入到 EL2,并使用 EC 综合征值 0x04 报告:SCTLR, TTBR0, TTBR1, TTBCR, TTBCR2, DACR, DFSR, IFSR, DFAR, IFAR, ADFSR, AIFSR, PRRR, NMRR, MAIR0, MAIR1, AMAIR0, AMAIR1, CONTEXTIDR。

| TRVM | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对指定虚拟内存控制寄存器的读访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

**注意**

EL2 提供第二级地址转换,Hypervisor 可以使用它来重映射客户操作系统定义的地图。此外,Hypervisor 可以陷入客户操作系统对控制内存系统的寄存器的写尝试。Hypervisor 可能将此陷阱用作其内存管理虚拟化的一部分。

该字段复位为架构上未知的值。

**HCD,位 [29]**

HVC 指令禁用。当在当前安全状态下 EL2 被使能时,禁用 EL1 执行 HVC 指令(两种执行状态),使用 EC 综合征值 0x00 报告。

| HCD | 含义 |

|-----|------|

| 0b0 | HVC 指令在 EL2 和 EL1 层被使能。 |

| 0b1 | HVC 指令在 EL2 和 EL1 层是未定义的。任何由此产生的异常被路由到执行 HVC 指令的异常等级。 |

**注意**

HVC 指令在 EL0 层总是未定义的。

仅当未实现 EL3 时,该位才被实现。否则,它为 RES0。

该字段复位为架构上未知的值。

**TDZ,位 [28]**

陷入 DC ZVA 指令。当在当前安全状态下 EL2 被使能时,将 EL0 和 EL1 执行 DC ZVA 指令(仅限 AArch64 状态)陷入到 EL2,使用 EC 综合征值 0x18 报告。

如果实现了 ARMv8.5-MemTag,此陷阱也适用于 DC GVA 和 DC GZVA。

| TDZ | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 在 AArch64 状态下,当在当前安全状态下 EL2 被使能时,任何在 EL1 层、或在 EL0 层(当指令在 EL0 非未定义时)尝试执行此陷阱适用的指令,都会被陷入到 EL2。读取 DCZID_EL0 返回一个值,指示此陷阱适用的指令不受支持。 |

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**TGE,位 [27]**

从 EL0 陷入一般异常。

| TGE | 含义 |

|-----|------|

| 0b0 | 此控制对 EL0 的执行没有影响。 |

| 0b1 | 当 EL2 在当前安全状态下未被使能时,此控制对 EL0 的执行没有影响。当 EL2 在当前安全状态下被使能时,在所有情况下:• 所有本应路由到 EL1 的异常都被路由到 EL2。• SCTLR_EL1.M 字段(或者如果 EL1 使用 AArch32,则为 SCTLR.M 字段)除了返回直接读 SCTLR_EL1 或 SCTLR 的结果外,被视为 0。• 所有虚拟中断被禁用。• 任何用于发信号通知虚拟中断的实现定义机制被禁用。• 返回到 EL1 的异常返回被视为非法异常返回。• MDCR_EL2.{TDRA, TDOSA, TDA, TDE} 字段除了返回直接读 MDCR_EL2 的结果外,被视为 1。此外,当 EL2 在当前安全状态下被使能时,如果:• HCR_EL2.E2H 为 0,则 HCR_EL2.{FMO, IMO, AMO} 字段的有效值为 1。• HCR_EL2.E2H 为 1,则 HCR_EL2.{FMO, IMO, AMO} 字段的有效值为 0。关于 E2H 为 1 时该位行为的更多信息,请参见 HCR_EL2.E2H 的行为。 |

HCR_EL2.TGE 不得缓存在 TLB 中。

该字段复位为架构上未知的值。

**TVM,位 [26]**

陷入虚拟内存控制寄存器的写操作。当在当前安全状态下 EL2 被使能时,将 EL1 对虚拟内存控制寄存器的写访问陷入到 EL2,两种执行状态均适用,具体如下:

• 如果 EL1 使用 AArch64 状态,以下寄存器被陷入到 EL2,并使用 EC 综合征值 0x18 报告:SCTLR_EL1, TTBR0_EL1, TTBR1_EL1, TCR_EL1, ESR_EL1, FAR_EL1, AFSR0_EL1, AFSR1_EL1, MAIR_EL1, AMAIR_EL1, CONTEXTIDR_EL1。

• 如果 EL1 使用 AArch32 状态,使用 MCR 对以下寄存器的访问被陷入到 EL2,并使用 EC 综合征值 0x03 报告;使用 MCRR 的访问被陷入到 EL2,并使用 EC 综合征值 0x04 报告:SCTLR, TTBR0, TTBR1, TTBCR, TTBCR2, DACR, DFSR, IFSR, DFAR, IFAR, ADFSR, AIFSR, PRRR, NMRR, MAIR0, MAIR1, AMAIR0, AMAIR1, CONTEXTIDR。

| TVM | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对指定 EL1 虚拟内存控制寄存器的写访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TTLB,位 [25]**

当实现了 ARMv8.4-TLBI 时:

陷入 TLB 维护指令。当在当前安全状态下 EL2 被使能时,将 EL1 执行 TLB 维护指令陷入到 EL2,两种执行状态均适用,具体如下:

• 当 EL1 使用 AArch64 状态时,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:◦ TLBI VMALLE1, TLBI VAE1, TLBI ASIDE1, TLBI VAAE1, TLBI VALE1, TLBI VAALE1。◦ TLBI VMALLE1IS, TLBI VAE1IS, TLBI ASIDE1IS, TLBI VAAE1IS, TLBI VALE1IS, TLBI VAALE1IS。◦ TLBI VMALLE1OS, TLBI VAE1OS, TLBI ASIDE1OS, TLBI VAAE1OS, TLBI VALE1OS, TLBI VAALE1OS。◦ TLBI RVAE1, TLBI RVAAE1, TLBI RVALE1, TLBI RVAALE1。◦ TLBI RVAE1IS, TLBI RVAAE1IS, TLBI RVALE1IS, TLBI RVAALE1IS。◦ TLBI RVAE1OS, TLBI RVAAE1OS, TLBI RVALE1OS, TLBI RVAALE1OS。

• 当 EL1 使用 AArch32 状态时,以下指令被陷入到 EL2,并使用 EC 综合征值 0x03 报告:◦ TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS, TLBIMVALIS, TLBIMVAALIS。◦ TLBIALL, TLBIMVA, TLBIASID, TLBIMVAA, TLBIMVAL, TLBIMVAAL。◦ ITLBIALL, ITLBIMVA, ITLBIASID。◦ DTLBIALL, DTLBIMVA, DTLBIASID。

| TTLB | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 执行指定的 TLB 维护指令被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

**注意**

TLB 维护指令在 EL0 层是未定义的。

该字段复位为架构上未知的值。

否则:

陷入 TLB 维护指令。当在当前安全状态下 EL2 被使能时,将 EL1 执行 TLB 维护指令陷入到 EL2,两种执行状态均适用。这适用于以下指令:

• 当 EL1 使用 AArch64 时:TLBI VMALLE1IS, TLBI VAE1IS, TLBI ASIDE1IS, TLBI VAAE1IS, TLBI VALE1IS, TLBI VAALE1IS, TLBI VMALLE1, TLBI VAE1, TLBI ASIDE1, TLBI VAAE1, TLBI VALE1, TLBI VAALE1。

• 当 EL1 使用 AArch32 时:TLBIALLIS, TLBIMVAIS, TLBIASIDIS, TLBIMVAAIS, TLBIMVALIS, TLBIMVAALIS, ITLBIALL, ITLBIMVA, ITLBIASID, DTLBIALL, DTLBIMVA, DTLBIASID, TLBIALL, TLBIMVA, TLBIASID, TLBIMVAA, TLBIMVAL, TLBIMVAAL。

| TTLB | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 执行指定的 TLB 维护指令被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TPU,位 [24]**

陷入操作到统一点的缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 或 EL0 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2,具体如下:

• 如果 EL0 使用 AArch64 状态且 SCTLR_EL1.UCI 的值不为 0,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:IC IVAU, DC CVAU。如果 SCTLR_EL1.UCI 的值为 0,这些指令在 EL0 是未定义的,任何由此产生的异常优先级高于此陷入到 EL2。

• 如果 EL1 使用 AArch64 状态,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:IC IVAU, IC IALLU, IC IALLUIS, DC CVAU。

• 如果 EL1 使用 AArch32 状态,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:ICIMVAU, ICIALLU, ICIALLUIS, DCCMVAU。

**注意**

因为指令在 EL0 未定义而产生的异常优先级高于此陷入到 EL2。此外:

• IC IALLUIS 和 IC IALLU 在使用 AArch64 的 EL0 总是未定义的。

• ICIMVAU, ICIALLU, ICIALLUIS, DCCMVAU 在使用 AArch32 的 EL0 总是未定义的。

| TPU | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定指令的执行被陷入到 EL2。 |

如果统一点位于任何数据缓存级别之前,则当该控制值为 1 时,是否能够陷入任何通过 VA 到统一点的数据或统一缓存清除指令的执行由实现定义。

如果统一点位于任何指令缓存级别之前,则当该控制值为 1 时,是否能够陷入任何到统一点的指令缓存无效指令的执行由实现定义。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**TPCP,位 [23]**

当实现了 ARMv8.2-DCPoP 时:

陷入操作到一致性点或持久点的数据或统一缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 或 EL0 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2,具体如下:

• 如果 EL0 使用 AArch64 状态且 SCTLR_EL1.UCI 的值不为 0,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:DC CIVAC, DC CVAC, DC CVAP。如果 SCTLR_EL1.UCI 的值为 0,这些指令在 EL0 是未定义的,任何由此产生的异常优先级高于此陷入到 EL2。

• 如果 EL1 使用 AArch64 状态,以下指令被陷入到 EL2,并使用 EC 综合征值 0x18 报告:DC IVAC, DC CIVAC, DC CVAC, DC CVAP。

• 如果 EL1 使用 AArch32 状态,以下指令被陷入到 EL2,并使用 EC 综合征值 0x03 报告:DCIMVAC, DCCIMVAC, DCCMVAC。

如果实现了 ARMv8.2-DCCVADP,此陷阱也适用于 DC CVADP。

如果实现了 ARMv8.5-MemTag,此陷阱也适用于 DC CIGVAC, DC CIGDVAC, DC IGVAC, DC IGDVAC, DC CGVAC, DC CGDVAC, DC CGVAP, DC CGDVAP。

如果同时实现了 ARMv8.2-DCCVADP 和 ARMv8.5-MemTag,此陷阱也适用于 DC CGVADP 和 DC CGDVADP。

**注意**

• 因为指令在 EL0 未定义而产生的异常优先级高于此陷入到 EL2。此外:◦ 使用 AArch64 的 EL0 中,通过 VA 到一致性点进行无效的 AArch64 指令总是未定义的。◦ DCIMVAC, DCCIMVAC, DCCMVAC 在使用 AArch32 的 EL0 总是未定义的。

• 在 Armv8.0 和 Armv8.1 中,该字段名为 TPC。从 Armv8.2 开始,它名为 TPCP。

| TPCP | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定指令的执行被陷入到 EL2。 |

如果一致性点位于任何数据缓存级别之前,则当该控制值为 1 时,是否能够陷入任何通过 VA 到一致性点的数据或统一缓存清除、无效或清除并无效指令的执行由实现定义。

如果 HCR_EL2.{E2H, TGE} 被设置为 {1, 1},则除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

否则:

陷入操作到一致性点的数据或统一缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 或 EL0 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2,具体如下:

• 如果 EL0 使用 AArch64 状态且 SCTLR_EL1.UCI 的值不为 0,对以下寄存器的访问被陷入,并使用 EC 综合征值 0x18 报告:DC CIVAC, DC CVAC。但是,如果 SCTLR_EL1.UCI 的值为 0,这些指令在 EL0 是未定义的,任何由此产生的异常优先级高于此陷入到 EL2。

• 如果 EL1 使用 AArch64 状态,对 DC IVAC, DC CIVAC, DC CVAC 的访问被陷入,并使用 EC 综合征值 0x18 报告。

• 当 EL1 使用 AArch32 时,对 DCIMVAC, DCCIMVAC, DCCMVAC 的访问被陷入,并使用 EC 综合征值 0x03 报告。

**注意**

• 因为指令在 EL0 未定义而产生的异常优先级高于此陷入到 EL2。此外:◦ 使用 AArch64 的 EL0 中,通过 VA 到一致性点进行无效的 AArch64 指令总是未定义的。◦ DCIMVAC, DCCIMVAC, DCCMVAC 在使用 AArch32 的 EL0 总是未定义的。

• 在 Armv8.0 和 Armv8.1 中,该字段名为 TPC。从 Armv8.2 开始,它名为 TPCP。

| TPC | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定指令的执行被陷入到 EL2。 |

如果一致性点位于任何数据缓存级别之前,则当该控制值为 1 时,是否能够陷入任何通过 VA 到一致性点的数据或统一缓存清除、无效或清除并无效指令的执行由实现定义。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**TSW,位 [22]**

陷入通过 Set/Way 操作的数据或统一缓存维护指令。当在当前安全状态下 EL2 被使能时,将在 EL1 使用 AArch64 以及 EL1 使用 AArch32 执行的这些缓存维护指令陷入到 EL2,具体如下:

• 如果 EL1 使用 AArch64 状态,对 DC ISW, DC CSW, DC CISW 的访问被陷入到 EL2,使用 EC 综合征值 0x18 报告。

• 如果 EL1 使用 AArch32 状态,对 DCISW, DCCSW, DCCISW 的访问被陷入到 EL2,使用 EC 综合征值 0x03 报告。

如果实现了 ARMv8.5-MemTag,此陷阱也适用于 DC IGSW, DC IGDSW, DC CGSW, DC CGDW, DC CIGSW, DC CIGDSW。

**注意**

因为指令在 EL0 未定义而产生的异常优先级高于此陷入到 EL2,并且这些指令在 EL0 总是未定义的。

| TSW | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定指令的执行被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TACR,位 [21]**

陷入辅助控制寄存器。当在当前安全状态下 EL2 被使能时,将 EL1 对辅助控制寄存器的访问陷入到 EL2,两种执行状态均适用,具体如下:

• 如果 EL1 使用 AArch64 状态,对 ACTLR_EL1 的访问被陷入到 EL2,并使用 EC 综合征值 0x18 报告。

• 如果 EL1 使用 AArch32 状态,对 ACTLR 以及如果实现了 ACTLR2 的访问被陷入到 EL2,并使用 EC 综合征值 0x03 报告。

| TACR | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对指定寄存器的访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

**注意**

ACTLR_EL1, ACTLR, ACTLR2 在 EL0 不可访问。

辅助控制寄存器是实现定义的寄存器,可能实现 PE 的全局控制位。

该字段复位为架构上未知的值。

**TIDCP,位 [20]**

陷入实现定义的功能。当在当前安全状态下 EL2 被使能时,将 EL1 对保留给实现定义功能的编码的访问陷入到 EL2,具体如下:

• 在 AArch64 状态下,对以下保留编码空间中的任何编码的访问被陷入,并使用 EC 综合征 0x18 报告:◦ 实现定义的系统指令,使用 SYS 和 SYSL 访问,CRn == {11, 15}。◦ 实现定义的系统寄存器,使用 MRS 和 MSR 访问,寄存器名称为 S3_<op1><Cn><Cm>_<op2>。

• 在 AArch32 状态下,对具有以下编码的指令的 MCR 和 MRC 访问被陷入,并使用 EC 综合征 0x03 报告:◦ 所有 coproc==p15, CRn==c9, opc1 == {0-7}, CRm == {c0-c2, c5-c8}, opc2 == {0-7}。◦ 所有 coproc==p15, CRn==c10, opc1 =={0-7}, CRm == {c0, c1, c4, c8}, opc2 == {0-7}。◦ 所有 coproc==p15, CRn==c11, opc1=={0-7}, CRm == {c0-c8, c15}, opc2 == {0-7}。

当 HCR_EL2.TIDCP 的值为 1 时,是否将从 EL0 访问的任何这些功能陷入到 EL2 由实现定义。如果不陷入,则它是未定义的,并且任何从 EL0 访问它的尝试都会产生一个被路由到 EL1 的异常。

| TIDCP | 含义 |

|-------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,EL1 对或执行保留给实现定义功能的指定编码的访问被陷入到 EL2。 |

实现还可以包含提供额外控制的实现定义寄存器,以实现对实现定义特性陷入的更细粒度控制。

**注意**

Arm 期望将 EL0 对这些功能的访问陷入到 EL2 是不常见的,并且仅在 Hypervisor 虚拟化 EL0 操作时使用。Arm 强烈建议,除非 Hypervisor 必须虚拟化 EL0 操作,否则 EL0 对这些功能的任何访问都是未定义的,就像实现不包含 EL2 时一样。然后 PE 将任何由此产生的异常路由到 EL1。

从 EL1 对这些寄存器的访问的陷入优先级高于因寄存器访问未定义而产生的异常。

该字段复位为架构上未知的值。

**TSC,位 [19]**

陷入 SMC 指令。当在当前安全状态下 EL2 被使能时,将 EL1 执行 SMC 指令(两种执行状态)陷入到 EL2。

如果执行在 AArch64 状态,则陷阱使用 EC 综合征值 0x17 报告;如果执行在 AArch32 状态,则陷阱使用 EC 综合征值 0x13 报告。

**注意**

HCR_EL2.TSC 陷入 SMC 指令的执行。它不是 SMC 异常的路由控制。陷阱异常和 SMC 异常具有不同的首选返回地址。

| TSC | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 如果实现了 EL3,那么当在当前安全状态下 EL2 被使能时,任何在 EL1 使用 AArch64 或 EL1 使用 AArch32 执行 SMC 指令的尝试都会被陷入到 EL2,无论 SCR_EL3.SMD 的值如何。如果未实现 EL3,实现了 ARMv8.3-NV,且 HCR_EL2.NV 为 1,那么当在当前安全状态下 EL2 被使能时,任何在 EL1 使用 AArch64 执行 SMC 指令的尝试都会被陷入到 EL2。如果未实现 EL3,并且要么未实现 ARMv8.3-NV,要么 HCR_EL2.NV 为 0,则以下行为由实现定义:• 当在当前安全状态下 EL2 被使能时,任何在 EL1 执行 SMC 指令的尝试是否被陷入到 EL2。• 任何执行 SMC 指令的尝试是否未定义。 |

在 AArch32 状态下,Armv8-A 架构允许但不要求此陷阱适用于未通过其条件码检查的条件 SMC 指令,与其他条件指令的陷阱方式相同。

SMC 指令在 EL0 是未定义的。

如果未实现 EL3 且 HCR_EL2.NV 为 0,则该位是否为 RES0 或按照 HCR_EL2.TSC 中描述的功能实现,由实现定义。

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TID3,位 [18]**

陷入 ID 组 3。当在当前安全状态下 EL2 被使能时,将 EL1 读组 3 ID 寄存器的操作陷入到 EL2,具体如下:

• 在 AArch64 状态下,读以下寄存器的操作被陷入到 EL2,使用 EC 综合征值 0x18 报告:◦ ID_PFR0_EL1, ID_PFR1_EL1, ID_DFR0_EL1, ID_AFR0_EL1, ID_MMFR0_EL1, ID_MMFR1_EL1, ID_MMFR2_EL1, ID_MMFR3_EL1, ID_ISAR0_EL1, ID_ISAR1_EL1, ID_ISAR2_EL1, ID_ISAR3_EL1, ID_ISAR4_EL1, ID_ISAR5_EL1, ID_ISAR6_EL1, MVFR0_EL1, MVFR1_EL1, MVFR2_EL1。◦ ID_AA64PFR0_EL1, ID_AA64PFR1_EL1, ID_AA64DFR0_EL1, ID_AA64DFR1_EL1, ID_AA64ISAR0_EL1, ID_AA64ISAR1_EL1, ID_AA64MMFR0_EL1, ID_AA64MMFR1_EL1, ID_AA64MMFR2_EL1, ID_AA64AFR0_EL1, ID_AA64AFR1_EL1, ID_AA64ZFR0_EL1(如果实现了 SVE),以及 ID_MMFR4_EL1。

• 在 AArch64 状态下,ID_MMFR4_EL1 和 ID_MMFR5_EL1 被陷入到 EL2,除非实现为 RAZ,此时对 ID_MMFR4_EL1 或 ID_MMFR5_EL1 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x18 报告。

• 在 AArch64 状态下,ID_AA64MMFR2_EL1 和 ID_ISAR6_EL1 被陷入到 EL2,除非实现为 RAZ,此时对 ID_AA64MMFR2_EL1 或 ID_ISAR6_EL1 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x18 报告。

• 在 AArch64 状态下,ID_DFR1_EL1 被陷入到 EL2,除非实现为 RAZ,此时对 ID_DFR1_EL1 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x18 报告。

• 在 AArch64 状态下,ID_AA64ZFR0_EL1 被陷入到 EL2,除非实现为 RAZ,此时对 ID_AA64ZFR0_EL1 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x18 报告。

• 在 AArch64 状态下,该字段是否陷入对以下范围内未在此字段描述中提及的编码的 MRS 访问,由实现定义,使用 EC 综合征值 0x18 报告:◦ Op0 == 3, op1 == 0, CRn == c0, CRm == {c2-c7}, op2 == {0-7}。

• 在 AArch32 状态下,对以下寄存器的 MRC 访问被陷入到 EL2,使用 EC 综合征值 0x03 报告:◦ ID_PFR0, ID_PFR1, ID_DFR0, ID_AFR0, ID_MMFR0, ID_MMFR1, ID_MMFR2, ID_MMFR3, ID_ISAR0, ID_ISAR1, ID_ISAR2, ID_ISAR3, ID_ISAR4, ID_ISAR5, MVFR0, MVFR1, MVFR2, ID_MMFR4。

• 在 AArch32 状态下,对 MVFR0, MVFR1, MVFR2 的 VMRS 访问,使用 EC 综合征值 0x08 报告。

• 在 AArch32 状态下,ID_MMFR4 和 ID_MMFR5 被陷入到 EL2,除非实现为 RAZ,此时对 ID_MMFR4 或 ID_MMFR5 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x03 报告。

• 在 AArch32 状态下,ID_ISAR6 被陷入到 EL2,除非实现为 RAZ,此时对 ID_ISAR6 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x03 报告。

• 在 AArch32 状态下,ID_DFR1 被陷入到 EL2,除非实现为 RAZ,此时对 ID_DFR1 的访问是否被陷入到 EL2 由实现定义,使用 EC 综合征值 0x03 报告。

• 在 AArch32 状态下,该位是否陷入对未提及的编码的 MRC 访问(coproc==p15, opc1 == 0, CRn == c0, CRm == {c2-c7}, opc2 == {0-7})由实现定义。

| TID3 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定的 EL1 读 ID 组 3 寄存器的访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TID2,位 [17]**

陷入 ID 组 2。当在当前安全状态下 EL2 被使能时,将以下寄存器访问陷入到 EL2,具体如下:

• 如果 EL1 使用 AArch64,对 CTR_EL0, CCSIDR_EL1, CCSIDR2_EL1, CLIDR_EL1, CSSELR_EL1 的读被陷入到 EL2,使用 EC 综合征值 0x18 报告。

• 如果 EL0 使用 AArch64 且 SCTLR_EL1.UCT 的值不为 0,对 CTR_EL0 的读被陷入到 EL2,使用 EC 综合征值 0x18 报告。如果 SCTLR_EL1.UCT 的值为 0,则 EL0 读 CTR_EL0 是未定义的,任何由此产生的异常优先级高于此陷阱。

• 如果 EL1 使用 AArch64,对 CSSELR_EL1 的写被陷入到 EL2,使用 EC 综合征值 0x18 报告。

• 如果 EL1 使用 AArch32,对 CTR, CCSIDR, CCSIDR2, CLIDR, CSSELR 的读被陷入到 EL2,使用 EC 综合征值 0x03 报告。

• 如果 EL1 使用 AArch32,对 CSSELR 的写被陷入到 EL2,使用 EC 综合征值 0x03 报告。

| TID2 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定的 EL1 和 EL0 对 ID 组 2 寄存器的访问被陷入到 EL2。 |

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**TID1,位 [16]**

陷入 ID 组 1。当在当前安全状态下 EL2 被使能时,将 EL1 读以下寄存器的操作陷入到 EL2,具体如下:

• 在 AArch64 状态下,对 REVIDR_EL1, AIDR_EL1 的访问,使用 EC 综合征值 0x18 报告。

• 在 AArch32 状态下,对 TCMTR, TLBTR, REVIDR, AIDR 的访问,使用 EC 综合征值 0x03 报告。

| TID1 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定的 EL1 读 ID 组 1 寄存器的访问被陷入到 EL2。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**TID0,位 [15]**

陷入 ID 组 0。将以下寄存器访问陷入到 EL2:

• EL1 读 JIDR,使用 EC 综合征值 0x05 报告。

• 如果 JIDR 从 EL0 是 RAZ,则 EL0 读 JIDR,使用 EC 综合征值 0x05 报告。

• EL1 使用 VMRS 访问 FPSID,使用 EC 综合征值 0x08 报告。

**注意**

• JIDR 在 EL0 是 RAZ 还是未定义由实现定义。如果它在 EL0 未定义,则任何由此产生的异常优先级高于此陷阱。

• 使用 AArch32 在 EL0 无法访问 FPSID。

• 对 FPSID 的写被忽略,并且不被此控制陷入。

| TID0 | 含义 |

|------|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,指定的 EL1 读 ID 组 0 寄存器的访问被陷入到 EL2。 |

在仅 AArch64 的实现中,该位为 RES0。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**TWE,位 [14]**

当在当前安全状态下 EL2 被使能时,将 EL0 和 EL1 执行 WFE 指令(两种执行状态)陷入到 EL2,使用 EC 综合征值 0x01 报告。

| TWE | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,任何在 EL0 或 EL1 执行 WFE 指令的尝试,如果该指令本来会导致 PE 进入低功耗状态,并且未被 SCTLR.nTWE 或 SCTLR_EL1.nTWE 陷入,则会被陷入到 EL2。 |

在 AArch32 状态下,仅当条件 WFE 指令通过其条件码检查时,尝试执行该指令才会被陷入。

**注意**

由于 WFE 可以在任何时候完成,即使没有唤醒事件,因此不保证一定会触发 WFE 的陷阱,即使 WFE 在没有唤醒事件时执行也是如此。唯一能保证的是,如果指令在没有唤醒事件的情况下无法在有限时间内完成,则会触发陷阱。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

关于 WFE 指令何时会导致 PE 进入低功耗状态的更多信息,请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)中的"等待事件机制和发送事件"。

该字段复位为架构上未知的值。

**TWI,位 [13]**

当在当前安全状态下 EL2 被使能时,将 EL0 和 EL1 执行 WFI 指令(两种执行状态)陷入到 EL2,使用 EC 综合征值 0x01 报告。

| TWI | 含义 |

|-----|------|

| 0b0 | 此控制不会导致任何指令被陷入。 |

| 0b1 | 当在当前安全状态下 EL2 被使能时,任何在 EL0 或 EL1 执行 WFI 指令的尝试,如果该指令本来会导致 PE 进入低功耗状态,并且未被 SCTLR.nTWI 或 SCTLR_EL1.nTWI 陷入,则会被陷入到 EL2。 |

在 AArch32 状态下,仅当条件 WFI 指令通过其条件码检查时,尝试执行该指令才会被陷入。

**注意**

由于 WFI 可以在任何时候完成,即使没有唤醒事件,因此不保证一定会触发 WFI 的陷阱,即使 WFI 在没有唤醒事件时执行也是如此。唯一能保证的是,如果指令在没有唤醒事件的情况下无法在有限时间内完成,则会触发陷阱。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

关于 WFI 指令何时会导致 PE 进入低功耗状态的更多信息,请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)中的"等待中断"。

该字段复位为架构上未知的值。

**DC,位 [12]**

默认缓存性。

| DC | 含义 |

|----|------|

| 0b0 | 此控制对 EL1&0 转换机制没有影响。 |

| 0b1 | 在两种安全状态下:• 当 EL1 使用 AArch64 时,除了返回直接读 SCTLR_EL1 的值外,PE 的行为如同 SCTLR_EL1.M 字段的值为 0。• 当 EL1 使用 AArch32 时,除了返回直接读 SCTLR 的值外,PE 的行为如同 SCTLR.M 字段的值为 0。• 除了返回直接读 HCR_EL2 的值外,PE 的行为如同 HCR_EL2.VM 字段的值为 1。• EL1&0 转换机制的第一级产生的内存类型为 Normal Non-Shareable, Inner Write-Back Read-Allocate Write-Allocate, Outer Write-Back Read-Allocate Write-Allocate。 |

该字段对 EL2、EL2&0 和 EL3 转换机制没有影响。

该字段允许缓存在 TLB 中。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该字段的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。

**BSU,位 [11:10]**

屏障可共享性升级。该字段确定应用于从 EL1 或 EL0 执行的任何屏障指令的最小可共享性域:

| BSU | 含义 |

|-----|------|

| 0b00 | 无影响。 |

| 0b01 | 内可共享。 |

| 0b10 | 外可共享。 |

| 0b11 | 全系统。 |

该值与屏障指令中指定的级别相结合,使用与组合两个地址转换阶段的可共享性属性相同的原则。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0b00。

该字段复位为架构上未知的值。

**FB,位 [9]**

强制广播。使得当从 EL1 执行以下指令时,在内可共享域内广播:

AArch32: BPIALL, TLBIALL, TLBIMVA, TLBIASID, DTLBIALL, DTLBIMVA, DTLBIASID, ITLBIALL, ITLBIMVA, ITLBIASID, TLBIMVAA, ICIALLU, TLBIMVAL, TLBIMVAAL。

AArch64: TLBI VMALLE1, TLBI VAE1, TLBI ASIDE1, TLBI VAAE1, TLBI VALE1, TLBI VAALE1, IC IALLU, TLBI RVAE1, TLBI RVAAE1, TLBI RVALE1, TLBI RVAALE1。

| FB | 含义 |

|----|------|

| 0b0 | 该字段对指定指令的操作没有影响。 |

| 0b1 | 当指定指令之一在 EL1 执行时,该指令在内可共享域内广播。 |

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**VSE,位 [8]**

虚拟 SError 中断。

| VSE | 含义 |

|-----|------|

| 0b0 | 此机制未使虚拟 SError 中断挂起。 |

| 0b1 | 由于此机制,一个虚拟 SError 中断正在挂起。 |

虚拟 SError 中断仅在 HCR_EL2.{TGE, AMO} 的值为 {0, 1} 时使能。

该字段复位为架构上未知的值。

**VI,位 [7]**

虚拟 IRQ 中断。

| VI | 含义 |

|----|------|

| 0b0 | 此机制未使虚拟 IRQ 挂起。 |

| 0b1 | 由于此机制,一个虚拟 IRQ 正在挂起。 |

虚拟 IRQ 仅在 HCR_EL2.{TGE, IMO} 的值为 {0, 1} 时使能。

该字段复位为架构上未知的值。

**VF,位 [6]**

虚拟 FIQ 中断。

| VF | 含义 |

|----|------|

| 0b0 | 此机制未使虚拟 FIQ 挂起。 |

| 0b1 | 由于此机制,一个虚拟 FIQ 正在挂起。 |

虚拟 FIQ 仅在 HCR_EL2.{TGE, FMO} 的值为 {0, 1} 时使能。

该字段复位为架构上未知的值。

**AMO,位 [5]**

物理 SError 中断路由。

| AMO | 含义 |

|-----|------|

| 0b0 | 当在低于 EL2 的异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 SError 中断不会被路由到 EL2。• 当 HCR_EL2.TGE 的值为 0 时,如果 PE 在 EL2 使用 AArch64 执行,则物理 SError 中断不会被接收,除非它们被 SCR_EL3.EA 位路由到 EL3。• 虚拟 SError 中断被禁用。 |

| 0b1 | 当在任何异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 SError 中断被路由到 EL2,除非它们被路由到 EL3。• 当 HCR_EL2.TGE 的值为 0 时,虚拟 SError 中断被使能。 |

如果 EL2 在当前安全状态下被使能且 HCR_EL2.TGE 的值为 1:

• 无论 AMO 位的值如何,物理异步外部中止和 SError 中断的目标是 EL2,除非它们被路由到 EL3。

• 当未实现 ARMv8.1-VHE,或者 HCR_EL2.E2H 为 0 时,除了直接读取该位的值外,该字段的行为如同 1。

• 当实现了 ARMv8.1-VHE 且 HCR_EL2.E2H 为 1 时,除了直接读取该位的值外,该字段的行为如同 0。

更多信息请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)第 D1 节(AArch64 系统级编程模型)中的"异步异常路由"。

该字段复位为架构上未知的值。

**IMO,位 [4]**

物理 IRQ 路由。

| IMO | 含义 |

|-----|------|

| 0b0 | 当在低于 EL2 的异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 IRQ 中断不会被路由到 EL2。• 当 HCR_EL2.TGE 的值为 0 时,如果 PE 在 EL2 使用 AArch64 执行,则物理 IRQ 中断不会被接收,除非它们被 SCR_EL3.IRQ 位路由到 EL3。• 虚拟 IRQ 中断被禁用。 |

| 0b1 | 当在任何异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 IRQ 中断被路由到 EL2,除非它们被路由到 EL3。• 当 HCR_EL2.TGE 的值为 0 时,虚拟 IRQ 中断被使能。 |

如果 EL2 在当前安全状态下被使能,且 HCR_EL2.TGE 的值为 1:

• 无论 IMO 位的值如何,物理 IRQ 中断的目标是 EL2,除非它们被路由到 EL3。

• 当未实现 ARMv8.1-VHE,或者 HCR_EL2.E2H 为 0 时,除了直接读取该位的值外,该字段的行为如同 1。

• 当实现了 ARMv8.1-VHE 且 HCR_EL2.E2H 为 1 时,除了直接读取该位的值外,该字段的行为如同 0。

更多信息请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)第 D1 节中的"异步异常路由"。

该字段复位为架构上未知的值。

**FMO,位 [3]**

物理 FIQ 路由。

| FMO | 含义 |

|-----|------|

| 0b0 | 当在低于 EL2 的异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 FIQ 中断不会被路由到 EL2。• 当 HCR_EL2.TGE 的值为 0 时,如果 PE 在 EL2 使用 AArch64 执行,则物理 FIQ 中断不会被接收,除非它们被 SCR_EL3.FIQ 位路由到 EL3。• 虚拟 FIQ 中断被禁用。 |

| 0b1 | 当在任何异常等级执行,且 EL2 在当前安全状态下被使能时:• 物理 FIQ 中断被路由到 EL2,除非它们被路由到 EL3。• 当 HCR_EL2.TGE 为 0 时,虚拟 FIQ 中断被使能。 |

如果 EL2 在当前安全状态下被使能且 HCR_EL2.TGE 的值为 1:

• 无论 FMO 位的值如何,物理 FIQ 中断的目标是 EL2,除非它们被路由到 EL3。

• 当未实现 ARMv8.1-VHE,或者 HCR_EL2.E2H 为 0 时,除了直接读取该位的值外,该字段的行为如同 1。

• 当实现了 ARMv8.1-VHE 且 HCR_EL2.E2H 为 1 时,除了直接读取该位的值外,该字段的行为如同 0。

更多信息请参见 Arm® 架构参考手册 Armv8(针对 Armv8-A 架构配置文件)第 D1 节中的"异步异常路由"。

该字段复位为架构上未知的值。

**PTW,位 [2]**

保护的表遍历。在 EL1&0 转换机制中,作为第一级转换表遍历一部分的转换表访问需经过第二级转换。来自两个转换阶段的内存类型属性的组合意味着该访问可能针对设备内存类型。如果发生这种情况,则该位的值决定行为:

| PTW | 含义 |

|-----|------|

| 0b0 | 转换表遍历如同对 Normal Non-cacheable 内存进行。这意味着它可以被推测性地执行。 |

| 0b1 | 内存访问产生第二级权限故障。 |

该字段允许缓存在 TLB 中。

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**SWIO,位 [1]**

Set/Way 无效覆盖。使得 EL1 执行通过 set/way 的数据缓存无效指令时,执行通过 set/way 的数据缓存清除并无效:

| SWIO | 含义 |

|------|------|

| 0b0 | 此控制对通过 set/way 的数据缓存无效指令的操作没有影响。 |

| 0b1 | 通过 set/way 的数据缓存无效指令执行通过 set/way 的数据缓存清除并无效。 |

当该位的值为 1 时:

AArch32: DCISW 执行与 DCCISW 指令相同的无效操作。

AArch64: DC ISW 执行与 DC CISW 指令相同的无效操作。

该位可以实现为 RES1。

当 HCR_EL2.TGE 为 1 时,除了直接读取该字段外,PE 忽略该字段的值。

该字段复位为架构上未知的值。

**VM,位 [0]**

虚拟化使能。当在当前安全状态下 EL2 被使能时,为 EL1&0 转换机制使能第二级地址转换。

| VM | 含义 |

|----|------|

| 0b0 | EL1&0 第二级地址转换禁用。 |

| 0b1 | EL1&0 第二级地址转换使能。 |

当该位的值为 1 时,在 EL1 执行的数据缓存无效指令执行数据缓存清除并无效。对于通过 set/way 的无效指令,此行为适用,无论 HCR_EL2.SWIO 位的值如何。

该位允许缓存在 TLB 中。

当实现了 ARMv8.1-VHE,且 HCR_EL2.{E2H, TGE} 的值为 {1, 1} 时,除了直接读取该位的值外,该字段的行为如同 0。

该字段复位为架构上未知的值。


**访问 HCR_EL2**

对此寄存器的访问使用以下编码:

MRS <Xt>, HCR_EL2

| op0 | op1 | CRn | CRm | op2 |

|-----|-----|-----|-----|-----|

| 0b11 | 0b100 | 0b0001 | 0b0001 | 0b000 |

如果 PSTATE.EL == EL0,则 未定义;

否则如果 PSTATE.EL == EL1,则

如果 EL2Enabled() && HCR_EL2.<NV2,NV> == '11',则 返回 NVMem[0x078];

否则如果 EL2Enabled() && HCR_EL2.NV == '1',则 AArch64.SystemAccessTrap(EL2, 0x18);

否则 未定义;

否则如果 PSTATE.EL == EL2,则 返回 HCR_EL2;

否则如果 PSTATE.EL == EL3,则 返回 HCR_EL2;

MSR HCR_EL2, <Xt>

| op0 | op1 | CRn | CRm | op2 |

|-----|-----|-----|-----|-----|

| 0b11 | 0b100 | 0b0001 | 0b0001 | 0b000 |

如果 PSTATE.EL == EL0,则 未定义;

否则如果 PSTATE.EL == EL1,则

如果 EL2Enabled() && HCR_EL2.<NV2,NV> == '11',则 NVMem[0x078] = X[t];

否则如果 EL2Enabled() && HCR_EL2.NV == '1',则 AArch64.SystemAccessTrap(EL2, 0x18);

否则 未定义;

否则如果 PSTATE.EL == EL2,则 HCR_EL2 = X[t];

否则如果 PSTATE.EL == EL3,则 HCR_EL2 = X[t];

相关推荐
liuluyang5304 小时前
VMPIDR_EL2,虚拟化多处理器 ID 寄存器
armv8
tianrun12345 小时前
ARMv8 两级页表内存属性合并原理
虚拟化·mmu·armv8
Jia ming2 个月前
ARMv8内存模型与屏障指令详解
armv8·内存模型·内存屏障
openHiTLS密码开源社区5 个月前
ARM架构深度解析:ARMv7、ARMv8、ARMv9的技术演进、芯片实现与未来展望
armv8·armv9·armv7·cortex-m·sve2·cca架构
全栈工程师修炼日记6 个月前
ARMv8系统的安全性(一):安全目标是什么?
安全·trustzone·armv8
liuluyang5309 个月前
ARMv8 创建3级页表示例
mmu·armv8·页表
代码改变世界ctw1 年前
Armv8/Armv9架构从入门到精通-介绍
arm·trustzone·atf·tee·armv8·armv9·周贺贺
Wanliang Li1 年前
Linux电源管理——CPU Hotplug 流程
linux·嵌入式硬件·嵌入式·armv8·电源管理·cpuhotplug
代码改变世界ctw1 年前
如何学习Trustzone
安全·trustzone·atf·optee·tee·armv8·armv9