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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值