init: Support reboot reason with thermal warmreset
Thermal shutdown could be due to tskin temperature or battery temperature. Pass reason while rebooting the system to reflect properly in boot.reason Bug: 238464124 Test: Build and boot on device. Check reboot reason for thermal shutdown and battery thermal shutdown with thermal warmreset enabled. Change-Id: I192562fed48ae7da7843e383362cd22a76ce479f
This commit is contained in:
parent
460f70bb52
commit
5754b5ab10
3 changed files with 11 additions and 7 deletions
|
@ -608,7 +608,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str
|
|||
if (sem_init(&reboot_semaphore, false, 0) == -1) {
|
||||
// These should never fail, but if they do, skip the graceful reboot and reboot immediately.
|
||||
LOG(ERROR) << "sem_init() fail and RebootSystem() return!";
|
||||
RebootSystem(cmd, reboot_target);
|
||||
RebootSystem(cmd, reboot_target, reason);
|
||||
}
|
||||
|
||||
// Start a thread to monitor init shutdown process
|
||||
|
@ -636,7 +636,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str
|
|||
// worry about unmounting it.
|
||||
if (!IsDataMounted("*")) {
|
||||
sync();
|
||||
RebootSystem(cmd, reboot_target);
|
||||
RebootSystem(cmd, reboot_target, reason);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
@ -769,7 +769,7 @@ static void DoReboot(unsigned int cmd, const std::string& reason, const std::str
|
|||
LOG(INFO) << "Shutdown /data";
|
||||
}
|
||||
}
|
||||
RebootSystem(cmd, reboot_target);
|
||||
RebootSystem(cmd, reboot_target, reason);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
|
|
@ -106,7 +106,8 @@ bool IsRebootCapable() {
|
|||
return value == CAP_SET;
|
||||
}
|
||||
|
||||
void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& rebootTarget) {
|
||||
void __attribute__((noreturn))
|
||||
RebootSystem(unsigned int cmd, const std::string& rebootTarget, const std::string& reboot_reason) {
|
||||
LOG(INFO) << "Reboot ending, jumping to kernel";
|
||||
|
||||
if (!IsRebootCapable()) {
|
||||
|
@ -127,10 +128,12 @@ void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string&
|
|||
|
||||
case ANDROID_RB_THERMOFF:
|
||||
if (android::base::GetBoolProperty("ro.thermal_warmreset", false)) {
|
||||
std::string reason = "shutdown,thermal";
|
||||
if (!reboot_reason.empty()) reason = reboot_reason;
|
||||
|
||||
LOG(INFO) << "Try to trigger a warm reset for thermal shutdown";
|
||||
static constexpr const char kThermalShutdownTarget[] = "shutdown,thermal";
|
||||
syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2,
|
||||
LINUX_REBOOT_CMD_RESTART2, kThermalShutdownTarget);
|
||||
LINUX_REBOOT_CMD_RESTART2, reason.c_str());
|
||||
} else {
|
||||
reboot(RB_POWER_OFF);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,8 @@ void SetFatalRebootTarget(const std::optional<std::string>& reboot_target = std:
|
|||
// so if any of the attempts to determine this fail, it will still return true.
|
||||
bool IsRebootCapable();
|
||||
// This is a wrapper around the actual reboot calls.
|
||||
void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& reboot_target);
|
||||
void __attribute__((noreturn)) RebootSystem(unsigned int cmd, const std::string& reboot_target,
|
||||
const std::string& reboot_reason = "");
|
||||
void __attribute__((noreturn)) InitFatalReboot(int signal_number);
|
||||
void InstallRebootSignalHandlers();
|
||||
|
||||
|
|
Loading…
Reference in a new issue