VM (QEMU) 中的 SCR_EL3 配置

问题描述 投票:0回答:1

我试图理解一些汇编代码来启动带有 QEMU(裸机)的 Raspberry Pi 3B,但是对于 SCR_EL3 寄存器,有些东西我不理解。这是代码:

   _start:
    // in QEMU all of 4 ARM CPUs are started simultaneously
    // by default. I don't know if this is the real hw behaviour,
    // but here I jump to halt if CPU ID (stored in MPIDR
    // register, first 2 bits) is not 0
    mrs   x1, mpidr_el1
    and   x1, x1, #3
    cmp   x1, #0
    bne   hang 

    // address for stack pointer
    ldr   x1, =_start

    // drop to EL2
    mov   x2, #0x5b1    // RW=1, HCE=1, SMD=1, RES=1, NS=1
    msr   scr_el3, x2
    mov   x2, #0x3c9    // D=1, A=1, I=1, F=1 M=EL2h
    msr   spsr_el3, x2
    adr   x2, start_el2
    msr   elr_el3, x2
    eret

start_el2:
    // set sp in EL1
    msr   sp_el1, x1
    // enable AArch64 in EL1
    mov   x0, #(1 << 31)      // AArch64
    orr   x0, x0, #(1 << 1)   // SWIO hardwired on Pi3
    msr   hcr_el2, x0
    mrs   x0, hcr_el2
    // set vector address in EL1.
    ldr x0, =vector
    msr vbar_el1, x0 
    // change execution level to EL1
    mov   x2, #0x3c4         // D=1, A=1, I=1, F=1 M=EL1t
    msr   spsr_el2, x2
    adr   x2, start_el1
    msr   elr_el2, x2
    eret

start_el1:
    // set sp
    mov   sp, x1
    // Clear bss.
    ldr   x1, =__bss_start
    ldr   w2, =__bss_size
1:  cbz   w2, 2f
    str   xzr, [x1], #8
    sub   w2, w2, #1
    cbnz  w2, 1b

2:  bl main

如果我没有在scr_el3中启用HCE,那么start_el2末尾的eret将不起作用,为什么会出现这种情况?对于 NS 来说也是如此,如果我将其设置为 0,它将无法工作,但启用安全模式应该会给它更多的内存访问权限,而不会阻止 eret。然后它在RES中设置了一些位,这是一个保留空间,找不到任何原因。我知道 RW 是为了在 aarch64 上工作。在另一块硬盘上,spsr_el 配置为在异常返回后设置 IQR、FIQ 和 SError。当EL3执行异常时也返回EL2。感谢您的反馈,有点难以理解某些配置如何改变行为。

exception raspberry-pi arm bare-metal
1个回答
0
投票

如何在 EL3 中启动 qemu raspberrypi 3b?根据我的理解,GPU 固件首先启动并将系统移动到 EL2。因此我们将无法访问任何 EL3 特定的寄存器。

© www.soinside.com 2019 - 2024. All rights reserved.