1 // 2 // Copyright (C) 2015 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef UPDATE_ENGINE_AOSP_BOOT_CONTROL_ANDROID_H_ 18 #define UPDATE_ENGINE_AOSP_BOOT_CONTROL_ANDROID_H_ 19 20 #include <map> 21 #include <memory> 22 #include <string> 23 24 #include <liblp/builder.h> 25 #include <gtest/gtest_prod.h> 26 #include <BootControlClient.h> 27 28 #include "update_engine/aosp/dynamic_partition_control_android.h" 29 #include "update_engine/common/boot_control_interface.h" 30 #include "update_engine/common/dynamic_partition_control_interface.h" 31 32 namespace chromeos_update_engine { 33 34 // The Android implementation of the BootControlInterface. This implementation 35 // uses the libhardware's boot_control HAL to access the bootloader. 36 class BootControlAndroid final : public BootControlInterface { 37 public: 38 BootControlAndroid() = default; 39 ~BootControlAndroid() = default; 40 41 // Load boot_control HAL implementation using libhardware and 42 // initializes it. Returns false if an error occurred. 43 bool Init(); 44 45 // BootControlInterface overrides. 46 unsigned int GetNumSlots() const override; 47 BootControlInterface::Slot GetCurrentSlot() const override; 48 std::optional<PartitionDevice> GetPartitionDevice( 49 const std::string& partition_name, 50 uint32_t slot, 51 uint32_t current_slot, 52 bool not_in_payload = false) const override; 53 bool GetPartitionDevice(const std::string& partition_name, 54 BootControlInterface::Slot slot, 55 bool not_in_payload, 56 std::string* device, 57 bool* is_dynamic) const override; 58 bool GetPartitionDevice(const std::string& partition_name, 59 BootControlInterface::Slot slot, 60 std::string* device) const override; 61 bool IsSlotBootable(BootControlInterface::Slot slot) const override; 62 bool MarkSlotUnbootable(BootControlInterface::Slot slot) override; 63 bool SetActiveBootSlot(BootControlInterface::Slot slot) override; 64 bool MarkBootSuccessfulAsync(base::Callback<void(bool)> callback) override; 65 bool IsSlotMarkedSuccessful(BootControlInterface::Slot slot) const override; 66 Slot GetActiveBootSlot() override; 67 DynamicPartitionControlInterface* GetDynamicPartitionControl() override; 68 69 private: 70 std::unique_ptr<android::hal::BootControlClient> module_; 71 std::unique_ptr<DynamicPartitionControlAndroid> dynamic_control_; 72 73 friend class BootControlAndroidTest; 74 friend class UpdateAttempterAndroidIntegrationTest; 75 76 DISALLOW_COPY_AND_ASSIGN(BootControlAndroid); 77 }; 78 79 } // namespace chromeos_update_engine 80 81 #endif // UPDATE_ENGINE_AOSP_BOOT_CONTROL_ANDROID_H_ 82