Arm Cortex-A53从EL3切换至EL1时触发同步异常问题排查
Arm Cortex-A53 EL3→EL1切换后同步异常挂起问题排查
启用Arm Cortex-A53四核,需触发Exception Level 1(EL1)中断,但从EL3切换至EL1过程中出现异常:跳转至el1_entry_aarch64符号后,系统挂起在同步异常处理程序(cxsynx)中。以下是代码及错误点排查:
切换代码
mov x3, #(SCR_EL3_RW | SCR_EL3_SMD | SCR_EL3_NS) // Set NS bit, to access Non-secure registers msr SCR_EL3, x3 mov x0, #(HCR_EL2_RW) msr hcr_El2, x0 // Initialize the SCTLR_EL1 register before entering EL1. MSR SCTLR_EL1, XZR mov x0, #15 msr ICC_SRE_EL2, x0 isb msr ICC_SRE_EL1, x0 // Non-secure copy of ICC_SRE_EL1 // // Get the current state and exception level mrs x0, CurrentEL and x1, x0, #0xC lsr x1, x1, #2 // Set the target PC_EL1 to the exception handler address adr x3, el1_entry_aarch64 msr elr_el3, x3 mrs x1, SPSR_EL3 msr daifset, #0xF mrs x2, SPSR_EL3 mov x2, #0x3C5 msr SPSR_EL3, x2 //Enabling IRQ by clearing bit mrs x0, daif bic x0, x0, #(1 << 7) msr daif, x0 //Disabling IRQ by masking bit mrs x0, daif orr x0, x0, #(1 << 7) msr daif, x0 // Switch to EL1 eret
核心错误点排查
- SCTLR_EL1初始化完全错误:直接将
SCTLR_EL1设为XZR(0)会导致EL1下核心功能完全失效。SCTLR_EL1控制MMU、缓存、指令集等关键配置,设为0会关闭MMU、禁用缓存,触发指令/数据访问同步异常。Cortex-A53在EL1下至少需设置M(bit0,启用MMU)、A(bit1,对齐检查)、C(bit2,数据缓存启用)等必要位,确保基本内存访问正常。 - EL3下非法访问EL1寄存器:
msr ICC_SRE_EL1, x0这行代码在EL3执行是无效操作,ICC_SRE_EL1属于EL1专属寄存器,EL3无直接访问权限,会触发未定义指令同步异常,这极可能是系统挂起在cxsynx的直接原因。需进入EL1后再配置该寄存器。 - SPSR_EL3配置逻辑混乱:代码先执行
daifset #0xF屏蔽所有异常,随后直接覆盖SPSR_EL3为0x3C5,前一步操作完全冗余。同时需确认0x3C5对应的模式和异常掩码是否符合需求:0x3C5对应EL1t模式(用户线程),DAIF掩码为D=1、A=1、I=1、F=0,即屏蔽Debug、SError、IRQ异常,允许FIQ,需结合业务场景确认是否合理。 - DAIF寄存器操作冗余无意义:先清除bit7启用IRQ,随后立即设置bit7禁用IRQ,两步操作完全抵消,既浪费周期又可能引入时序风险,应删除其中冗余步骤。
- HCR_EL2配置多余:若系统未启用EL2(Hypervisor层),
msr hcr_El2, x0属于无效操作。且SCR_EL3未设置HCE位时,HCR_EL2的配置不会生效,反而增加寄存器访问风险,应删除该段代码。
内容的提问来源于stack exchange,提问作者Hariharan
相关产品推荐
相关产品推荐

