Merge "init: make fatal reboot target configurable" into qt-dev

This commit is contained in:
TreeHugger Robot 2019-05-31 15:35:15 +00:00 committed by Android (Google) Code Review
commit 4d63d1b7bb
4 changed files with 27 additions and 3 deletions

View file

@ -45,6 +45,7 @@ uint32_t HandlePropertySet(const std::string& name, const std::string& value,
const std::string& source_context, const ucred& cr, std::string* error); const std::string& source_context, const ucred& cr, std::string* error);
// reboot_utils.h // reboot_utils.h
inline void SetFatalRebootTarget() {}
inline void __attribute__((noreturn)) InitFatalReboot() { inline void __attribute__((noreturn)) InitFatalReboot() {
abort(); abort();
} }

View file

@ -32,6 +32,27 @@
namespace android { namespace android {
namespace init { namespace init {
static std::string init_fatal_reboot_target = "bootloader";
void SetFatalRebootTarget() {
std::string cmdline;
android::base::ReadFileToString("/proc/cmdline", &cmdline);
cmdline = android::base::Trim(cmdline);
const char kRebootTargetString[] = "androidboot.init_fatal_reboot_target=";
auto start_pos = cmdline.find(kRebootTargetString);
if (start_pos == std::string::npos) {
return; // We already default to bootloader if no setting is provided.
}
start_pos += sizeof(kRebootTargetString) - 1;
auto end_pos = cmdline.find(' ', start_pos);
// if end_pos isn't found, then we've run off the end, but this is okay as this is the last
// entry, and -1 is a valid size for string::substr();
auto size = end_pos == std::string::npos ? -1 : end_pos - start_pos;
init_fatal_reboot_target = cmdline.substr(start_pos, size);
}
bool IsRebootCapable() { bool IsRebootCapable() {
if (!CAP_IS_SUPPORTED(CAP_SYS_BOOT)) { if (!CAP_IS_SUPPORTED(CAP_SYS_BOOT)) {
PLOG(WARNING) << "CAP_SYS_BOOT is not supported"; PLOG(WARNING) << "CAP_SYS_BOOT is not supported";
@ -85,13 +106,13 @@ void __attribute__((noreturn)) InitFatalReboot() {
if (pid == -1) { if (pid == -1) {
// Couldn't fork, don't even try to backtrace, just reboot. // Couldn't fork, don't even try to backtrace, just reboot.
RebootSystem(ANDROID_RB_RESTART2, "bootloader"); RebootSystem(ANDROID_RB_RESTART2, init_fatal_reboot_target);
} else if (pid == 0) { } else if (pid == 0) {
// Fork a child for safety, since we always want to shut down if something goes wrong, but // Fork a child for safety, since we always want to shut down if something goes wrong, but
// its worth trying to get the backtrace, even in the signal handler, since typically it // its worth trying to get the backtrace, even in the signal handler, since typically it
// does work despite not being async-signal-safe. // does work despite not being async-signal-safe.
sleep(5); sleep(5);
RebootSystem(ANDROID_RB_RESTART2, "bootloader"); RebootSystem(ANDROID_RB_RESTART2, init_fatal_reboot_target);
} }
// In the parent, let's try to get a backtrace then shutdown. // In the parent, let's try to get a backtrace then shutdown.
@ -103,7 +124,7 @@ void __attribute__((noreturn)) InitFatalReboot() {
for (size_t i = 0; i < backtrace->NumFrames(); i++) { for (size_t i = 0; i < backtrace->NumFrames(); i++) {
LOG(ERROR) << backtrace->FormatFrameData(i); LOG(ERROR) << backtrace->FormatFrameData(i);
} }
RebootSystem(ANDROID_RB_RESTART2, "bootloader"); RebootSystem(ANDROID_RB_RESTART2, init_fatal_reboot_target);
} }
void InstallRebootSignalHandlers() { void InstallRebootSignalHandlers() {

View file

@ -21,6 +21,7 @@
namespace android { namespace android {
namespace init { namespace init {
void SetFatalRebootTarget();
// Determines whether the system is capable of rebooting. This is conservative, // Determines whether the system is capable of rebooting. This is conservative,
// so if any of the attempts to determine this fail, it will still return true. // so if any of the attempts to determine this fail, it will still return true.
bool IsRebootCapable(); bool IsRebootCapable();

View file

@ -468,6 +468,7 @@ void SetStdioToDevNull(char** argv) {
} }
void InitKernelLogging(char** argv) { void InitKernelLogging(char** argv) {
SetFatalRebootTarget();
android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter); android::base::InitLogging(argv, &android::base::KernelLogger, InitAborter);
} }