一、问题现象
老化测试时出现黑屏现象,
9/12:
今天已经确认的现象
- 使用9-11的版本 72台机器出现27 个黑屏,其中25个为USB问题引起的dump(2个是电量低关机),通过LOG分析是在老化45次重启测试的时候出问题(45次重启1个半小时),9-11版本带了高通的等待probe完成 wait_for_device_probe
- 出现黑屏的问题是使用33瓦的充电器出现问题,5V2A 的充电器没有问题(上海没有出现黑屏的原因就是因为使用的是5V2A)
- 老化充电100的原因也和充电器有关,使用33瓦的时候设置了停充概率有复冲的情况已经找到原因,今天给出解决方式
9/13 验证结果:
使用0912的版本验证50PCS,出现1带黑屏,原因是低电量关机,电量在正常范围(60~80之间),出现adb 端口没有
0912 临时版本修改项
- 解决方案将在报错的函数前加空指针return出去和加log--吴超
- 修改了老化电量管控节点问题---曾祥源
9/14 验证结果:
验证老化黑屏的2个版本
工厂端:加一个判断获取到的设备只是否为空-----24/50 黑屏
上海:报错的函数前错误指针return出去 -------4/16 黑屏 确认是USB 黑屏问题
9/15 验证结果:
上海 端 17PCS 修改了USB问题,使用11V3A,N7标准充电线(橙色数据线),出现5PCS黑屏(USB问题)
工厂 端 37PCS 熔丝版本,没有做任何修改,使用白色6A数据线,出现2PCS黑屏,2PCS主页,6PCS低电关机
二、问题分析
2.1 dmesg
[ 92.045816][ T109] Unable to handle kernel write to read-only memory at virtual address 0000000000000450
[ 92.045820][ T109] Mem abort info:
[ 92.045821][ T109] ESR = 0x96000045
[ 92.045823][ T109] EC = 0x25: DABT (current EL), IL = 32 bits
[ 92.045827][ T109] SET = 0, FnV = 0
[ 92.045829][ T109] EA = 0, S1PTW = 0
[ 92.045831][ T109] FSC = 0x05: level 1 translation fault
[ 92.045833][ T109] Data abort info:
[ 92.045834][ T109] ISV = 0, ISS = 0x00000045
[ 92.045835][ T109] CM = 0, WnR = 1
[ 92.045838][ T109] user pgtable: 4k pages, 39-bit VAs, pgdp=00000000817bd000
[ 92.045841][ T109] [0000000000000450] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[ 92.045853][ T109] Internal error: Oops: 96000045 [#1] PREEMPT SMP
[ 92.046656][ T109] CPU: 5 PID: 109 Comm: kworker/u16:2 Tainted: G WC OE 5.15.94 #1
[ 92.046663][ T109] Hardware name: Qualcomm Technologies, Inc. Khaje IDP sapphire (DT)
[ 92.046666][ T109] Workqueue: dwc3_wq dwc3_resume_work.d3d24a0baa3b4d28944726b453e90dd7.cfi_jt [dwc3_msm]
[ 92.046703][ T109] pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 92.046708][ T109] pc : dwc3_msm_set_max_speed+0x8c/0xbc [dwc3_msm]
[ 92.046733][ T109] lr : dwc3_msm_set_max_speed+0x78/0xbc [dwc3_msm]
[ 92.046758][ T109] sp : ffffffc0087abd10
[ 92.046761][ T109] x29: ffffffc0087abd10 x28: 0000000000000402 x27: ffffff8000023020
[ 92.046767][ T109] x26: ffffff8000119b10 x25: 00000000000a0002 x24: ffffffddee847518
[ 92.046772][ T109] x23: ffffff804982fb05 x22: 0000000000000000 x21: 0000000000000000
[ 92.046778][ T109] x20: 0000000000000003 x19: ffffff8049b30080 x18: ffffffc00862d028
[ 92.046782][ T109] x17: 303a7864695f7478 x16: 00000000000000b0 x15: ffffffddf49f50e0
[ 92.046787][ T109] x14: ffffffddf5e11be0 x13: 0000000000000000 x12: 0000000000000000
[ 92.046792][ T109] x11: 00000000ffffffff x10: ffffffddf67213e8 x9 : 114f1214b7c0a100
[ 92.046797][ T109] x8 : 0000000000000000 x7 : 78616d5f7465735f x6 : 6d736d5f33637764
[ 92.046802][ T109] x5 : ffffff81f6c467a9 x4 : ffffffddee855405 x3 : ffffffc0087ab868
[ 92.046806][ T109] x2 : 0000000000000030 x1 : 0000000000000000 x0 : 0000000000000030
[ 92.046812][ T109] Call trace:
[ 92.046814][ T109] dwc3_msm_set_max_speed+0x8c/0xbc [dwc3_msm]
[ 92.046837][ T109] dwc3_resume_work+0x14c/0x410 [dwc3_msm]
[ 92.046861][ T109] process_one_work+0x224/0x4a4
[ 92.046874][ T109] worker_thread+0x29c/0x500
[ 92.046880][ T109] kthread+0x170/0x1dc
[ 92.046885][ T109] ret_from_fork+0x10/0x20
[ 92.046894][ T109] Code: b4000148 b140051f 54000068 f9405508 (b9045114)
[ 92.046897][ T109] ---[ end trace 63bb7f701b7d6a2a ]---
从现有的dmesg log来看,
- 问题模块:dwc3_msm.ko
- 问题原因:内存异常踩踏
2.2 trace32恢复现场
问题出现在这个720行:dwc->maximum_speed = spd
转成code看一下:
从trace32上可以看到如下的信息
- mdwc->dwc3 = 0xFFFFFF80876B7000
- dwc = 0x0
- spd = USB_SPEED_HIGH
我们基本可以得到这个问题的根本原因:dwc的地址为空,然后将spd的值传给一个空指针的成员
我们可以看一下这个异常地址:
str w20,[x8, #0x450] : 将w20寄存器的值写入以 x8寄存器值加上0x450的值的地址中
而x8寄存器此时为0,w20值为3,就是将3写入到x8+0x450=0x450的地址中,这个地址很明显是一个异常地址,所以在dmesg中报了如下的报错。
Unable to handle kernel write to read-only memory at virtual address 0000000000000450
三、根本原因
操作指向空指针地址的结构体成员
四、解决方案
workaround方案:将所有引用dwc的地方做空指针兼容
gerrit: https://gerrit.odm.mioffice.cn/c/kernel/msm-5.15/+/430151