From d96c6b8e881054de1eb38ac87612b975ec4aaf27 Mon Sep 17 00:00:00 2001 From: terryguan Date: Fri, 16 Aug 2024 14:27:23 -0700 Subject: [PATCH] Add resume from hibernation in first stage init If bootconfig hibernation_resume_device is present in boot config, then we write that value to /sys/power/resume Bug: 339688542 Test: Check resume from hibernation/boots with/without config present Change-Id: I1a9bf63af4dab07e494740722898c1aba33c00b5 --- fs_mgr/libfstab/fstab_priv.h | 3 --- fs_mgr/libfstab/include/fstab/fstab.h | 3 +++ init/first_stage_init.cpp | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/fs_mgr/libfstab/fstab_priv.h b/fs_mgr/libfstab/fstab_priv.h index 5105da001..73cb17518 100644 --- a/fs_mgr/libfstab/fstab_priv.h +++ b/fs_mgr/libfstab/fstab_priv.h @@ -39,9 +39,6 @@ std::string GetFstabPath(); void ImportBootconfigFromString(const std::string& bootconfig, const std::function& fn); -bool GetBootconfigFromString(const std::string& bootconfig, const std::string& key, - std::string* out); - void ImportKernelCmdlineFromString(const std::string& cmdline, const std::function& fn); diff --git a/fs_mgr/libfstab/include/fstab/fstab.h b/fs_mgr/libfstab/include/fstab/fstab.h index 1696daff0..21fe01726 100644 --- a/fs_mgr/libfstab/include/fstab/fstab.h +++ b/fs_mgr/libfstab/include/fstab/fstab.h @@ -153,5 +153,8 @@ bool GetKernelCmdline(const std::string& key, std::string* out); // Return the "other" slot for the given slot suffix. std::string OtherSlotSuffix(const std::string& suffix); +bool GetBootconfigFromString(const std::string& bootconfig, const std::string& key, + std::string* out); + } // namespace fs_mgr } // namespace android diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp index bfe636bbf..e06a64593 100644 --- a/init/first_stage_init.cpp +++ b/init/first_stage_init.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -303,6 +304,22 @@ static BootMode GetBootMode(const std::string& cmdline, const std::string& bootc return BootMode::NORMAL_MODE; } +static void MaybeResumeFromHibernation(const std::string& bootconfig) { + std::string hibernationResumeDevice; + android::fs_mgr::GetBootconfigFromString(bootconfig, "androidboot.hibernation_resume_device", + &hibernationResumeDevice); + if (!hibernationResumeDevice.empty()) { + android::base::unique_fd fd(open("/sys/power/resume", O_RDWR | O_CLOEXEC)); + if (fd >= 0) { + if (!android::base::WriteStringToFd(hibernationResumeDevice, fd)) { + PLOG(ERROR) << "Failed to write to /sys/power/resume"; + } + } else { + PLOG(ERROR) << "Failed to open /sys/power/resume"; + } + } +} + static std::unique_ptr CreateFirstStageMount(const std::string& cmdline) { auto ret = FirstStageMount::Create(cmdline); if (ret.ok()) { @@ -442,6 +459,8 @@ int FirstStageMain(int argc, char** argv) { << module_elapse_time.count() << " ms"; } + MaybeResumeFromHibernation(bootconfig); + std::unique_ptr fsm; bool created_devices = false;