From e14f52d62ae1715bc3b265ccae746cb9e9cafaae Mon Sep 17 00:00:00 2001 From: "terry.cr_huang" Date: Wed, 22 Feb 2017 20:46:47 +0800 Subject: [PATCH 1/2] ril: Enable the feature of modem runtime QXDM log by default Set the property persist.radio.smlog_switch to 1 to enable smlog by default Bug: 35647551 Change-Id: I598cbab0abc2d7c78b4946d2f87b7af476a296cb --- device-common.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/device-common.mk b/device-common.mk index b8350cc..e2803cb 100644 --- a/device-common.mk +++ b/device-common.mk @@ -32,3 +32,9 @@ PRODUCT_PROPERTY_OVERRIDES += \ persist.audio.fluence.voicecomm=true \ persist.audio.fluence.voicerec=false \ ro.config.vc_call_vol_steps=7 + +# Enable SM log mechanism by default +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) +PRODUCT_PROPERTY_OVERRIDES += \ + persist.radio.smlog_switch=1 +endif From 949c0f9b5cf4b3227cfb32d5a4e52c1b04390d00 Mon Sep 17 00:00:00 2001 From: Shawn Yang Date: Mon, 13 Mar 2017 20:52:00 -0700 Subject: [PATCH 2/2] dump state for Muskie/Walleye Change-Id: Ifcb7134a745475dd03ddd1bee71509a62a2a981 --- device-common.mk | 8 ++ dumpstate/Android.mk | 41 ++++++ dumpstate/DumpstateDevice.cpp | 135 ++++++++++++++++++ dumpstate/DumpstateDevice.h | 49 +++++++ ...d.hardware.dumpstate@1.0-service.muskie.rc | 4 + dumpstate/service.cpp | 35 +++++ init.logging.rc | 4 + 7 files changed, 276 insertions(+) create mode 100644 dumpstate/Android.mk create mode 100755 dumpstate/DumpstateDevice.cpp create mode 100644 dumpstate/DumpstateDevice.h create mode 100644 dumpstate/android.hardware.dumpstate@1.0-service.muskie.rc create mode 100644 dumpstate/service.cpp create mode 100644 init.logging.rc diff --git a/device-common.mk b/device-common.mk index e2803cb..6e5e0f9 100644 --- a/device-common.mk +++ b/device-common.mk @@ -38,3 +38,11 @@ ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) PRODUCT_PROPERTY_OVERRIDES += \ persist.radio.smlog_switch=1 endif + +# SM loging file +PRODUCT_COPY_FILES += \ + device/google/muskie/init.logging.rc:root/init.$(PRODUCT_HARDWARE).logging.rc + +# Dumpstate HAL +PRODUCT_PACKAGES += \ + android.hardware.dumpstate@1.0-service.muskie diff --git a/dumpstate/Android.mk b/dumpstate/Android.mk new file mode 100644 index 0000000..184731c --- /dev/null +++ b/dumpstate/Android.mk @@ -0,0 +1,41 @@ +# +# 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. +# + +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.dumpstate@1.0-service.muskie +LOCAL_INIT_RC := android.hardware.dumpstate@1.0-service.muskie.rc +LOCAL_MODULE_RELATIVE_PATH := hw + +LOCAL_SRC_FILES := \ + DumpstateDevice.cpp \ + service.cpp + +LOCAL_SHARED_LIBRARIES := \ + android.hardware.dumpstate@1.0 \ + libbase \ + libcutils \ + libdumpstateutil \ + libhidlbase \ + libhidltransport \ + libhwbinder \ + liblog \ + libutils + +LOCAL_MODULE_TAGS := optional +LOCAL_PROPRIETARY_MODULE := true + +include $(BUILD_EXECUTABLE) diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp new file mode 100755 index 0000000..1542095 --- /dev/null +++ b/dumpstate/DumpstateDevice.cpp @@ -0,0 +1,135 @@ +/* + * 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 +#include +#include +#include +#include +#include + +#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" + +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 { + +namespace { + +static void getModemLogs(int fd) +{ + bool modemLogsEnabled = 0; + std::string modemLogDir = android::base::GetProperty(MODEM_LOG_LOC_PROPERTY, ""); + if (modemLogDir.empty()) { + ALOGD("No modem log place is set\n"); + return; + } + /* Check if smlog_dump tool exist */ + if (!PropertiesHelper::IsUserBuild() && !access("/system/bin/smlog_dump", X_OK)) { + modemLogsEnabled = android::base::GetBoolProperty(MODEM_LOGGING_SWITCH, false); + + /* Execute SMLOG DUMP if SMLOG is enabled */ + if (modemLogsEnabled) { + CommandOptions options = CommandOptions::WithTimeout(120).Build(); + std::string modemLogAllDir = modemLogDir + "/modem_log"; + std::vector rilAndNetmgrLogs + { + "/data/misc/radio/ril_log", + "/data/misc/radio/ril_log_old", + "/data/misc/netmgr/netmgr_log", + "/data/misc/netmgr/netmgr_log_old" + }; + std::string modemLogMkDirCmd= "/system/bin/mkdir " + modemLogAllDir; + RunCommandToFd(fd, "MKDIR MODEM LOG", { "/system/bin/sh", "-c", modemLogMkDirCmd.c_str()}, options); + RunCommandToFd(fd, "SMLOG DUMP", { "smlog_dump", "-d", "-o", modemLogAllDir.c_str() }, options); + for (std::string logFile : rilAndNetmgrLogs) + { + std::string copyCmd= "/system/bin/cp " + logFile + " " + modemLogAllDir; + RunCommandToFd(fd, "MV MODEM LOG", { "/system/bin/sh", "-c", copyCmd.c_str()}, options); + } + std::string filePrefix = android::base::GetProperty(MODEM_LOG_PREFIX_PROPERTY, ""); + if (!filePrefix.empty()) { + std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar"; + std::string modemLogTarCmd= "/system/bin/tar cvf " + modemLogCombined + " -C " + modemLogAllDir + " ."; + RunCommandToFd(fd, "TAR LOG", { "/system/bin/sh", "-c", modemLogTarCmd.c_str()}, options); + std::string modemLogPermCmd= "/system/bin/chmod a+rw " + modemLogCombined; + RunCommandToFd(fd, "CHG PERM", { "/system/bin/sh", "-c", modemLogPermCmd.c_str()}, options); + std::string modemLogClearCmd= "/system/bin/rm -r " + modemLogAllDir; + RunCommandToFd(fd, "RM MODEM DIR", { "/system/bin/sh", "-c", modemLogClearCmd.c_str()}, options); + } + } + } +} + +} // unnamed namespace + + +// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. +Return DumpstateDevice::dumpstateBoard(const hidl_handle& handle) { + if (handle->numFds < 1) { + ALOGE("no FDs\n"); + return Void(); + } + + int fd = handle->data[0]; + if (fd < 0) { + ALOGE("invalid FD: %d\n", handle->data[0]); + return Void(); + } + + getModemLogs(fd); + DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present"); + DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online"); + DumpFileToFd(fd, "RPM Stats", "/d/rpm_stats"); + DumpFileToFd(fd, "Power Management Stats", "/d/rpm_master_stats"); + DumpFileToFd(fd, "SMD Log", "/d/ipc_logging/smd/log"); + RunCommandToFd(fd, "ION HEAPS", {"/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"}); + DumpFileToFd(fd, "dmabuf info", "/d/dma_buf/bufinfo"); + RunCommandToFd(fd, "Temperatures", {"/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"}); + DumpFileToFd(fd, "cpu0-1 time-in-state", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state"); + RunCommandToFd(fd, "cpu0-1 cpuidle", {"/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"}); + DumpFileToFd(fd, "cpu2-3 time-in-state", "/sys/devices/system/cpu/cpu2/cpufreq/stats/time_in_state"); + RunCommandToFd(fd, "cpu2-3 cpuidle", {"/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"}); + DumpFileToFd(fd, "MDP xlogs", "/d/mdp/xlog/dump"); + + /* Check if qsee_logger tool exists */ + if (!access("/system/bin/qsee_logger", X_OK)) { + RunCommandToFd(fd, "FP LOGS", {"qsee_logger", "-d"}); + } + + return Void(); +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace dumpstate +} // namespace hardware +} // namespace android diff --git a/dumpstate/DumpstateDevice.h b/dumpstate/DumpstateDevice.h new file mode 100644 index 0000000..9237b3b --- /dev/null +++ b/dumpstate/DumpstateDevice.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 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. + */ +#ifndef ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H +#define ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H + +#include +#include +#include + +namespace android { +namespace hardware { +namespace dumpstate { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::dumpstate::V1_0::IDumpstateDevice; +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_handle; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::sp; + +struct DumpstateDevice : public IDumpstateDevice { + // Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. + Return dumpstateBoard(const hidl_handle& h) override; +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace dumpstate +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H diff --git a/dumpstate/android.hardware.dumpstate@1.0-service.muskie.rc b/dumpstate/android.hardware.dumpstate@1.0-service.muskie.rc new file mode 100644 index 0000000..05b6db5 --- /dev/null +++ b/dumpstate/android.hardware.dumpstate@1.0-service.muskie.rc @@ -0,0 +1,4 @@ +service dumpstate-1-0 /vendor/bin/hw/android.hardware.dumpstate@1.0-service.muskie + class hal + user system + group system diff --git a/dumpstate/service.cpp b/dumpstate/service.cpp new file mode 100644 index 0000000..b6be48b --- /dev/null +++ b/dumpstate/service.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 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 "android.hardware.dumpstate@1.0-service.muskie" + +#include +#include + +#include "DumpstateDevice.h" + +using ::android::hardware::configureRpcThreadpool; +using ::android::hardware::dumpstate::V1_0::IDumpstateDevice; +using ::android::hardware::dumpstate::V1_0::implementation::DumpstateDevice; +using ::android::hardware::joinRpcThreadpool; +using ::android::sp; + + +int main(int /* argc */, char* /* argv */ []) { + sp dumpstate = new DumpstateDevice; + configureRpcThreadpool(1, true); + dumpstate->registerAsService(); + joinRpcThreadpool(); +} diff --git a/init.logging.rc b/init.logging.rc new file mode 100644 index 0000000..dbe6dc0 --- /dev/null +++ b/init.logging.rc @@ -0,0 +1,4 @@ +on property:ro.build.type=userdebug + write /sys/class/uio/uio1/device/rtel/rtel 1 + # SM DUMP logging collection + mkdir /data/smlog_dump 0777 system system