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;