我是 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
我做了很多测试并得到以下结论:
- 当spsr_el2设置为0x3c9时,这意味着我们将返回相同的EL(EL2)。它有效。打印是 1,2。
- 当spsr_el2设置为0x3c5时,这意味着我们将把EL改为EL1。但是,它只打印 1 而什么也没有。
我真的不知道如何解决这个问题。
我有两个问题:
- 我在切换到 EL1 时做错了什么?
- 如果能正确切换到EL1,应该在哪里设置EL1的安全状态?
非常感谢。