Merge "init: make fatal reboot target configurable" into qt-dev
This commit is contained in:
commit
4d63d1b7bb
4 changed files with 27 additions and 3 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue