summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Salyzyn2018-03-16 11:26:05 -0500
committerMark Salyzyn2018-06-04 10:32:11 -0500
commit15199251498fbbdca0550493b36a8d511229db19 (patch)
tree1587d3dc9e1094ab85dabf5dca6c5ac091c2fd74
parent7c4d393c2443ca272ce9145671af4b01140c922e (diff)
downloadplatform-system-core-15199251498fbbdca0550493b36a8d511229db19.tar.gz
platform-system-core-15199251498fbbdca0550493b36a8d511229db19.tar.xz
platform-system-core-15199251498fbbdca0550493b36a8d511229db19.zip
bootstat: shutdown reports reboot
Some devices report the following canonical boot reason for all shutdown operations: reboot,kernel_power_off_charging__reboot_system because shutdown switches to a charging kernel, and reboots into the system when the user presses the power button. Thus last kernel messages arrives as: <0>.(0)[53:pmic_thread]reboot: Restarting system with command \ 'kernel power off charging reboot system' -> "shutdown" (w/o last boot reason) -> "shutdown,<subreason>" (w/last boot reason) The reboot reason from that charging instance propagates as a fortified boot reason blocking interpretation of the last boot reason that manages shutdown canonical boot reason determination. The fix is to change reboot,kernel_power_off_charging__reboot_system to shutdown, so that it is viewed as a blunt reason that can be overridden by last boot reason. We added the above boot reason to kBootReasonMap because the Bit Error Handler can use it to reconstruct if there is any damage to the last kernel messages content. The sad thing is that the enum will never propagate as we are filtering it out and reporting "shutdown" instead. Of course, we are now covered for a can not happen. Test: boot_reason_test.sh Bug: 74595769 Bug: 63736262 Change-Id: I28987f0871af7d967cc4bbbffed43bd42349acdd
-rw-r--r--bootstat/bootstat.cpp6
1 files changed, 5 insertions, 1 deletions
diff --git a/bootstat/bootstat.cpp b/bootstat/bootstat.cpp
index 3250b3e34..fb0423a6e 100644
--- a/bootstat/bootstat.cpp
+++ b/bootstat/bootstat.cpp
@@ -201,7 +201,7 @@ const std::map<std::string, int32_t> kBootReasonMap = {
201 {"cold", 56}, 201 {"cold", 56},
202 {"hard", 57}, 202 {"hard", 57},
203 {"warm", 58}, 203 {"warm", 58},
204 // {"recovery", 59}, // Duplicate of enum 3 above. Immediate reuse possible. 204 {"reboot,kernel_power_off_charging__reboot_system", 59}, // Can not happen
205 {"thermal-shutdown", 60}, 205 {"thermal-shutdown", 60},
206 {"shutdown,thermal", 61}, 206 {"shutdown,thermal", 61},
207 {"shutdown,battery", 62}, 207 {"shutdown,battery", 62},
@@ -850,6 +850,10 @@ std::string BootReasonStrToReason(const std::string& boot_reason) {
850 ret = "reboot," + subReason; // legitimize unknown reasons 850 ret = "reboot," + subReason; // legitimize unknown reasons
851 } 851 }
852 } 852 }
853 // Some bootloaders shutdown results record in last kernel message.
854 if (!strcmp(ret.c_str(), "reboot,kernel_power_off_charging__reboot_system")) {
855 ret = "shutdown";
856 }
853 } 857 }
854 858
855 // Check for kernel panics, allowed to override reboot command. 859 // Check for kernel panics, allowed to override reboot command.