Add IBootControl 1.1 support to libboot_control.

Bug: 138861550
Test: vts
Change-Id: Id4a2963d6ab657d8ab076b7013492a691462b287
This commit is contained in:
David Anderson 2019-08-29 15:09:22 -07:00
parent b18f153b12
commit 46f38e4610
4 changed files with 33 additions and 1 deletions

View file

@ -28,6 +28,7 @@ cc_defaults {
],
shared_libs: [
"android.hardware.boot@1.1",
"libbase",
"liblog",
],

View file

@ -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_;

View file

@ -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;

View file

@ -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.