EL1模式下启用SVE指令后执行FMOV崩溃,需排查哪些配置?
EL1下SVE指令崩溃的排查与配置项
当前处于EL1特权级别,EL3已通过CPTR_EL3为所有级别激活SVE,但执行FMOV写入SVE寄存器时崩溃,以下是编译用的汇编代码:
.arch armv8-a+sve // load feature register MRS x1, CPACR_EL1 // Bit 32 is sve actually implemented MRS x4, ID_AA64PFR0_EL1 TBZ x4, #32, no_sve // Set bit 16-17 and 20-21 to '1' MOV x2, #3 ORR x1, x1, x2, LSL #16 ORR x1, x1, x2, LSL #20 MSR CPACR_EL1, x1 // Set Length to Max MOV x1, #15 // crash: MSR ZCR_EL1, x1 // Clobber Register // crash: fmov z0.d, #3.0 // If sve is available return #0x7 mov w0, #0x7 ret no_sve: // If sve is NOT available return #0x9 mov w0, #0x9 ret
需要检查和补充的配置项如下:
- 必须启用ZCR_EL1配置:SVE指令依赖
ZCR_EL1寄存器定义向量长度,未配置该寄存器会触发未定义指令异常。取消代码中MSR ZCR_EL1, x1的注释,且配置后执行ISB指令同步硬件状态,确保配置生效。 - 添加配置同步指令:修改
CPACR_EL1后,必须执行ISB指令让特权配置同步到硬件流水线,否则后续SVE指令可能因为配置未生效而崩溃。在MSR CPACR_EL1, x1后添加ISB指令。 - 确认EL3侧的SVE权限配置:除了
CPTR_EL3,还要检查SCR_EL3的EA位(bit[3])设为0,确保异常路由正常;同时确认CPTR_EL3的TFP(bit[10])和TZEN(bit[12])位为0,允许非安全EL1访问FP/SVE功能。 - 验证硬件SVE支持完整性:除了检查
ID_AA64PFR0_EL1的bit32,还需读取ID_AA64ZFR0_EL1寄存器,确认硬件支持的SVE特性(如向量长度范围)与配置的ZCR_EL1参数匹配。 - 确保上下文干净:如果是上下文切换后执行SVE指令,需确认前序上下文已正确保存SVE寄存器状态,且当前上下文的CPACR_EL1、ZCR_EL1配置已重新初始化并同步。
修正后的汇编代码示例:
.arch armv8-a+sve // load feature register MRS x1, CPACR_EL1 // Bit 32 is sve actually implemented MRS x4, ID_AA64PFR0_EL1 TBZ x4, #32, no_sve // Set bit 16-17 (ZEN) and 20-21 (FPEN) to '1' MOV x2, #3 ORR x1, x1, x2, LSL #16 ORR x1, x1, x2, LSL #20 MSR CPACR_EL1, x1 ISB // 同步CPACR_EL1配置,确保权限生效 // Set Length to Max (bit[3:0] = 15) MOV x1, #15 MSR ZCR_EL1, x1 ISB // 同步ZCR_EL1配置,定义SVE向量长度 // 正常执行SVE指令 fmov z0.d, #3.0 // If sve is available return #0x7 mov w0, #0x7 ret no_sve: // If sve is NOT available return #0x9 mov w0, #0x9 ret
内容的提问来源于stack exchange,提问作者user2346536
相关产品推荐
相关产品推荐

