baron · 3月31日 · 四川

ARMV8 code reset和warm reset的理解

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈


 title=

最近在群里,一些小伙伴在讨论code reset和warm reset,疑问很多,总是有很多不能理解的地方,可能和SOC的设计关联较大,每一家的设计可能也都不一样。做为一名非科班出身的渣渣,也不敢过多参与讨论,浪费群资源,拉低群水平,只要把自己的想法、思考写到这里了,望大神review

先弄清楚以下几个概念:

  • code reset : cpu一上电,SOC给ARM Core的signal configuration会改变RVBAR_EL3,对于主核这里一般就是就是bootrom的首地址。CPU一上电,PC指向的就是RVBAR_EL3的地址,机器就开始启动了。
  • warm reset : cpu已经上电了,此时写RMR_EL3寄存器的相关比特,触发CPU reset,此时cpu指向的也是RVBAR_EL3的地址

具体场景的介绍:

  • 串口中断中敲击reboot命令、或系统panic时导致的机器重启 :在一些的SOC厂商设计中,应该是code reboot。比如在Linux Kernel中敲击reboot,到底层还是写的一些寄存器控制pmic(或PMU),直接给cpu下电了。然后再上电,SOC还是会给Core发送signal configuration,此时RVBAR_EL3又会变成ASIC设置的值.
  • Suspend和Resume : 比如我在看ATF中的海思平台,在ATF的suspend函数,将bl31_warm_entrypoint地址写入到了SOC PMIC的一个寄存器中(上电时,该寄存器会影响的是RVBARADDR信号)。
    此时系统深睡的时候,应该是Linux Kernel调用到ATF,将bl31_warm_entrypoint地址写入到了pmu/pmic相关的寄存器中,在下一次reset时,会影响到signal configuration继而改变RVBAR_EL3的值。 然后还会给各个模块下电(给哪些模块下电是SOC的设计和逻辑),最后再给ARM Core下电, 这就算是深睡了。 Resume的时候,也是有一些SOC的硬件行为,然后再给Core上电,注意这里SOC没有重新给Core发送相关的signal configuration。那给Core上电后,一上电执行的是哪里?
    PC还是指向RVBAR_EL3中的地址,当然这是我们suspend的时候更改过的,其实就是bl31_warm_entrypoint
  • RMR_EL3 :1-3点,都没有提到RMR_EL3。 那么RMR_EL3是干啥的呢? 这是ARM的一个feature,怎么用?是你自己的设计,随便你。你写RMR_EL3中的bit,就可以触发warm reset. 一般的kernel dump、或者一些工具,就可以主动触发RMR_EL3,然后去干一些活. 还有在csdn上看到一篇高通soc的启动流程的博客,他们正常的启动流程中,某一个镜像跳转到另外一个镜像时,竟然就是写了一些RMR_EL3,触发warm_reset,另外一个镜像的地址恰好就是warm reset的跳转地址。

    关注"Arm精选"公众号,备注进ARM交流讨论区。
    图片1.png

推荐阅读
关注数
9429
内容数
190
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息