我试图理解一些汇编代码来启动带有 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。感谢您的反馈,有点难以理解某些配置如何改变行为。
如何在 EL3 中启动 qemu raspberrypi 3b?根据我的理解,GPU 固件首先启动并将系统移动到 EL2。因此我们将无法访问任何 EL3 特定的寄存器。