[Android稳定性] 第002篇 [原理篇] subsystem ramdump的原理介绍

一、什么是SSR?

Subsystem:modem、LPASS、Venus、WCNSS、GPU、SLPI等,芯片由APSS处理器和额外处理器运行它们的软件。
SSRSubsystem Restart子系统重启)是高通的一个feature选项。如果SSR打开,尽管子系统crash了,仍然允许整个系统运行。
SSR Feature推荐用于出货设备从而减少子系统异常对整个系统的影响。

二、Subsystem RAMDump

当SSR feature打开后,subsystem如果发生crash重启时,整个系统是不会重启进入到dump界面的。此时,当Subsystem RAM dump feature也打开后,子系统发生crash时重启前会收集一份RAM dump到特定的存储路径。

2.1 C3F项目的subsystem ramdump的流程

2.2 xx项目的subsystem ramdump的流程

三、使能SSR

3.1 打开驱动宏开关

3.1.1 C3F项目

kernel中开启SSR的宏开关,比如flame_GKI.config

1
CONFIG_MSM_SUBSYSTEM_RESTART=m

3.1. 2 C3F2项目

1
2
3
4
CONFIG_DEV_COREDUMP=m
CONFIG_REMOTEPROC=m
CONFIG_QCOM_Q6V5_PAS=m
CONFIG_QCOM_RAMDUMP=m

注意:一般项目默认打开

3.2 enable/disable SSR指令

  • adb shell setprop persist.vendor.ssr.restart_level ALL_ENABLE – 开启所有子系统的SSR
  • adb shell setprop persist.vendor.ssr.restart_level ALL_DISABLE – 关闭所有子系统的SSR
  • adb shell setprop persist.vendor.ssr.restart_level slpi – 开启SLPI子系统的SSR
  • adb shell setprop persist.vendor.ssr.restart_level slpi,modem – 开启SLPI、Modem子系统的SSR
  • adb shell getprop persist.vendor.ssr.restart_level – 查看当前SSR的配置

四、抓取subsystem ramdump日志

  1. ss_ramdump是高通闭源的模块,在subsystem restart前ss_ramdump服务器必须开启;
  2. ss_ramdump从Kernel区域使用RAM dump的设备节点/dev/rempoteproc_*获取RAM dump数据,确保这些设备节点存在。
  3. 设置subsystem的restart_level为相关的子系统,如
1
adb shell setprop persist.vendor.ssr.restart_level slpi
  1. 设置enable_ramdumps参数为1
1
adb shell "echo 1 > /sys/module/subsystem_restart/parameters/enable_ramdumps"

五、子系统crash指令

Test Case MPSS WLAN** PD** LPASS(ADSP) DSPS(SLPI) CDSP
Software Error Fatal 03 00 00 03 176 00 03 48 00 03 64 00 03 96 00
WDOG Bite(in STM) 03 00 01 NA 03 48 01 03 64 01 03 96 01
Software Exception(NULL ptr) 03 00 02 03 176 02 03 48 02 03 64 02 03 96 02
WDOG Bite(NOT in STM) 03 00 06 NA 03 48 06 03 64 06 03 96 06

注意:所有的指令必须以 75 37 开头,比如:75 37 03 00 00

下面是发送指令的几种方法:

  1. QXDM
  2. QPST

六、小米的改造

整体小米项目中关于subsystem ramdump的feature的改造,只是对抓取的日志进行分类整理!高通原始的log都是放在/data/ramdump/中,而小米改造后,log将根据子系统的crash类型分类别抓取放在各自的目录下:

七、change参考

https://gerrit.odm.mioffice.cn/q/topic:o19\_enable\_subsystem\_ramdump

八、测试用例

  1. Windows 电脑成功安装 QXDM 工具
  2. 用 adb 命令打开 diag 口,命令是
    1
    setprop sys.usb.config diag,adb
  3. 确保测试前 modem ssr_dump 文件是空的:
    1
    rm -rf /data/vendor/bsplog/modem/ssr_dump/*
  4. 打开 SSR:(确保下面两个属性的值是 ALL_ENABLE 和 1)
    1
    2
    setprop persist.vendor.ssr.restart_level ALL_ENABLE
    setprop persist.vendor.ssr.enable_ramdumps 1
  5. 打开 QXDM,选择 90DB 端口点 Connect 连接设备,在Command 栏输入 send_data 75 37 03 00 02,然后回车,这样来制造 modem crash(可以发不同命令触发不同子系统 dump)
  6. 每隔30秒发送一次指令,连续发生 15 次
  7. 查看 /data/vendor/bsplog/{子系统}/ssr_dump 路径下是否有ssr ramdump日志抓取