diff --git a/dumpstate/DumpstateDevice.cpp b/dumpstate/DumpstateDevice.cpp index 3a3a20c3..9db379b4 100755 --- a/dumpstate/DumpstateDevice.cpp +++ b/dumpstate/DumpstateDevice.cpp @@ -31,6 +31,9 @@ #define MODEM_LOG_LOC_PROPERTY "ro.radio.log_loc" #define MODEM_LOGGING_SWITCH "persist.radio.smlog_switch" +#define DIAG_MDLOG_PROPERTY "persist.sys.modem.diag.mdlog" +#define DIAG_MDLOG_STATUS_PROPERTY "sys.modem.diag.mdlog" + using android::os::dumpstate::CommandOptions; using android::os::dumpstate::DumpFileToFd; using android::os::dumpstate::PropertiesHelper; @@ -56,9 +59,11 @@ static void getModemLogs(int fd) bool smlogEnabled = android::base::GetBoolProperty(MODEM_LOGGING_SWITCH, false) && !access("/vendor/bin/smlog_dump", X_OK); + bool diagLogEnabled = android::base::GetBoolProperty(DIAG_MDLOG_PROPERTY, false); + CommandOptions options = CommandOptions::WithTimeout(120).Build(); std::string modemLogAllDir = modemLogDir + "/modem_log"; - std::string alwaysOnLogs = "/data/vendor/radio/diag_logs/always_on"; + std::string diagLogDir = "/data/vendor/radio/diag_logs/logs"; std::vector rilAndNetmgrLogs { "/data/misc/radio/ril_log", @@ -72,9 +77,24 @@ static void getModemLogs(int fd) if (smlogEnabled) { RunCommandToFd(fd, "SMLOG DUMP", { "smlog_dump", "-d", "-o", modemLogAllDir.c_str() }, options); - } else { - std::string copyCmd= "/system/bin/cp -rf " + alwaysOnLogs + " " + modemLogAllDir; - RunCommandToFd(fd, "CP ALWAYS ON LOGS", { "/system/bin/sh", "-c", copyCmd.c_str()}, options); + } else if (diagLogEnabled) { + std::string copyCmd= "/system/bin/cp -rf " + diagLogDir + " " + modemLogAllDir; + + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false"); + + ALOGD("Waiting for diag log to exit\n"); + for (int i = 0; i < 10; i++) { + if (!android::base::GetBoolProperty(DIAG_MDLOG_STATUS_PROPERTY, false)) { + ALOGD("diag log exited\n"); + break; + } + + sleep(1); + } + + RunCommandToFd(fd, "CP DIAG LOGS", { "/system/bin/sh", "-c", copyCmd.c_str()}, options); + + android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true"); } for (const auto& logFile : rilAndNetmgrLogs) diff --git a/init.hardware.diag.rc.userdebug b/init.hardware.diag.rc.userdebug index 42fc61e2..c1398216 100644 --- a/init.hardware.diag.rc.userdebug +++ b/init.hardware.diag.rc.userdebug @@ -16,7 +16,7 @@ on post-fs-data # Modem logging collection - mkdir /data/vendor/radio 0775 radio radio + mkdir /data/vendor/radio 0777 radio radio mkdir /data/vendor/radio/diag_logs 0777 system system # WLAN logging collection mkdir /data/vendor/wifi 0777 system system @@ -333,6 +333,26 @@ on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb,serial_cdev write /config/usb_gadget/g1/UDC ${sys.usb.controller} setprop sys.usb.state ${sys.usb.config} +service diag_mdlog_start /vendor/bin/diag_mdlog + class late_start + user shell + group system diag media_rw + disabled + oneshot + +service diag_mdlog_stop /vendor/bin/diag_mdlog -k + class late_start + user shell + group system diag media_rw + disabled + oneshot + +on property:persist.sys.modem.diag.mdlog=true + start diag_mdlog_start + +on property:persist.sys.modem.diag.mdlog=false + start diag_mdlog_stop + on property:persist.sys.cnss.diag_qxdm=true start cnss_diag diff --git a/sepolicy/hal_dumpstate_impl.te b/sepolicy/hal_dumpstate_impl.te index 7e8d0b4e..af7aac09 100644 --- a/sepolicy/hal_dumpstate_impl.te +++ b/sepolicy/hal_dumpstate_impl.te @@ -19,6 +19,8 @@ userdebug_or_eng(` allow hal_dumpstate_impl radio_data_file:file r_file_perms; allow hal_dumpstate_impl radio_vendor_data_file:file r_file_perms; allow hal_dumpstate_impl netmgr_data_file:file r_file_perms; + + set_prop(hal_dumpstate_impl, modem_diag_prop) ') allow hal_dumpstate_impl uio_device:chr_file rw_file_perms; diff --git a/sepolicy/logger_app.te b/sepolicy/logger_app.te index 01b3142c..941da8b7 100644 --- a/sepolicy/logger_app.te +++ b/sepolicy/logger_app.te @@ -15,5 +15,7 @@ userdebug_or_eng(` allow logger_app cnss_vendor_data_file:dir create_dir_perms; allow logger_app cnss_vendor_data_file:file create_file_perms; - set_prop(logger_app, cnss_diag_prop); + + set_prop(logger_app, cnss_diag_prop) + set_prop(logger_app, modem_diag_prop) ') diff --git a/sepolicy/property.te b/sepolicy/property.te index 1444c033..0062800c 100644 --- a/sepolicy/property.te +++ b/sepolicy/property.te @@ -9,3 +9,4 @@ type cnss_diag_prop, property_type; type tee_listener_prop, property_type; type wc_prop, property_type; type thermal_prop, property_type; +type modem_diag_prop, property_type; diff --git a/sepolicy/property_contexts b/sepolicy/property_contexts index 2bfcfb36..b69182e8 100644 --- a/sepolicy/property_contexts +++ b/sepolicy/property_contexts @@ -13,3 +13,5 @@ sys.listeners.registered u:object_r:tee_listener_prop:s0 wc_transport. u:object_r:wc_prop:s0 sys.qcom.thermalcfg u:object_r:thermal_prop:s0 ctl.thermal-engine u:object_r:thermal_prop:s0 +persist.sys.modem.diag. u:object_r:modem_diag_prop:s0 +sys.modem.diag. u:object_r:modem_diag_prop:s0 diff --git a/sepolicy/qlogd.te b/sepolicy/qlogd.te index 499c60cf..f3a8f9bc 100644 --- a/sepolicy/qlogd.te +++ b/sepolicy/qlogd.te @@ -1,4 +1,15 @@ type qlogd, domain; type qlogd_exec, exec_type, vendor_file_type, file_type; -# TODO(b/37115787): Add permissions when diag_mdlog is moved to qlogd domain +userdebug_or_eng(` + # make transition from init to its domain + init_daemon_domain(qlogd) + + allow qlogd diag_device:chr_file rw_file_perms; + allow qlogd qlogd_exec:file rx_file_perms; + + allow qlogd radio_vendor_data_file:file create_file_perms; + allow qlogd radio_vendor_data_file:dir create_dir_perms; + + set_prop(qlogd, modem_diag_prop) +') \ No newline at end of file