• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <dumpstate.h>
18 #include <stdlib.h>
19 #include <string>
20 #include <cutils/properties.h>
21 
22 #define LOG_TAG "dumpstate"
23 #include <cutils/log.h>
24 
25 #define MODEM_LOG_PREFIX_PROPERTY "ro.radio.log_prefix"
26 #define MODEM_LOGGING_SWITCH "persist.radio.smlog_switch"
27 
28 static std::vector<std::string> ril_and_netmgr_logs
29                 {
30                  "/data/misc/radio/ril_log",
31                  "/data/misc/radio/ril_log_old",
32                  "/data/misc/netmgr/netmgr_log",
33                  "/data/misc/netmgr/netmgr_log_old"
34                 };
35 static std::string modem_log_folder_name = "modem_log";
36 
get_property_value(const std::string & property_name)37 static std::string get_property_value (const std::string& property_name) {
38 
39     char property[PROPERTY_VALUE_MAX];
40     property_get (property_name.c_str(), property, "");
41 
42     return property;
43 }
44 
45 /*
46  * Returns true if the system property `key` has the value "1", "y", "yes",
47  * "on", or "true", false for "0", "n", "no", "off", or "false",
48  * or `default_value` otherwise.
49  */
get_bool_property_value(const std::string & property_name,bool default_value)50 static bool get_bool_property_value (const std::string& property_name,
51                                      bool default_value) {
52     std::string value = get_property_value(property_name);
53     if (value == "1" || value == "y" || value == "yes" || value == "on" || value == "true") {
54         return true;
55     } else if (value == "0" || value == "n" || value == "no" || value == "off" || value == "false") {
56         return false;
57     }
58     return default_value;
59 }
60 
dumpstate_board()61 void dumpstate_board()
62 {
63     /* Check if smlog_dump tool exist */
64     if (!is_user_build() && !access("/system/bin/smlog_dump", F_OK)) {
65         bool modem_logging_enabled = get_bool_property_value (MODEM_LOGGING_SWITCH, false);
66 
67         /* Execute SMLOG DUMP if SMLOG is enabled */
68         if (modem_logging_enabled && !bugreport_dir.empty()) {
69             std::string modem_log_dir = bugreport_dir + "/" + modem_log_folder_name;
70             std::string modem_log_mkdir_cmd= "/system/bin/mkdir " + modem_log_dir;
71             run_command("MKDIR MODEM LOG", 5, SU_PATH, "root", "/system/bin/sh", "-c",
72                         modem_log_mkdir_cmd.c_str(), NULL);
73             run_command("SMLOG DUMP", 120, SU_PATH, "root", "smlog_dump", "-d",
74                         "-o", modem_log_dir.c_str(), NULL);
75             for(unsigned int i = 0; i < ril_and_netmgr_logs.size(); i++)
76             {
77               std::string copy_cmd= "/system/bin/cp " + ril_and_netmgr_logs[i] + " " + modem_log_dir;
78               run_command("MV RIL LOG", 20, SU_PATH, "root", "/system/bin/sh", "-c", copy_cmd.c_str(), NULL);
79             }
80             // Remove smlogs older than 10 days
81             std::string file_prefix = get_property_value (MODEM_LOG_PREFIX_PROPERTY);
82             if (!file_prefix.empty()) {
83                 std::string remove_command = "/system/bin/find " +
84                     bugreport_dir + "/" + file_prefix + "* -mtime +10 -delete";
85                 MYLOGD("Removing old logs using command %s\n", remove_command.c_str());
86                 run_command("RM OLD SMLOG", 5, SU_PATH,
87                             "root", "/system/bin/sh", "-c", remove_command.c_str(), NULL);
88             }
89             std::string modem_log_combined = bugreport_dir + "/" + file_prefix + "all.tar.gz";
90             std::string modem_log_gzip_cmd= "/system/bin/tar czvf " + modem_log_combined + " -C" + modem_log_dir + " .";
91             run_command("GZIP LOG", 5, SU_PATH, "root", "/system/bin/sh", "-c",
92                         modem_log_gzip_cmd.c_str(), NULL);
93             std::string modem_log_perm_cmd= "/system/bin/chmod a+rw " + modem_log_combined;
94             run_command("CHG PERM", 5, SU_PATH, "root", "/system/bin/sh", "-c",
95                         modem_log_perm_cmd.c_str(), NULL);
96             std::string modem_log_clear_cmd= "/system/bin/rm -r " + modem_log_dir;
97             run_command("RM MODEM DIR", 5, SU_PATH, "root", "/system/bin/sh", "-c",
98                         modem_log_clear_cmd.c_str(), NULL);
99         }
100         run_command("RM OLD SMLOG", 5, SU_PATH, "root", "/system/bin/sh", "-c",
101                     "/system/bin/find /data/smlog_* -delete", NULL);
102     }
103 
104     dump_file("CPU present", "/sys/devices/system/cpu/present");
105     dump_file("CPU online", "/sys/devices/system/cpu/online");
106     dump_file("RPM Stats", "/d/rpm_stats");
107     dump_file("Power Management Stats", "/d/rpm_master_stats");
108     dump_file("SMD Log", "/d/ipc_logging/smd/log");
109     run_command("ION HEAPS", 5, SU_PATH, "root", "/system/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", NULL);
110     dump_file("dmabuf info", "/d/dma_buf/bufinfo");
111     run_command("Temperatures", 5, SU_PATH, "root", "/system/bin/sh", "-c", "for f in `ls /sys/class/thermal` ; do type=`cat /sys/class/thermal/$f/type` ; temp=`cat /sys/class/thermal/$f/temp` ; echo \"$type: $temp\" ; done", NULL);
112     dump_file("cpu0-1 time-in-state", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state");
113     run_command("cpu0-1 cpuidle", 5, SU_PATH, "root", "/system/bin/sh", "-c", "for d in $(ls -d /sys/devices/system/cpu/cpu0/cpuidle/state*); do echo \"$d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage`\"; done", NULL);
114     dump_file("cpu2-3 time-in-state", "/sys/devices/system/cpu/cpu2/cpufreq/stats/time_in_state");
115     run_command("cpu2-3 cpuidle", 5, SU_PATH, "root", "/system/bin/sh", "-c", "for d in $(ls -d /sys/devices/system/cpu/cpu2/cpuidle/state*); do echo \"$d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage`\"; done", NULL);
116     dump_file("MDP xlogs", "/d/mdp/xlog/dump");
117 
118     /* Check if qsee_logger tool exists */
119     if (!access("/system/bin/qsee_logger", F_OK)) {
120         run_command("FP LOGS", 10, "qsee_logger", "-d", NULL);
121     }
122 };
123