当前位置:   article > 正文

4核a5中断linux,Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题...

arm tpidrprw

问题现象:

Cortex A5 MPcore寄存器TPIDRPRW复位值不为零,造成Linux Kernel不能启动的问题。

问题原因分析:

由于Linux Kernel内核配置使能了CONFIG_TRACE_IRQFLAGS,内核在跟踪关闭硬件中断行为时(trace_hardirqs_off_caller()),调用内核中__my_cpu_offset()(以汇编指令mrc p15, 0, r2, c13, c0, 4实现)以获取寄存器TPIDRPRW的值来获取当前线程/进程信息时,由于寄存器TPIDRPRW不能被复位和上电复位清零(在FPGA板上表现为复位或上电复位后寄存器TPIDRPRW的值保留上一次设置值,重烧逻辑后寄存器TPIDRPRW值清零),造成内核获取当前线程/进程信息的存储地址是一个非法地址,造成CPU data-abort,从而使用得内核无法正常启动.

问题解决办法:

查看Cortex A5 MPcore手册,手册里描述TPIDRPRW的复位值的地方是一个“-”,手册里没讲-是什么意思,问了一硬件设计人员,说这个寄存器没有复位值,看来应该是内核代码对寄存器TPIDRPRW的理解有误。

研究了半天,没弄清楚应该在内核哪里打补丁,只好在DS-5的启动脚本和bootloader里面打补丁的方法,先处理一下:

在DS-5脚本里添加:

set var $CP15::$System::$CP15_TPIDRPRW = 0x0

在bootloader里添加:

mov r0, #0

mcr p15, 0, r0, c13, c0, 4

问题扩展:

不是很理解为什么ARM在设计Cortex A5 MPcore寄存器TPIDRPRW时设计成没有复位值,从软件使用上来看,CPU已经复位,TPIDRPRW的值就已经完全没有意义了,没有必要保存。

哪位内核开发者有时间给内核打个补丁吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/565472
推荐阅读
相关标签
  

闽ICP备14008679号