目前状态:
1,cpu冷启动处于EL3状态,软件将EL3的aarch64 切换到 EL2的aarch64 ,最后切换到EL1的aarch32 的svc模式。
问题:
1,当EL1的aarch32 的svc模式,执行完当前的code,然后需要切换到aarch64运行环境。2,目前看到的资料需要由更高级别的EL才可以切换低级别的运行环境。3,请问需要具体怎么操作才可以有aarch32切换回aarch64运行环境。
code如下:
下面切换code转化成机器码运行,切换成功后运行aarch32的code。
// Initialize SCTLR_EL2 and HCR_EL2 to save values before entering EL2.MSR SCTLR_EL2, XZRMSR HCR_EL2, XZR// Determine the EL2 Execution state.MRS X0, SCR_EL3ORR X0, X0, #(1<<10) // RW EL2 Execution state is AArch64.ORR X0, X0, #(1<<0) // NS EL1 is Non-secure world.MSR SCR_EL3, x0MOV X0, #0b01001 // DAIF=0000MSR SPSR_EL3, X0 // M[4:0]=01001 EL2h must match SCR_EL3.RW// Determine EL2 entry.ADR X0, el2_entry // el2_entry points to the first instruction ofMSR ELR_EL3, X0 // EL2 code.ERETel2_entry:// Initialize the SCTLR_EL1 register before entering EL1.MSR SCTLR_EL1, XZRMRS X0, HCR_EL2BIC X0, X0, #(1<<31) // RW=0 EL1 Execution state is AArch32.MSR HCR_EL2, X0MOV X0, #0b10011 // DAIF=0000MSR SPSR_EL2, X0 // M[4:0]=10011 EL1 is SVC mode must match HCR_EL2.RW.// Determine EL1 Execution state.ADR X0, el1_entry // el1_entry points to the first instruction of SVCMSR ELR_EL2, X0 // mode code.ERETel1_entry:
aarch32 code。。。
Hi Jiangzhou,
你好,就像你刚才提到的,如果从AArch32 切换到AArch64只能到更高的特权级,因为你的EL2和EL3都是AArch64的,你直接调用SMC(如果没有被trap到EL2的话)就回切换到EL3,那么就是AArch64 模式了;或者你调用HVC指令,就会切换到EL2,也就是AArch64 mode了。