Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 46f38e46 authored by David Anderson's avatar David Anderson
Browse files

Add IBootControl 1.1 support to libboot_control.

Bug: 138861550
Test: vts
Change-Id: Id4a2963d6ab657d8ab076b7013492a691462b287
parent b18f153b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ cc_defaults {
    ],

    shared_libs: [
        "android.hardware.boot@1.1",
        "libbase",
        "liblog",
    ],
+8 −0
Original line number Diff line number Diff line
@@ -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_;
+21 −0
Original line number Diff line number Diff line
@@ -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;
+3 −1
Original line number Diff line number Diff line
@@ -163,8 +163,10 @@ struct bootloader_control {
    uint8_t nb_slot : 3;
    // Number of times left attempting to boot recovery.
    uint8_t recovery_tries_remaining : 3;
    // Status of any pending snapshot merge of dynamic partitions.
    uint8_t merge_status : 3;
    // Ensure 4-bytes alignment for slot_info field.
    uint8_t reserved0[2];
    uint8_t reserved0[1];
    // Per-slot information.  Up to 4 slots.
    struct slot_metadata slot_info[4];
    // Reserved for further use.