2017-03-27 19:19:34 -07:00
/*
* Copyright 2016 The Android Open Source Project
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
# define LOG_TAG "dumpstate"
# include "DumpstateDevice.h"
# include <android-base/properties.h>
2017-06-15 16:31:38 -07:00
# include <android-base/unique_fd.h>
2017-03-27 19:19:34 -07:00
# include <cutils/properties.h>
2018-05-01 16:26:21 -07:00
# include <hidl/HidlBinderSupport.h>
2017-03-27 19:19:34 -07:00
# include <log/log.h>
2017-08-16 11:52:05 -07:00
# include <string.h>
# define _SVID_SOURCE
# include <dirent.h>
2017-03-27 19:19:34 -07:00
# include "DumpstateUtil.h"
# define MODEM_LOG_PREFIX_PROPERTY "ro.radio.log_prefix"
# define MODEM_LOG_LOC_PROPERTY "ro.radio.log_loc"
# define MODEM_LOGGING_SWITCH "persist.radio.smlog_switch"
2018-01-31 14:18:00 -08:00
# define DIAG_MDLOG_PERSIST_PROPERTY "persist.sys.modem.diag.mdlog"
2017-06-16 18:18:11 -07:00
# define DIAG_MDLOG_PROPERTY "sys.modem.diag.mdlog"
# define DIAG_MDLOG_STATUS_PROPERTY "sys.modem.diag.mdlog_on"
2017-05-10 09:27:57 -07:00
2017-08-16 11:52:05 -07:00
# define DIAG_MDLOG_NUMBER_BUGREPORT "persist.sys.modem.diag.mdlog_br_num"
2017-03-27 19:19:34 -07:00
using android : : os : : dumpstate : : CommandOptions ;
using android : : os : : dumpstate : : DumpFileToFd ;
using android : : os : : dumpstate : : PropertiesHelper ;
using android : : os : : dumpstate : : RunCommandToFd ;
namespace android {
namespace hardware {
namespace dumpstate {
namespace V1_0 {
namespace implementation {
2017-08-16 11:52:05 -07:00
# define DIAG_LOG_PREFIX "diag_log_"
void DumpstateDevice : : dumpDiagLogs ( int fd , std : : string srcDir , std : : string destDir ) {
struct dirent * * dirent_list = NULL ;
int num_entries = scandir ( srcDir . c_str ( ) ,
& dirent_list ,
0 ,
( int ( * ) ( const struct dirent * * , const struct dirent * * ) ) alphasort ) ;
if ( ! dirent_list ) {
return ;
} else if ( num_entries < = 0 ) {
return ;
}
int maxFileNum = android : : base : : GetIntProperty ( DIAG_MDLOG_NUMBER_BUGREPORT , 100 ) ;
int copiedFiles = 0 ;
for ( int i = num_entries - 1 ; i > = 0 ; i - - ) {
ALOGD ( " Found %s \n " , dirent_list [ i ] - > d_name ) ;
if ( 0 ! = strncmp ( dirent_list [ i ] - > d_name , DIAG_LOG_PREFIX , strlen ( DIAG_LOG_PREFIX ) ) ) {
continue ;
}
if ( ( copiedFiles > = maxFileNum ) & & ( maxFileNum ! = - 1 ) ) {
ALOGD ( " Skipped %s \n " , dirent_list [ i ] - > d_name ) ;
continue ;
}
copiedFiles + + ;
CommandOptions options = CommandOptions : : WithTimeout ( 120 ) . Build ( ) ;
std : : string srcLogFile = srcDir + " / " + dirent_list [ i ] - > d_name ;
std : : string destLogFile = destDir + " / " + dirent_list [ i ] - > d_name ;
std : : string copyCmd = " /vendor/bin/cp " + srcLogFile + " " + destLogFile ;
ALOGD ( " Copying %s to %s \n " , srcLogFile . c_str ( ) , destLogFile . c_str ( ) ) ;
RunCommandToFd ( fd , " CP DIAG LOGS " , { " /vendor/bin/sh " , " -c " , copyCmd . c_str ( ) } , options ) ;
}
while ( num_entries - - ) {
free ( dirent_list [ num_entries ] ) ;
}
free ( dirent_list ) ;
}
2017-06-15 16:31:38 -07:00
void DumpstateDevice : : dumpModem ( int fd , int fdModem )
2017-03-27 19:19:34 -07:00
{
std : : string modemLogDir = android : : base : : GetProperty ( MODEM_LOG_LOC_PROPERTY , " " ) ;
if ( modemLogDir . empty ( ) ) {
ALOGD ( " No modem log place is set \n " ) ;
return ;
}
2017-03-31 14:04:05 -07:00
if ( ! PropertiesHelper : : IsUserBuild ( ) ) {
2017-05-10 09:27:57 -07:00
2017-03-31 14:04:05 -07:00
CommandOptions options = CommandOptions : : WithTimeout ( 120 ) . Build ( ) ;
2018-01-31 14:18:00 -08:00
RunCommandToFd ( fd , " MODEM DIAG SYSTEM PROPERTIES " ,
{ " /vendor/bin/sh " , " -c " , " getprop " , " | " , " grep " , " sys.modem.diag " } , options ) ;
2017-03-31 14:04:05 -07:00
std : : string modemLogAllDir = modemLogDir + " /modem_log " ;
2017-05-10 09:27:57 -07:00
std : : string diagLogDir = " /data/vendor/radio/diag_logs/logs " ;
2017-03-31 14:04:05 -07:00
std : : vector < std : : string > rilAndNetmgrLogs
2017-03-27 19:19:34 -07:00
{
2017-06-20 14:53:34 -07:00
" /data/vendor/radio/ril_log " ,
" /data/vendor/radio/ril_log_old " ,
2017-06-10 15:34:01 -07:00
" /data/vendor/netmgr/netmgr_log " ,
2018-01-02 16:01:56 -08:00
" /data/vendor/netmgr/netmgr_log_old " ,
Add OMADM logs to the bugreport
Allow OMADM to access data/vendor/radio
Fix below avc denied errors
08-23 14:45:16.080 624 624 E SELinux : avc: denied { find } for service=isub pid=4274 uid=10156 scontext=u:r:omadm_app:s0:c156,c256,c512,c768 tcontext=u:object_r:radio_service:s0 tclass=service_manager permissive=0
08-23 14:58:13.443 6623 6623 I auditd : type=1400 audit(0.0:26): avc: denied { create } for comm="ConnectivityThr" scontext=u:r:omadm_app:s0:c131,c256,c512,c768 tcontext=u:r:omadm_app:s0:c131,c256,c512,c768 tclass=udp_socket permissive=0 app=com.android.omadm.service
08-23 14:58:34.770 6623 6623 I auditd : type=1400 audit(0.0:28): avc: denied { write } for comm="IntentService[D" name="dnsproxyd" dev="tmpfs" ino=25468 scontext=u:r:omadm_app:s0:c131,c256,c512,c768 tcontext=u:object_r:dnsproxyd_socket:s0 tclass=sock_file permissive=0 app=com.android.omadm.service
08-23 16:15:43.770 6742 6742 I auditd : type=1400 audit(0.0:27): avc: denied { write } for comm="ConnectivityThr" name="fwmarkd" dev="tmpfs" ino=26777 scontext=u:r:omadm_app:s0:c123,c256,c512,c768 tcontext=u:object_r:fwmarkd_socket:s0 tclass=sock_file permissive=0 app=com.android.omadm.service
08-23 16:16:06.506 6742 6742 I auditd : type=1400 audit(0.0:35): avc: denied { connectto } for comm="IntentService[D" path="/dev/socket/dnsproxyd" scontext=u:r:omadm_app:s0:c123,c256,c512,c768 tcontext=u:r:netd:s0 tclass=unix_stream_socket permissive=0 app=com.android.omadm.service
Bug: 119871368
Test: Verify OMADM log can be added to the bugreport and avc denied
issues were fixed
Change-Id: Ie043bd4b90da865a39624956324abd7b7c11cb5a
2019-09-10 19:45:59 +08:00
" /data/vendor/radio/omadm_logs.txt " ,
2018-01-31 14:18:00 -08:00
" /data/vendor/radio/power_anomaly_data.txt " ,
" /data/vendor/radio/diag_logs/diag_trace.txt " ,
" /data/vendor/radio/diag_logs/diag_trace_old.txt " ,
2017-03-31 14:04:05 -07:00
} ;
2017-06-02 09:55:49 -07:00
std : : string modemLogMkDirCmd = " /vendor/bin/mkdir -p " + modemLogAllDir ;
RunCommandToFd ( fd , " MKDIR MODEM LOG " , { " /vendor/bin/sh " , " -c " , modemLogMkDirCmd . c_str ( ) } , options ) ;
2017-03-31 14:04:05 -07:00
2018-01-31 14:18:00 -08:00
bool smlogEnabled = android : : base : : GetBoolProperty ( MODEM_LOGGING_SWITCH , false ) & &
! access ( " /vendor/bin/smlog_dump " , X_OK ) ;
bool diagLogEnabled = android : : base : : GetBoolProperty ( DIAG_MDLOG_PERSIST_PROPERTY , false ) ;
2017-03-31 14:04:05 -07:00
if ( smlogEnabled ) {
RunCommandToFd ( fd , " SMLOG DUMP " , { " smlog_dump " , " -d " , " -o " , modemLogAllDir . c_str ( ) } , options ) ;
2017-05-10 09:27:57 -07:00
} else if ( diagLogEnabled ) {
2018-01-31 14:18:00 -08:00
bool diagLogStarted = android : : base : : GetBoolProperty ( DIAG_MDLOG_STATUS_PROPERTY , false ) ;
if ( diagLogStarted ) {
android : : base : : SetProperty ( DIAG_MDLOG_PROPERTY , " false " ) ;
ALOGD ( " Stopping diag_mdlog... \n " ) ;
} else {
ALOGD ( " diag_mdlog is not running \n " ) ;
}
2017-05-10 09:27:57 -07:00
2017-06-16 18:18:11 -07:00
for ( int i = 0 ; i < 30 ; i + + ) {
2017-05-10 09:27:57 -07:00
if ( ! android : : base : : GetBoolProperty ( DIAG_MDLOG_STATUS_PROPERTY , false ) ) {
2018-01-31 14:18:00 -08:00
ALOGD ( " diag_mdlog exited \n " ) ;
2017-06-16 18:18:11 -07:00
sleep ( 1 ) ;
2017-05-10 09:27:57 -07:00
break ;
}
sleep ( 1 ) ;
}
2017-08-16 11:52:05 -07:00
dumpDiagLogs ( fd , diagLogDir , modemLogAllDir ) ;
2017-05-10 09:27:57 -07:00
2018-01-31 14:18:00 -08:00
if ( diagLogStarted ) {
ALOGD ( " Restarting diag_mdlog... \n " ) ;
android : : base : : SetProperty ( DIAG_MDLOG_PROPERTY , " true " ) ;
}
2017-03-31 14:04:05 -07:00
}
2017-04-19 11:06:14 -07:00
for ( const auto & logFile : rilAndNetmgrLogs )
2017-03-31 14:04:05 -07:00
{
2017-06-02 09:55:49 -07:00
std : : string copyCmd = " /vendor/bin/cp " + logFile + " " + modemLogAllDir ;
2018-01-31 14:18:00 -08:00
RunCommandToFd ( fd , " CP MODEM LOG " , { " /vendor/bin/sh " , " -c " , copyCmd . c_str ( ) } , options ) ;
2017-03-31 14:04:05 -07:00
}
std : : string filePrefix = android : : base : : GetProperty ( MODEM_LOG_PREFIX_PROPERTY , " " ) ;
if ( ! filePrefix . empty ( ) ) {
std : : string modemLogCombined = modemLogDir + " / " + filePrefix + " all.tar " ;
2017-06-02 09:55:49 -07:00
std : : string modemLogTarCmd = " /vendor/bin/tar cvf " + modemLogCombined + " -C " + modemLogAllDir + " . " ;
RunCommandToFd ( fd , " TAR LOG " , { " /vendor/bin/sh " , " -c " , modemLogTarCmd . c_str ( ) } , options ) ;
2017-03-31 14:04:05 -07:00
2017-06-02 09:55:49 -07:00
std : : string modemLogPermCmd = " /vendor/bin/chmod a+rw " + modemLogCombined ;
RunCommandToFd ( fd , " CHG PERM " , { " /vendor/bin/sh " , " -c " , modemLogPermCmd . c_str ( ) } , options ) ;
2017-03-31 14:04:05 -07:00
2017-06-15 16:31:38 -07:00
std : : vector < uint8_t > buffer ( 65536 ) ;
android : : base : : unique_fd fdLog ( TEMP_FAILURE_RETRY ( open ( modemLogCombined . c_str ( ) , O_RDONLY | O_CLOEXEC | O_NONBLOCK ) ) ) ;
if ( fdLog > = 0 ) {
while ( 1 ) {
ssize_t bytes_read = TEMP_FAILURE_RETRY ( read ( fdLog , buffer . data ( ) , buffer . size ( ) ) ) ;
if ( bytes_read = = 0 ) {
break ;
} else if ( bytes_read < 0 ) {
ALOGD ( " read(%s): %s \n " , modemLogCombined . c_str ( ) , strerror ( errno ) ) ;
break ;
}
ssize_t result = TEMP_FAILURE_RETRY ( write ( fdModem , buffer . data ( ) , bytes_read ) ) ;
if ( result ! = bytes_read ) {
ALOGD ( " Failed to write %ld bytes, actually written: %ld " , bytes_read , result ) ;
break ;
}
}
}
2017-06-02 09:55:49 -07:00
std : : string modemLogClearCmd = " /vendor/bin/rm -r " + modemLogAllDir ;
RunCommandToFd ( fd , " RM MODEM DIR " , { " /vendor/bin/sh " , " -c " , modemLogClearCmd . c_str ( ) } , options ) ;
2017-06-15 16:31:38 -07:00
RunCommandToFd ( fd , " RM LOG " , { " /vendor/bin/rm " , modemLogCombined . c_str ( ) } , options ) ;
2017-03-27 19:19:34 -07:00
}
}
}
2019-10-25 00:29:21 -07:00
static void DumpPower ( int fd ) {
RunCommandToFd ( fd , " Power Stats Times " , { " /vendor/bin/sh " , " -c " ,
" echo -n \" Boot: \" && /vendor/bin/uptime -s && "
" echo -n \" Now: \" && date " } ) ;
DumpFileToFd ( fd , " RPM Stats " , " /d/rpm_stats " ) ;
DumpFileToFd ( fd , " Power Management Stats " , " /d/rpm_master_stats " ) ;
DumpFileToFd ( fd , " WLAN Power Stats " , " /d/wlan0/power_stats " ) ;
}
2017-05-26 15:56:18 -07:00
static void DumpTouch ( int fd ) {
if ( ! access ( " /sys/android_touch " , R_OK ) ) {
DumpFileToFd ( fd , " Synaptics touch firmware version " ,
" /sys/android_touch/vendor " ) ;
DumpFileToFd ( fd , " Synaptics touch firmware config " ,
" /sys/android_touch/config " ) ;
}
if ( ! access ( " /sys/class/input/ftm4_touch " , R_OK ) ) {
DumpFileToFd ( fd , " STM touch firmware config " ,
" /sys/class/input/ftm4_touch/version " ) ;
2017-08-02 01:43:06 -07:00
DumpFileToFd ( fd , " STM touch VR Mode " ,
" /sys/class/input/ftm4_touch/vrmode " ) ;
2017-05-26 15:56:18 -07:00
}
}
2017-03-27 19:19:34 -07:00
// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
Return < void > DumpstateDevice : : dumpstateBoard ( const hidl_handle & handle ) {
2018-05-01 16:26:21 -07:00
// Exit when dump is completed since this is a lazy HAL.
addPostCommandTask ( [ ] ( ) {
exit ( 0 ) ;
} ) ;
2017-05-23 16:06:03 -07:00
if ( handle = = nullptr | | handle - > numFds < 1 ) {
2017-03-27 19:19:34 -07:00
ALOGE ( " no FDs \n " ) ;
return Void ( ) ;
}
int fd = handle - > data [ 0 ] ;
if ( fd < 0 ) {
ALOGE ( " invalid FD: %d \n " , handle - > data [ 0 ] ) ;
return Void ( ) ;
}
2017-06-15 16:31:38 -07:00
if ( handle - > numFds < 2 ) {
ALOGE ( " no FD for modem \n " ) ;
}
else {
int fdModem = handle - > data [ 1 ] ;
dumpModem ( fd , fdModem ) ;
}
2018-04-02 16:07:53 -07:00
RunCommandToFd ( fd , " VENDOR PROPERTIES " , { " /vendor/bin/getprop " } ) ;
2017-03-27 19:19:34 -07:00
DumpFileToFd ( fd , " CPU present " , " /sys/devices/system/cpu/present " ) ;
DumpFileToFd ( fd , " CPU online " , " /sys/devices/system/cpu/online " ) ;
2017-09-18 15:35:34 -07:00
DumpFileToFd ( fd , " UFS model " , " /sys/block/sda/device/model " ) ;
DumpFileToFd ( fd , " UFS rev " , " /sys/block/sda/device/rev " ) ;
DumpFileToFd ( fd , " UFS size " , " /sys/block/sda/size " ) ;
2017-10-02 14:48:46 -07:00
RunCommandToFd ( fd , " UFS health " , { " /vendor/bin/sh " , " -c " , " for f in $(find /sys/kernel/debug/ufshcd0 -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; fi; done " } ) ;
2017-03-27 19:19:34 -07:00
DumpFileToFd ( fd , " INTERRUPTS " , " /proc/interrupts " ) ;
2019-10-25 00:29:21 -07:00
DumpPower ( fd ) ;
2017-06-16 18:30:32 -07:00
DumpFileToFd ( fd , " LL-Stats " , " /d/wlan0/ll_stats " ) ;
DumpFileToFd ( fd , " ICNSS Stats " , " /d/icnss/stats " ) ;
2017-03-27 19:19:34 -07:00
DumpFileToFd ( fd , " SMD Log " , " /d/ipc_logging/smd/log " ) ;
2017-06-02 09:55:49 -07:00
RunCommandToFd ( fd , " ION HEAPS " , { " /vendor/bin/sh " , " -c " , " for d in $(ls -d /d/ion/*); do for f in $(ls $d); do echo --- $d/$f; cat $d/$f; done; done " } ) ;
2017-03-27 19:19:34 -07:00
DumpFileToFd ( fd , " dmabuf info " , " /d/dma_buf/bufinfo " ) ;
2017-09-01 09:28:50 -07:00
RunCommandToFd ( fd , " Easel debug info " , { " /vendor/bin/sh " , " -c " , " for f in `ls /sys/bus/i2c/devices/9-0008/@(*curr|temperature|vbat|total_power)`; do echo \" $f: `cat $f` \" ; done; file=/sys/devices/virtual/misc/mnh_sm/state; echo \" $file: `cat $file` \" " } ) ;
2018-03-19 22:31:14 -07:00
RunCommandToFd ( fd , " Temperatures " , { " /vendor/bin/sh " , " -c " , " for f in /sys/class/thermal/thermal* ; do type=`cat $f/type` ; temp=`cat $f/temp` ; echo \" $type: $temp \" ; done " } ) ;
RunCommandToFd ( fd , " Cooling Device Current State " , { " /vendor/bin/sh " , " -c " , " for f in /sys/class/thermal/cooling* ; do type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \" $type: $temp \" ; done " } ) ;
RunCommandToFd ( fd , " CPU time-in-state " , { " /vendor/bin/sh " , " -c " , " for cpu in /sys/devices/system/cpu/cpu*; do f=$cpu/cpufreq/stats/time_in_state; if [ ! -f $f ]; then continue; fi; echo $f:; cat $f; done " } ) ;
RunCommandToFd ( fd , " CPU cpuidle " , { " /vendor/bin/sh " , " -c " , " for cpu in /sys/devices/system/cpu/cpu*; do for d in $cpu/cpuidle/state*; do if [ ! -d $d ]; then continue; fi; echo \" $d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage` \" ; done; done " } ) ;
2017-05-30 17:51:24 -04:00
DumpFileToFd ( fd , " MDP xlogs " , " /data/vendor/display/mdp_xlog " ) ;
2017-04-19 12:25:11 -07:00
DumpFileToFd ( fd , " TCPM logs " , " /d/tcpm/usbpd0 " ) ;
DumpFileToFd ( fd , " PD Engine " , " /d/pd_engine/usbpd0 " ) ;
DumpFileToFd ( fd , " smblib-usb logs " , " /d/ipc_logging/smblib/log " ) ;
2017-05-05 10:04:41 -07:00
DumpFileToFd ( fd , " ipc-local-ports " , " /d/msm_ipc_router/dump_local_ports " ) ;
2018-12-19 08:55:12 -08:00
DumpFileToFd ( fd , " ipc-servers " , " /d/msm_ipc_router/dump_servers " ) ;
RunCommandToFd ( fd , " ipc-logs " ,
{ " /vendor/bin/sh " , " -c " ,
" for f in `ls /d/ipc_logging/*_IPCRTR/log` ; do echo \" ------ $f \\ n`cat "
" $f` \\ n \" ; done " } ) ;
2017-05-26 15:56:18 -07:00
DumpTouch ( fd ) ;
2017-06-12 12:14:43 -07:00
RunCommandToFd ( fd , " USB Device Descriptors " , { " /vendor/bin/sh " , " -c " , " cd /sys/bus/usb/devices/1-1 && cat product && cat bcdDevice; cat descriptors | od -t x1 -w16 -N96 " } ) ;
2018-10-01 10:12:42 +09:00
DumpFileToFd ( fd , " Pixel trace " , " /d/tracing/instances/pixel-trace/trace " ) ;
2018-04-02 16:07:53 -07:00
// Timeout after 3s
RunCommandToFd ( fd , " QSEE logs " , { " /vendor/bin/sh " , " -c " , " /vendor/bin/timeout 3 cat /d/tzdbg/qsee_log " } ) ;
2018-03-15 18:42:55 -07:00
RunCommandToFd ( fd , " Power supply properties " , { " /vendor/bin/sh " , " -c " , " for f in /sys/class/power_supply/*/uevent ; do echo \" \n ------ $f \" ; cat $f ; done " } ) ;
2018-04-03 17:22:55 -07:00
DumpFileToFd ( fd , " Battery cycle count " , " /sys/class/power_supply/bms/device/cycle_counts_bins " ) ;
2018-03-15 18:42:55 -07:00
RunCommandToFd ( fd , " QCOM FG SRAM " , { " /vendor/bin/sh " , " -c " , " echo 0 > /d/fg/sram/address ; echo 500 > /d/fg/sram/count ; cat /d/fg/sram/data " } ) ;
DumpFileToFd ( fd , " WLAN FW Log Symbol Table " , " /vendor/firmware/Data.msc " ) ;
2017-03-27 19:19:34 -07:00
return Void ( ) ;
} ;
} // namespace implementation
} // namespace V1_0
} // namespace dumpstate
} // namespace hardware
} // namespace android