【ARM64 ATF 系列 3 -- ARM64 warm reset 与 cold reset】


请阅读【嵌入式开发学习必备专栏 Cache | MMU | AMBA BUS | CoreSight | Trace32 | CoreLink | GCC | CSH | Armv8/v9 系统异常分析】


ARM64 Reset

在这里插入图片描述
ARMv8-A支持两种复位,冷复位热复位两者主要区别是冷复位会将debug 功能模块也一同复位,热复位在默认情况则不会复位 debug 功 能模块
处理器收到复位信号后,依据处理器的具体实现进入所支持的 最高EL(可能是EL3/EL2,甚至EL1),SP寄存器也使用的是对应 EL下的寄存器。
复位后程序起始执行地址是预先定义的,直接从这个预先定义的地址处开始执行。RVBAR_ELx 寄存器保存着这个预先定义的起始执行地址

1.1.1 reset 运行级别

Reset 时 PE 进入最高的异常级别,运行状态

  • Reset 后最高异常级别可以选用任何一种运行状态
  • cold reset 由输入信号配置, warm resetRMR_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 状态下 RMRCP15协处理器的寄存器,通过以下指令访问

MRC P15, 0, <Rt>, C12, C0, 2; Read RMR into Rt
MCR P15, 0, <Rt>, C12, C0, 2; Write Rt to RMR

RMRRMR_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
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值