A53 如何aarch32切换到aarch64

目前状态:

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, XZR
MSR HCR_EL2, XZR
// Determine the EL2 Execution state.
MRS X0, SCR_EL3
ORR X0, X0, #(1<<10) // RW EL2 Execution state is AArch64.
ORR X0, X0, #(1<<0) // NS EL1 is Non-secure world.
MSR SCR_EL3, x0
MOV X0, #0b01001 // DAIF=0000
MSR 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 of
MSR ELR_EL3, X0 // EL2 code.
ERET
el2_entry:
// Initialize the SCTLR_EL1 register before entering EL1.
MSR SCTLR_EL1, XZR
MRS X0, HCR_EL2
BIC X0, X0, #(1<<31) // RW=0 EL1 Execution state is AArch32.
MSR HCR_EL2, X0
MOV X0, #0b10011 // DAIF=0000
MSR 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 SVC
MSR ELR_EL2, X0 // mode code.
ERET
el1_entry:

aarch32 code。。。

Parents
  • Hi Jiangzhou,

    你好,就像你刚才提到的,如果从AArch32 切换到AArch64只能到更高的特权级,因为你的EL2和EL3都是AArch64的,你直接调用SMC(如果没有被trap到EL2的话)就回切换到EL3,那么就是AArch64 模式了;或者你调用HVC指令,就会切换到EL2,也就是AArch64 mode了。

Reply
  • Hi Jiangzhou,

    你好,就像你刚才提到的,如果从AArch32 切换到AArch64只能到更高的特权级,因为你的EL2和EL3都是AArch64的,你直接调用SMC(如果没有被trap到EL2的话)就回切换到EL3,那么就是AArch64 模式了;或者你调用HVC指令,就会切换到EL2,也就是AArch64 mode了。

Children
No data