一、问题现象

老化测试时出现黑屏现象,
9/12:
今天已经确认的现象

  1. 使用9-11的版本 72台机器出现27 个黑屏,其中25个为USB问题引起的dump(2个是电量低关机),通过LOG分析是在老化45次重启测试的时候出问题(45次重启1个半小时),9-11版本带了高通的等待probe完成 wait_for_device_probe
  2. 出现黑屏的问题是使用33瓦的充电器出现问题,5V2A 的充电器没有问题(上海没有出现黑屏的原因就是因为使用的是5V2A)
  3. 老化充电100的原因也和充电器有关,使用33瓦的时候设置了停充概率有复冲的情况已经找到原因,今天给出解决方式

9/13 验证结果:
使用0912的版本验证50PCS,出现1带黑屏,原因是低电量关机,电量在正常范围(60~80之间),出现adb 端口没有
0912 临时版本修改项

  1. 解决方案将在报错的函数前加空指针return出去和加log--吴超
  2. 修改了老化电量管控节点问题---曾祥源

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来看,

  1. 问题模块:dwc3_msm.ko
  2. 问题原因:内存异常踩踏

2.2 trace32恢复现场

1731376001945.png
1731376008793.png
问题出现在这个720行:dwc->maximum_speed = spd
转成code看一下:
1731376016033.png
从trace32上可以看到如下的信息

  1. mdwc->dwc3 = 0xFFFFFF80876B7000
  2. dwc = 0x0
  3. spd = USB_SPEED_HIGH
    我们基本可以得到这个问题的根本原因:dwc的地址为空,然后将spd的值传给一个空指针的成员
    我们可以看一下这个异常地址:
    1731376025146.png
    str w20,[x8, #0x450] : 将w20寄存器的值写入以 x8寄存器值加上0x450的值的地址中
    1731376031257.png

而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