ARMv8:EL3 中未对齐的 LDR 导致异常数据中止
ARMv8: unaligned LDR in EL3 causes exception Data Abort
我有以下 FPGA 上 ARMv8 的裸机启动代码,用于测试数据对齐访问:
.section .text.boot
.global _start
_start:
mrs x0, mpidr_el1
and x0, x0, #0xff
cbz x0, master
b proc_hang
master:
ldr x1, =stack_top
mov sp, x1
// test unaligned assess
mov x4, #0x3e61
mov x1, xzr
ldr w0, [x4, x1, lsl #0x2]
bl main
b .
proc_hang:
wfe
b proc_hang
reboot/reset,EL 为 3。
上面的ldr w0, [x4, x1, lsl #0x2]
指令会在EL3中触发Exception,PC变为0x200
,即默认VBAR_EL3的第5个入口(0x0
) .这意味着异常是CURR_EL_SPX_SYNC(根据我目前的理解,意味着当前EL3中的同步异常,使用SP3)。
此时ESR_EL3
的值设置为0x96000021
,其中EC位(异常Class,位31:26)为0b100101
,表示“数据中止”。
然而,当前SCTLR_EL3
值为0x40c50838
,其中第1位为0,表示对齐检查已禁用。我的期望是,如果对齐检查被禁用,那么上面的 LDR 指令应该成功而不会引发异常。
我的问题是:
- 这是预期的行为吗?
- 还有其他系统寄存器要set/checked吗?
顺便说一句,我也针对上述情况测试了不同的地址,结果如下:
- 0x3e60: 好的
- 0x3e61: 异常 (PC=0x200)
- 0x3e62: 同上
- 0x3e63: 同上
- 0x3e64: 好的
- 0x3e65: 异常 (PC=0x200)
- 0x3e66: 同上
- 0x3e67: 同上
- 0x3e68: 好的
仅通过设置 SCTLR_ELx.A 位,对齐故障可以配置为故障或无故障以访问普通内存。无法配置对“设备”内存的未对齐访问,如果地址未对齐,将始终导致错误。在 MMU 配置中,设备或普通内存类型可以通过在 MAIR_ELx 中编程适当的位来配置,翻译系统负责将这些属性分配给内存。
在 MMU 关闭的情况下,翻译系统为数据访问分配 Device-nGnRnE 属性,为指令访问分配 Normal 内存属性。
在您的情况下,您在 MMU 关闭配置中 运行,翻译系统分配 Device-nGnRnE 属性等故障。有关详细信息,请参阅 Arm Arm 中的 VMSA(第 5 章,D5.2.9 节)。
我有以下 FPGA 上 ARMv8 的裸机启动代码,用于测试数据对齐访问:
.section .text.boot
.global _start
_start:
mrs x0, mpidr_el1
and x0, x0, #0xff
cbz x0, master
b proc_hang
master:
ldr x1, =stack_top
mov sp, x1
// test unaligned assess
mov x4, #0x3e61
mov x1, xzr
ldr w0, [x4, x1, lsl #0x2]
bl main
b .
proc_hang:
wfe
b proc_hang
reboot/reset,EL 为 3。
上面的ldr w0, [x4, x1, lsl #0x2]
指令会在EL3中触发Exception,PC变为0x200
,即默认VBAR_EL3的第5个入口(0x0
) .这意味着异常是CURR_EL_SPX_SYNC(根据我目前的理解,意味着当前EL3中的同步异常,使用SP3)。
此时ESR_EL3
的值设置为0x96000021
,其中EC位(异常Class,位31:26)为0b100101
,表示“数据中止”。
然而,当前SCTLR_EL3
值为0x40c50838
,其中第1位为0,表示对齐检查已禁用。我的期望是,如果对齐检查被禁用,那么上面的 LDR 指令应该成功而不会引发异常。
我的问题是:
- 这是预期的行为吗?
- 还有其他系统寄存器要set/checked吗?
顺便说一句,我也针对上述情况测试了不同的地址,结果如下:
- 0x3e60: 好的
- 0x3e61: 异常 (PC=0x200)
- 0x3e62: 同上
- 0x3e63: 同上
- 0x3e64: 好的
- 0x3e65: 异常 (PC=0x200)
- 0x3e66: 同上
- 0x3e67: 同上
- 0x3e68: 好的
仅通过设置 SCTLR_ELx.A 位,对齐故障可以配置为故障或无故障以访问普通内存。无法配置对“设备”内存的未对齐访问,如果地址未对齐,将始终导致错误。在 MMU 配置中,设备或普通内存类型可以通过在 MAIR_ELx 中编程适当的位来配置,翻译系统负责将这些属性分配给内存。 在 MMU 关闭的情况下,翻译系统为数据访问分配 Device-nGnRnE 属性,为指令访问分配 Normal 内存属性。 在您的情况下,您在 MMU 关闭配置中 运行,翻译系统分配 Device-nGnRnE 属性等故障。有关详细信息,请参阅 Arm Arm 中的 VMSA(第 5 章,D5.2.9 节)。