SCTLR_EL1,系统控制寄存器(EL1)
SCTLR_EL1 的特性如下:
用途
在 EL1 和 EL0 异常级别下,提供系统顶层控制,包括存储系统控制。
配置
AArch64 系统寄存器 SCTLR_EL1 的位 [31:0] 在架构上映射到 AArch32 系统寄存器 SCTLR [31:0]。
本寄存器的部分或全部可读写(RW)字段具有定义好的复位值。仅当处理引擎(PE)复位后进入 AArch64 架构的 EL1 模式时,这些复位值才有效。否则,本寄存器中的可写字段复位为架构规定的 ** 未知(UNKNOWN)** 值。
属性
SCTLR_EL1 是一个 64 位寄存器。
字段说明
SCTLR_EL1 位分配如下:
63 62 61 60 59 58 57 56 55 54 53 52 51 50 RES0 49 48 47 46 TWEDEL 45 TWEDEn 44 DSSBS 43 ATA 42 ATA0 41 40 TCF 39 38 TCF0 37 ITFSB 36 BT1 35 BT0 34 33 32 RES0 31 EnIA 30 EnIB 29 LSMAOE 28 nTLSMD 27 EnDA 26 UCI 25 EE 24 E0E 23 SPAN 22 EIS 21 IESB 20 TSCXT 19 WXN 18 nTWE 17 RES0 16 nTWI 15 UCT 14 DZE 13 I 12 EOS 11 EnRCTX 10 UMA 9 SED 8 ITD 7 nAA 6 CP15BEN 5 SA0 4 SA 3 C 2 A 1 M 0 EnDB位 [63:50]
保留,必须写 0(RES0)。
TWEDEL,位 [49:46]
实现 ARMv8.6-TWED 时有效:WFE 陷阱延迟。4 位无符号数。当 SCTLR_EL1.TWEDEn = 1 时,对由 SCTLR_EL1.nTWE 触发的 WFE 指令陷阱,编码其最小触发延迟为2^(TWEDEL + 8)个周期。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
TWEDEn,位 [45]
实现 ARMv8.6-TWED 时有效:WFE 陷阱延迟使能。对由 SCTLR_EL1.nTWE 触发的 WFE 指令陷阱,启用可配置的延迟陷阱功能。
- 0b0:WFE 陷阱延迟由实现定义
- 0b1:WFE 陷阱延迟至少为 SCTLR_EL1.TWEDEL 定义的周期数
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
DSSBS,位 [44]
实现 ARMv8.0-SSBS 时有效:异常进入时 PSTATE.SSBS 的默认值。
- 0b0:进入 EL1 异常时,PSTATE.SSBS 置 0
- 0b1:进入 EL1 异常时,PSTATE.SSBS 置 1
在 PE 复位进入 EL1 的系统中,该字段复位为实现定义值。
其他情况:保留,RES0。
ATA,位 [43]
实现 ARMv8.5-MemTag(内存标签扩展)时有效:EL1 级分配标签访问控制。当 SCR_EL3.ATA=1 且 HCR_EL2.ATA=1 时,控制 EL1 对分配标签的访问。
禁止访问分配标签时:
加载 / 存储数据指令为非检查模式
加载 / 存储分配标签指令将其视为读零 / 忽略写(RAZ/WI)
向地址插入逻辑地址标签的指令,将生成标签所用的分配标签视为 0
使缓存分配标签失效的缓存维护指令,行为等价于清理并失效分配标签
0b0:禁止访问分配标签
0b1:允许访问分配标签
该位可被 TLB 缓存。在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
ATA0,位 [42]
实现 ARMv8.5-MemTag 时有效:EL0 级分配标签访问控制。当 SCR_EL3.ATA=1、HCR_EL2.ATA=1 且 HCR_EL2.{E2H,TGE} ≠ {1,1} 时,控制 EL0 对分配标签的访问。
限制规则与 ATA 一致。
- 0b0:禁止 EL0 访问分配标签
- 0b1:允许 EL0 访问分配标签
该字段可被 TLB 缓存。
注:软件可在上下文切换时修改该控制位。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
TCF,位 [41:40]
实现 ARMv8.5-MemTag 时有效:EL1 级标签检查失败处理。控制 EL1 中加载 / 存储导致标签检查失败的行为。
- 0b00:标签检查失败对 PE 无影响
- 0b01:标签检查失败触发同步异常
- 0b10:标签检查失败异步累积
- 0b11:保留
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
TCF0,位 [39:38]
实现 ARMv8.5-MemTag 时有效:EL0 级标签检查失败处理。当 HCR_EL2.{E2H,TGE} ≠ {1,1} 时,控制 EL0 加载 / 存储标签检查失败行为。
取值含义同 TCF。
注:软件可在上下文切换时修改该控制位。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
ITFSB,位 [37]
实现 ARMv8.5-MemTag 时有效:当 EL0/EL1 加载 / 存储的标签检查失败不产生同步异常时,控制标签检查失败向 TFSRE0_EL1 和 TFSR_EL1 的自动同步。
- 0b0:进入 EL1 时不同步标签检查失败状态
- 0b1:进入 EL1 时同步标签检查失败状态
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
BT1,位 [36]
实现 ARMv8.5-BTI(分支目标识别)时有效:EL1 级 PAC 分支类型兼容性。
- 0b0:EL1 执行时,PACIASP / PACIBSP 与 PSTATE.BTYPE == 0b11 兼容
- 0b1:EL1 执行时,PACIASP / PACIBSP 与 PSTATE.BTYPE == 0b11 不兼容
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
BT0,位 [35]
实现 ARMv8.5-BTI 时有效:EL0 级 PAC 分支类型兼容性。
- 0b0:EL0 执行时,PACIASP / PACIBSP 与 PSTATE.BTYPE == 0b11 兼容
- 0b1:EL0 执行时,PACIASP / PACIBSP 与 PSTATE.BTYPE == 0b11 不兼容
当 HCR_EL2.E2H == 1 且 HCR_EL2.TGE == 1 时,该位对 EL0 执行无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
位 [34:32]
保留,RES0。
EnIA,位 [31]
实现 ARMv8.3-PAuth(指针认证)时有效:在 EL1&0 地址转换域中,控制 ** 指令地址指针认证(APIAKey_EL1 密钥)** 的使能。
- 0b0:禁用指令地址指针认证
- 0b1:启用指令地址指针认证
注:该字段控制 AddPACIA / AuthIA 伪代码函数。为 1 时生效,为 0 时为空操作(NOP)。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
EnIB,位 [30]
实现 ARMv8.3-PAuth 时有效:在 EL1&0 转换域中,控制 ** 指令地址指针认证(APIBKey_EL1 密钥)** 使能。
含义与 EnIA 类似,密钥不同。在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
LSMAOE,位 [29]
实现 ARMv8.2-LSMAOC 时有效:多加载 / 多存储指令原子性与顺序性使能。
- 0b0:EL0 下 A32/T32 多加载 / 多存储可在访存序列中被中断,且不要求访存有序
- 0b1:EL0 下 A32/T32 多加载 / 多存储的顺序与中断行为遵循 Armv8.0 定义
该位可被 TLB 缓存。实现 ARMv8.1-VHE 且 HCR_EL2.{E2H,TGE}={1,1} 时,对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,必须写 1(RES1)。
nTLSMD,位 [28]
实现 ARMv8.2-LSMAOC 时有效:不陷阱多加载 / 多存储至设备 nGRE/nGnRE/nGnRnE 内存。
- 0b0:EL0 下 A32/T32 多加载 / 多存储访问第一阶段标记为设备内存时,触发陷阱并产生对齐错误
- 0b1:不触发上述陷阱
该位可被 TLB 缓存。VHE 场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES1。
EnDA,位 [27]
实现 ARMv8.3-PAuth 时有效:在 EL1&0 转换域中,控制 ** 数据地址指针认证(APDAKey_EL1 密钥)** 使能。
- 0b0:禁用数据地址指针认证
- 0b1:启用数据地址指针认证
注:控制 AddPACDA / AuthDA 函数,为 1 生效,为 0 为空操作。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
UCI,位 [26]
陷阱 EL0 缓存维护指令。仅 AArch64 态,陷阱至 EL1 或 EL2,EC 异常码 0x18。覆盖指令:DC CVAU、DC CIVAC、DC CVAC、DC CVAP、IC IVAU 等,随扩展特性增加。
- 0b0:EL0 AArch64 执行指定指令将被陷阱
- 0b1:不由此控制位触发陷阱
VHE 特定场景下对 EL0 无影响。在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
EE,位 [25]
EL1 数据访问端序及 EL1&0 第一阶段页表遍历端序。
- 0b0:小端
- 0b1:大端
该位可被 TLB 缓存。VHE 特定场景下对 PE 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为实现定义值。
E0E,位 [24]
EL0 数据访问端序。
- 0b0:EL0 小端
- 0b1:EL0 大端
对 EL1 执行的 LDTR/STTR 系列指令端序无影响。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
SPAN,位 [23]
实现 ARMv8.1-PAN(特权访问永不)时有效:进入 EL1 异常时设置 PAN。
- 0b0:进入 EL1 异常时 PSTATE.PAN 置 1
- 0b1:进入 EL1 异常时保持 PSTATE.PAN 不变
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES1。
EIS,位 [22]
实现 ARMv8.5-CSEH 时有效:异常入口为上下文同步事件。
- 0b0:进入 EL1 异常不是上下文同步事件
- 0b1:进入 EL1 异常是上下文同步事件
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES1。
IESB,位 [21]
实现 ARMv8.2-IESB 时有效:隐式错误同步事件使能。
- 0b0:禁用
- 0b1:在每次进入 EL1 异常时、EL1 执行每条 ERET 前,插入隐式错误同步事件
调试状态下行为不可预测。在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
TSCXT,位 [20]
实现 ARMv8.0-CSV2 时有效:陷阱 EL0 AArch64 访问 SCXTNUM_EL0 寄存器。
- 0b0:不禁用 EL0 访问 SCXTNUM_EL0
- 0b1:禁用 EL0 访问,触发异常;SCXTNUM_EL0 视为 0
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES1。
WXN,位 [19]
写权限隐含不可执行(XN)。对 EL1&0 转换域,强制所有可写内存区域视为不可执行。
- 0b0:对内存访问权限无影响
- 0b1:EL1&0 中可写区域强制为 XN
仅在 SCTLR_EL1.M=1 时有效。该位可被 TLB 缓存。VHE 特定场景下对 PE 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
nTWE,位 [18]
陷阱 EL0 WFE 指令,两种执行状态均有效,EC 异常码 0x01。
- 0b0:EL0 执行 WFE 且将进入低功耗时触发陷阱
- 0b1:不由此控制位触发陷阱
AArch32 下仅条件满足的 WFE 会被陷阱。
注:WFE/WFI 可随时完成,陷阱不保证一定触发;仅保证无唤醒事件且无法有限时间完成时触发陷阱。
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
位 [17]
保留,RES0。
nTWI,位 [16]
陷阱 EL0 WFI 指令,两种执行状态均有效,EC 异常码 0x01。
含义与 nTWE 类似,针对 WFI。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
UCT,位 [15]
陷阱 EL0 AArch64 访问 CTR_EL0 寄存器,EC 0x18。
- 0b0:EL0 访问 CTR_EL0 被陷阱
- 0b1:不触发陷阱
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
DZE,位 [14]
陷阱 EL0 AArch64 执行 DC ZVA 指令,EC 0x18。实现 MemTag 时还覆盖 DC GVA / DC GZVA。
- 0b0:EL0 执行相关指令被陷阱;EL0 读 DCZID_EL0.DZP 返回 1
- 0b1:不触发陷阱
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
EnDB,位 [13]
实现 ARMv8.3-PAuth 时有效:在 EL1&0 转换域中,控制 ** 数据地址指针认证(APDBKey_EL1 密钥)** 使能。
- 0b0:禁用
- 0b1:启用
注:控制 AddPACDB / AuthDB 函数。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
I,位 [12]
EL0/EL1 指令访问缓存性控制。
- 0b0:EL0/EL1 对普通内存的指令访问为各级非缓存;M=0 时为普通、外共享、内外非缓存
- 0b1:不对指令访问缓存性做额外控制;M=0 时为普通、外共享、内外写直通
HCR_EL2.DC=1 时,指令访问始终为缓存。VHE 特定场景下对 PE 无影响。
复位值为 0。
EOS,位 [11]
实现 ARMv8.5-CSEH 时有效:异常返回为上下文同步事件。
- 0b0:EL1 异常返回不是上下文同步事件
- 0b1:EL1 异常返回是上下文同步事件
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES1。
EnRCTX,位 [10]
实现 ARMv8.0-PredInv 时有效:使能 EL0 访问 AArch32/AArch64 预测上下文指令。
- 0b0:禁用并陷阱至 EL1/EL2
- 0b1:允许 EL0 访问
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
UMA,位 [9]
用户模式屏蔽访问控制。陷阱 EL0 AArch64 下访问 PSTATE.{D,A,I,F} 屏蔽位的 MSR/MRS 指令,EC 0x18。
- 0b0:EL0 访问 DAIF 相关指令被陷阱
- 0b1:不触发陷阱
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
SED,位 [8]
禁用 SETEND 指令。禁止 EL0 AArch32 执行 SETEND。
- 0b0:允许 EL0 AArch32 执行 SETEND
- 0b1:SETEND 为未定义指令,触发异常
不支持混合端序或 EL0 不支持 AArch32 时为 RES1。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
ITD,位 [7]
IT 指令禁用。限制 EL0 AArch32 下 IT 指令的部分用法。
- 0b0:全部 IT 功能启用
- 0b1:特定 IT 编码及后续指令为未定义并触发异常
EL0 不支持 AArch32 时为 RES1。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
nAA,位 [6]
实现 ARMv8.4-LSE 时有效:非对齐访问控制。在特定条件下控制 EL1/EL0 对齐错误产生。
- 0b0:LDAPR、LDAR、STLR 等一系列原子指令访问跨 16 字节边界时触发对齐错误
- 0b1:不由此位触发对齐错误
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
其他情况:保留,RES0。
CP15BEN,位 [5]
系统指令内存屏障使能。允许 EL0 AArch32 访问 CP15 编码的 DMB/DSB/ISB。
- 0b0:EL0 AArch32 执行 CP15DMB/CP15DSB/CP15ISB 为未定义并异常
- 0b1:允许执行
EL0 不支持 AArch32 时为 RES0。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
SA0,位 [4]
EL0 栈指针对齐检查使能。置 1 时,EL0 以 SP 为基址加载 / 存储,若 SP 未 16 字节对齐则触发对齐错误异常。
VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
SA,位 [3]
EL1 栈指针对齐检查使能。置 1 时,EL1 以 SP 为基址加载 / 存储未 16 字节对齐则触发对齐错误。
VHE 特定场景下对 PE 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
C,位 [2]
数据访问缓存性控制。
- 0b0:EL0/EL1 对普通内存的数据访问及页表访问为各级非缓存
- 0b1:不对数据访问缓存性做额外控制
HCR_EL2.DC=1 时忽略该位。VHE 特定场景下对 PE 无影响。
复位值为 0。
A,位 [1]
对齐检查使能。EL1/EL0 对齐错误检查总开关。
- 0b0:禁用对齐检查(独占 / 序访问指令除外)
- 0b1:启用对齐检查,访问地址与数据大小不匹配触发数据中止异常
独占 / 序访问指令始终做对齐检查,与该位无关。VHE 特定场景下对 EL0 无影响。
在 PE 复位进入 EL1 的系统中,该字段复位为架构未知值。
M,位 [0]
EL1/EL0 第一阶段地址转换(MMU)使能。
- 0b0:禁用 MMU
- 0b1:启用 MMU
HCR_EL2.{DC,TGE} ≠ {0,0} 时,非安全态行为等同于 M=0。VHE 特定场景下对 PE 无影响。
复位值为 0。
SCTLR_EL1 的访问
当 HCR_EL2.E2H = 1 时,EL3 使用 SCTLR_EL1 与 SCTLR_EL12 助记符的访问,若无显式同步,不保证有序。
访问编码
MRS <Xt>, SCTLR_EL1
plaintext
op0=0b11 op1=0b000 CRn=0b0001 CRm=0b0000 op2=0b000- EL0:未定义
- EL1:受 EL2 TVM、HFGRTR 等控制,可陷阱或直接返回
- EL2:E2H=1 时返回 SCTLR_EL2,否则返回 SCTLR_EL1
- EL3:返回 SCTLR_EL1
MSR SCTLR_EL1, <Xt>
编码同上,按异常级别与虚拟化配置执行写入或陷阱。
MRS <Xt>, SCTLR_EL12 / MSR SCTLR_EL12, <Xt>
plaintext
op0=0b11 op1=0b101 CRn=0b0001 CRm=0b0000 op2=0b000仅在 EL2/E2H=1 等特定配置下有效,其余场景为未定义。
