快速连接
👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈
最近在群里,一些小伙伴在讨论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交流讨论区。