diff options
Diffstat (limited to 'boot_control')
-rw-r--r-- | boot_control/Android.bp | 1 | ||||
-rw-r--r-- | boot_control/include/libboot_control/libboot_control.h | 8 | ||||
-rw-r--r-- | boot_control/libboot_control.cpp | 21 |
3 files changed, 30 insertions, 0 deletions
diff --git a/boot_control/Android.bp b/boot_control/Android.bp index f6a6ceddd..b2e68dfd4 100644 --- a/boot_control/Android.bp +++ b/boot_control/Android.bp @@ -28,6 +28,7 @@ cc_defaults { ], shared_libs: [ + "android.hardware.boot@1.1", "libbase", "liblog", ], diff --git a/boot_control/include/libboot_control/libboot_control.h b/boot_control/include/libboot_control/libboot_control.h index 6582d0244..34a9affe1 100644 --- a/boot_control/include/libboot_control/libboot_control.h +++ b/boot_control/include/libboot_control/libboot_control.h @@ -18,11 +18,15 @@ #include <string> +#include <android/hardware/boot/1.1/IBootControl.h> + namespace android { namespace bootable { // Helper library to implement the IBootControl HAL using the misc partition. class BootControl { + using MergeStatus = ::android::hardware::boot::V1_1::MergeStatus; + public: bool Init(); unsigned int GetNumberSlots(); @@ -34,6 +38,10 @@ class BootControl { bool IsSlotBootable(unsigned int slot); const char* GetSuffix(unsigned int slot); bool IsSlotMarkedSuccessful(unsigned int slot); + bool SetSnapshotMergeStatus(MergeStatus status); + MergeStatus GetSnapshotMergeStatus(); + + bool IsValidSlot(unsigned int slot); const std::string& misc_device() const { return misc_device_; diff --git a/boot_control/libboot_control.cpp b/boot_control/libboot_control.cpp index 89cf8786a..e3bff9ff3 100644 --- a/boot_control/libboot_control.cpp +++ b/boot_control/libboot_control.cpp @@ -34,6 +34,8 @@ namespace android { namespace bootable { +using ::android::hardware::boot::V1_1::MergeStatus; + // The number of boot attempts that should be made from a new slot before // rolling back to the previous slot. constexpr unsigned int kDefaultBootAttempts = 7; @@ -327,6 +329,25 @@ bool BootControl::IsSlotMarkedSuccessful(unsigned int slot) { return bootctrl.slot_info[slot].successful_boot && bootctrl.slot_info[slot].tries_remaining; } +bool BootControl::IsValidSlot(unsigned int slot) { + return slot < kMaxNumSlots && slot < num_slots_; +} + +bool BootControl::SetSnapshotMergeStatus(MergeStatus status) { + bootloader_control bootctrl; + if (!LoadBootloaderControl(misc_device_, &bootctrl)) return false; + + bootctrl.merge_status = (unsigned int)status; + return UpdateAndSaveBootloaderControl(misc_device_, &bootctrl); +} + +MergeStatus BootControl::GetSnapshotMergeStatus() { + bootloader_control bootctrl; + if (!LoadBootloaderControl(misc_device_, &bootctrl)) return MergeStatus::UNKNOWN; + + return (MergeStatus)bootctrl.merge_status; +} + const char* BootControl::GetSuffix(unsigned int slot) { if (slot >= kMaxNumSlots || slot >= num_slots_) { return nullptr; |