diff --git a/modem/dump_modemlog/Android.bp b/modem/dump_modemlog/Android.bp index f509320..6f50d3f 100644 --- a/modem/dump_modemlog/Android.bp +++ b/modem/dump_modemlog/Android.bp @@ -5,6 +5,7 @@ package { rust_binary { name: "dump_modem", srcs: ["dump_modem.rs"], + rustlibs: ["librustutils"], vendor: true, relative_install_path: "dump", } diff --git a/modem/dump_modemlog/dump_modem.rs b/modem/dump_modemlog/dump_modem.rs index e3b2e14..9375943 100644 --- a/modem/dump_modemlog/dump_modem.rs +++ b/modem/dump_modemlog/dump_modem.rs @@ -3,6 +3,7 @@ //! The dump_modem binary is used to capture kernel/userspace logs in bugreport use std::fs; +use std::str::FromStr; const MODEM_STAT: &str = "/data/vendor/modem_stat/debug.txt"; const MODEM_UART: &str = "/data/vendor/radio/modem_uart_logs.txt"; @@ -11,6 +12,7 @@ const RFSD_ERR_LOG_DIR: &str = "/data/vendor/log/rfsd"; const WAKEUP_EVENTS: &str = "/sys/devices/platform/cpif/wakeup_events"; const CPIF_LOGBUFFER: &str = "/dev/logbuffer_cpif"; const PCIE_EVENT_STATS: &str = "/sys/devices/platform/cpif/modem/pcie_event_stats"; +const KERNEL_METRICS_DIR: &str = "/sys/kernel/pixel_metrics/modem"; fn handle_io_error(file: &str, err: std::io::Error) { match err.kind() { @@ -58,6 +60,13 @@ fn print_matching_files_in_dir(dir: &str, filename: &str) { } } +fn get_property(key: &str, default_value: i32) -> i32 { + let value = rustutils::system_properties::read(key) + .unwrap_or(None) + .unwrap_or(default_value.to_string()); + i32::from_str(&value).unwrap_or(default_value) +} + // Capture modem stat log if it exists fn modem_stat() { println!("------ Modem Stat ------"); @@ -107,6 +116,27 @@ fn pcie_event_stats() { println!(); } +// Capture kernel metrics stats if the sysfs attribute exists +fn print_kernel_metrics() { + println!("------ Kernel Metrics ------"); + + let file_list = vec![ + "modem_boot_duration", + "modem_wakeup_ap", + "pcie_link_state", + "pcie_link_duration", + "pcie_link_stats", + "pcie_link_updown", + ]; + + for file in file_list { + println!("------ {} ------", file); + let file_path = format!("{}/{}", KERNEL_METRICS_DIR, file); + print_file_and_handle_error(&file_path); + println!(); + } +} + fn main() { modem_stat(); modem_uart(); @@ -115,4 +145,9 @@ fn main() { wakeup_events(); cpif_logbuffer(); pcie_event_stats(); + + let prop_value = get_property("persist.vendor.modem.qms.kernel_metrics_collection", 0); + if prop_value == 1 { + print_kernel_metrics(); + } } diff --git a/modem/dump_modemlog/sepolicy/dump_modem.te b/modem/dump_modemlog/sepolicy/dump_modem.te index 2ffa351..ab49c25 100644 --- a/modem/dump_modemlog/sepolicy/dump_modem.te +++ b/modem/dump_modemlog/sepolicy/dump_modem.te @@ -1,3 +1,4 @@ +# Sepolicy for dump_modem pixel_bugreport(dump_modem) allow dump_modem modem_stat_data_file:dir search; @@ -10,3 +11,4 @@ allow dump_modem vendor_rfsd_log_file:file r_file_perms; allow dump_modem vendor_toolbox_exec:file execute_no_trans; allow dump_modem sysfs_dump_modem:file r_file_perms; allow dump_modem logbuffer_device:chr_file r_file_perms; +get_prop(dump_modem, vendor_modem_prop) diff --git a/modem/dump_modemlog/sepolicy/genfs_contexts b/modem/dump_modemlog/sepolicy/genfs_contexts index 98a8fc5..d5776ee 100644 --- a/modem/dump_modemlog/sepolicy/genfs_contexts +++ b/modem/dump_modemlog/sepolicy/genfs_contexts @@ -1,2 +1,8 @@ -genfscon sysfs /devices/platform/cpif/wakeup_events u:object_r:sysfs_dump_modem:s0 -genfscon sysfs /devices/platform/cpif/modem/pcie_event_stats u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /devices/platform/cpif/wakeup_events u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /devices/platform/cpif/modem/pcie_event_stats u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/modem_boot_duration u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/modem_wakeup_ap u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/pcie_link_state u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/pcie_link_duration u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/pcie_link_stats u:object_r:sysfs_dump_modem:s0 +genfscon sysfs /kernel/pixel_metrics/modem/pcie_link_updown u:object_r:sysfs_dump_modem:s0