Unable to handle kernel NULL pointer dereference at virtual address

1:从sd卡出错log里可以看出来pc指针以及出错位置
PC is at dw_mci_pre_dma_transfer.isra.19+0x7c/0x158
pc : [<8032e130>] lr : [<8032e14c>] psr: 000f0013
但是不知道在dw_mci_pre_dma_transfer内部的具体位置
2:arm-none-linux-gnueabi-addr2line -e vmlinux 8032e130
会指出:
dm_mmc.c:479
479行处源码:
for_each_sg(data->sg, sg, data->sg_len, i) {
if (sg->offset & 3 || sg->length & 3)
return -EINVAL;
}
分析知道,sg有可能为NULL,所以kernel会出现
Unable to handle kernel NULL pointer dereference at virtual address 00000004
修改代码如下:
for_each_sg(data->sg, sg, data->sg_len, i) {
if (sg && (sg->offset & 3 || sg->length & 3))
return -EINVAL;
}
3:测试后发现还有问题,继续使用此方法查找,发现api
struct scatterlist sg_next(struct scatterlist sg)
{
...
if (sg_is_last(sg))
return NULL;
...
}
没有判断sg是否为NULL,因此修改如下:
struct scatterlist sg_next(struct scatterlist sg)
{
...
if (!sg || sg_is_last(sg))
return NULL;
...
}
再次测试没有出现
Unable to handle kernel NULL pointer dereference at virtual address 00000004

你可能感兴趣的:(linux系统,linux驱动)