iMX8M Mini平台ARM Cortex-A53从AArch64(EL3)切换到AArch64(EL1)失败问题排查
ARM Cortex-A53 EL3(AArch64) → EL1(AArch64) 异常切换失败排查
针对你提供的代码,以下是可能的问题点及修复建议:
1. SCR_EL3 配置缺失关键位
你的SCR_EL3设置中,RW位(bit10)配置正确(设为1表示目标EL1为AArch64模式),但遗漏了EA位(bit3)的配置。该位控制SError异常的路由,当目标EL1为AArch64时,需将EA设为1,确保SError异常能正确路由到EL3,避免切换过程中触发未处理异常。添加如下指令:
orr x2, x2, #(1 << 3) /* EA=1,将SError异常路由至EL3 */
2. EL1入口地址未对齐
AArch64指令要求4字节对齐,若el1_entry_aarch64标签未对齐,eret后取指令会触发异常。在入口标签前添加对齐指令确保地址合规:
.align 2 el1_entry_aarch64: /* EL1初始化代码,例:设置SP_EL1 */ mov sp, #0x80000000 ...
3. EL1核心寄存器未初始化
切换至EL1前,需确保SCTLR_EL1处于合法初始状态。若此前切换到AArch32 EL1时修改过该寄存器,切换回AArch64 EL1前需重置。在EL3中提前设置SCTLR_EL1为安全初始值:
mov x3, #0 msr sctlr_el1, x3 /* 关闭MMU、缓存等,进入EL1初始状态 */
4. 异常状态检查
若此前切换到AArch32 EL1后存在未处理的挂起异常,eret后可能直接触发EL3异常,导致切换失败。在切换前清除异常掩码并检查挂起状态:
msr daifclr, #0xf /* 清除所有异常掩码 */
验证要点
- 用调试器确认
eret执行前SCR_EL3、SPSR_EL3、ELR_EL3的寄存器值与预期一致 - 检查
el1_entry_aarch64的地址是否4字节对齐,且入口代码为合法AArch64指令 - 确认EL1的
SCTLR_EL1初始配置符合AArch64模式要求
内容的提问来源于stack exchange,提问作者Hariharan
相关产品推荐
相关产品推荐

