文章目录
- ARM64 Reset
- 1.1.1 reset 运行级别
- 1.1.2 warm reset 寄存器
- 1.1.3 PSCI Suspend/Resume
ARM64 Reset
ARMv8-A支持两种复位,冷复位和热复位。两者主要区别是冷复位会将debug
功能模块也一同复位,热复位在默认情况则不会复位 debug
功 能模块。
处理器收到复位信号后,依据处理器的具体实现进入所支持的 最高EL(可能是EL3/EL2,甚至EL1),SP寄存器也使用的是对应 EL下的寄存器。
复位后程序起始执行地址是预先定义的,直接从这个预先定义的地址处开始执行。RVBAR_ELx 寄存器保存着这个预先定义的起始执行地址。
1.1.1 reset 运行级别
Reset
时 PE 进入最高的异常级别,运行状态
Reset
后最高异常级别可以选用任何一种运行状态cold reset
由输入信号配置,warm reset
由RMR_ELx.AA64
配置- 如果
reset
后最高异常级别选用A64
,则:- 选用
SP_ELx
; - Reset向量的执行地址由厂商定义,
RVBAR
持有向量地址。
- 选用
1.1.2 warm reset 寄存器
ARMv8 中只要配置 RMR_EL3
寄存器,系统就会进入warm reset
,如下参考代码:
...
ldr x1, =vector_table
msr vbar_el3, x1
...
warm_reset:
mov x0, xzr
mov x0, #3
msr rmr_el3, x0
isb
dsb sy
1: wfi
b 1b
.balign 0x800
vector_table:
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
bl warm_reset
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
在 AARCH32
状态下 RMR
是 CP15协处理器的寄存器,通过以下指令访问
MRC P15, 0, <Rt>, C12, C0, 2; Read RMR into Rt
MCR P15, 0, <Rt>, C12, C0, 2; Write Rt to RMR
RMR
是 RMR_EL3
在32模式下的映射,写此寄存器将触发热复位。
系统在 cold reset
过程中,可以在 ATF
中配置 RVBAR_EL3
来指定 CPU 的 warm reset vector
的地址,warm reset
的时候 cpu 执行的函数地址就来自于这个寄存器。那么Reset vector base addr
不再局限于 00000000 / FFFF0000
了。在实现 ARMv8 SoC
的时候:通过 RVBARADDR signal
指定任意地址。
1.1.3 PSCI Suspend/Resume
系统进入 suspend
之后,会通过 PSCI
接口进入 ARM lib
库文件,然后进入bl32
,系统从 UDR
出来之后,走的应该也是 warm reset
,因为系统在 cold reset
的时候已经配置好了 RVBAR
寄存器了。
如果系统走的是cold reset,那么BL1->BL2->bl31_entrypoint
系统从 UDR
模式出来的时候,一般是在 ATF
中跳转到 kernel
,不会在走 uboot流程:
- 一方面是因为
uboot
的主要功能是启动加载kernel
,在cold reset
的过程中完成了使命。 - 另外一方面是因为
UDR
出来之后系统走的是bl32_warm_entrypoint
,在这个函数流程中不会进入uboot
。