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 指令应该成功而不会引发异常。

我的问题是:

顺便说一句,我也针对上述情况测试了不同的地址,结果如下:

仅通过设置 SCTLR_ELx.A 位,对齐故障可以配置为故障或无故障以访问普通内存。无法配置对“设备”内存的未对齐访问,如果地址未对齐,将始终导致错误。在 MMU 配置中,设备或普通内存类型可以通过在 MAIR_ELx 中编程适当的位来配置,翻译系统负责将这些属性分配给内存。 在 MMU 关闭的情况下,翻译系统为数据访问分配 Device-nGnRnE 属性,为指令访问分配 Normal 内存属性。 在您的情况下,您在 MMU 关闭配置中 运行,翻译系统分配 Device-nGnRnE 属性等故障。有关详细信息,请参阅 Arm Arm 中的 VMSA(第 5 章,D5.2.9 节)。