From d672e47b32128978637c5e96272b9d77d3f3ce29 Mon Sep 17 00:00:00 2001 From: "Chenfu.Liao" Date: Tue, 29 Jun 2021 15:41:22 +0800 Subject: [PATCH] Add Quiescent Reboot Target [Description] In the Quiescent Reboot process, the android init process will pass the reboot target name "quiescent" to the kernel through reboot syscall. Kernel will write the boot-quiescent flag to the misc partition to notify the bootloader. When rebooting, bootloader will be added to bootargs androidboot.quiescent=1 to notify android . In the new version of GKI, the filp_open function is not allowed so that it is impossible to write the quiescent flag in the Kernel to the misc partition. https://android-review.googlesource.com/c/kernel/common/+/1705108 /1..29/android/abi_gki_aarch64_mtk#b641 Bug: 192634025 Test: adb reboot quiescent adb shell setprop sys.powerctl reboot,quiescent Change-Id: I5ac982a1f16df39fa6bf567729a18ca8225f21f2 --- init/reboot.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/init/reboot.cpp b/init/reboot.cpp index 0e788e495..c5f1ee4ff 100644 --- a/init/reboot.cpp +++ b/init/reboot.cpp @@ -1035,6 +1035,20 @@ void HandlePowerctlMessage(const std::string& command) { return; } } + } else if (reboot_target == "quiescent") { + bootloader_message boot = {}; + if (std::string err; !read_bootloader_message(&boot, &err)) { + LOG(ERROR) << "Failed to read bootloader message: " << err; + } + // Update the boot command field if it's empty, and preserve + // the other arguments in the bootloader message. + if (!CommandIsPresent(&boot)) { + strlcpy(boot.command, "boot-quiescent", sizeof(boot.command)); + if (std::string err; !write_bootloader_message(boot, &err)) { + LOG(ERROR) << "Failed to set bootloader message: " << err; + return; + } + } } else if (reboot_target == "sideload" || reboot_target == "sideload-auto-reboot" || reboot_target == "fastboot") { std::string arg = reboot_target == "sideload-auto-reboot" ? "sideload_auto_reboot"