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的值就已经完全没有意义了,没有必要保存。
哪位内核开发者有时间给内核打个补丁吧。
我发觉楼主的问题提问方式非常好,还有自己的经验分享,赞一个
向楼主学习!