0

我是 ARMv8 的新手,所以在尝试更改异常级别时遇到了一些问题。启动后,我确定它在 EL2 上。但现在我想从 EL2 更改为非安全/安全 EL1。我做了一些尝试,但没有奏效。这是代码:

/* trap from EL2 to EL1 */
    .macro  arm64_el2_to_el1
    msr SPsel, #1           // We want to use SP_EL{1,2}
    
    /* lower EL is 64bits */
    mov x0, #(1 << 31)
    msr hcr_el2, x0

    mov x0, #0x0800
    movk x0, #0x30d0, lsl #16
    msr sctlr_el1, x0

    /* Set RES1 */
    mov x0, #0x33ff
    msr cptr_el2, x0

    /* CP15 AArch32 not trapped to EL2 */
    msr hstr_el2, xzr

    /* trap from EL1h, mask synchronize exception/SError/IRQ/FIQ */
    mov x0, #0x3c5
    msr spsr_el2, x0

    /* holds the address to return to */
    adr x0, 1f
    msr elr_el2, x0

    /* set exception vector table in EL1 */
    adr x0, vectors
    msr vbar_el1, x0
    //mov   x0, #3 << 20
    //msr   cpacr_el1, x0           /* Enable FP/SIMD */

    /* initialize new sp */
    mov x0, sp
    msr SP_EL1, x0

    bl print1
    
    eret

1:
    bl print2

    .endm

我做了很多测试并得到以下结论:

  1. 当spsr_el2设置为0x3c9时,这意味着我们将返回相同的EL(EL2)。它有效。打印是 1,2。
  2. 当spsr_el2设置为0x3c5时,这意味着我们将把EL改为EL1。但是,它只打印 1 而什么也没有。

我真的不知道如何解决这个问题。
我有两个问题:

  1. 我在切换到 EL1 时做错了什么?
  2. 如果能正确切换到EL1,应该在哪里设置EL1的安全状态?

非常感谢。
4

0 回答 0