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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值