This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

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

问题现象:

  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的值就已经完全没有意义了,没有必要保存。

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