/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "host/commands/assemble_cvd/boot_config.h" #include #include #include #include #include #include #include "common/libs/utils/files.h" #include "common/libs/utils/subprocess.h" #include "host/libs/config/cuttlefish_config.h" #include "host/libs/config/kernel_args.h" namespace { size_t WriteEnvironment(const cuttlefish::CuttlefishConfig& config, const std::string& env_path) { std::ostringstream env; auto kernel_args = KernelCommandLineFromConfig(config); env << "bootargs=" << android::base::Join(kernel_args, " ") << '\0'; if (!config.boot_slot().empty()) { env << "android_slot_suffix=_" << config.boot_slot() << '\0'; } env << "bootdevice=0:1" << '\0'; env << "bootdelay=0" << '\0'; env << "bootcmd=boot_android virtio -" << '\0'; env << '\0'; std::string env_str = env.str(); std::ofstream file_out(env_path.c_str(), std::ios::binary); file_out << env_str; if(!file_out.good()) { return 0; } return env_str.length(); } } // namespace bool InitBootloaderEnvPartition(const cuttlefish::CuttlefishConfig& config, const std::string& boot_env_image_path) { auto tmp_boot_env_image_path = boot_env_image_path + ".tmp"; auto uboot_env_path = config.AssemblyPath("u-boot.env"); if(!WriteEnvironment(config, uboot_env_path)) { LOG(ERROR) << "Unable to write out plaintext env '" << uboot_env_path << ".'"; return false; } auto mkimage_path = cuttlefish::DefaultHostArtifactsPath("bin/mkenvimage"); cuttlefish::Command cmd(mkimage_path); cmd.AddParameter("-s"); cmd.AddParameter("4096"); cmd.AddParameter("-o"); cmd.AddParameter(tmp_boot_env_image_path); cmd.AddParameter(uboot_env_path); int success = cmd.Start().Wait(); if (success != 0) { LOG(ERROR) << "Unable to run mkenvimage. Exited with status " << success; return false; } if(!cuttlefish::FileExists(boot_env_image_path) || cuttlefish::ReadFile(boot_env_image_path) != cuttlefish::ReadFile(tmp_boot_env_image_path)) { if(!cuttlefish::RenameFile(tmp_boot_env_image_path, boot_env_image_path)) { LOG(ERROR) << "Unable to delete the old env image."; return false; } LOG(DEBUG) << "Updated bootloader environment image."; } else { cuttlefish::RemoveFile(tmp_boot_env_image_path); } return true; }