diff options
author | Jeremy Compostella <jeremy.compostella@intel.com> | 2016-04-15 19:01:27 +0200 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-04-15 19:01:27 +0200 |
commit | c747a51548968f7537234419ef5019210f97f75f (patch) | |
tree | b0b969d3ffc6ffaaba31ba48befd48dcabc92369 | |
parent | Explicitly set the font face and color. am: 70ae70b (diff) | |
parent | Merge "Define the Bootloader Control A/B structure" am: e6af522 (diff) | |
download | android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar.gz android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar.bz2 android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar.lz android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar.xz android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.tar.zst android_bootable_recovery-c747a51548968f7537234419ef5019210f97f75f.zip |
-rw-r--r-- | bootloader.h | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/bootloader.h b/bootloader.h index 742a4abfb..92c74f078 100644 --- a/bootloader.h +++ b/bootloader.h @@ -45,7 +45,8 @@ * commandline parameter. This is used by fs_mgr to mount /system and * other partitions with the slotselect flag set in fstab. A/B * implementations are free to use all 32 bytes and may store private - * data past the first NUL-byte in this field. + * data past the first NUL-byte in this field. It is encouraged, but + * not mandatory, to use 'struct bootloader_control' described below. */ struct bootloader_message { char command[32]; @@ -62,6 +63,57 @@ struct bootloader_message { char reserved[192]; }; +#define BOOT_CTRL_MAGIC 0x42414342 /* Bootloader Control AB */ +#define BOOT_CTRL_VERSION 1 + +struct slot_metadata { + // Slot priority with 15 meaning highest priority, 1 lowest + // priority and 0 the slot is unbootable. + uint8_t priority : 4; + // Number of times left attempting to boot this slot. + uint8_t tries_remaining : 3; + // 1 if this slot has booted successfully, 0 otherwise. + uint8_t successful_boot : 1; + // Reserved for further use. + uint8_t reserved; +} __attribute__((packed)); + +/* Bootloader Control AB + * + * This struct can be used to manage A/B metadata. It is designed to + * be put in the 'slot_suffix' field of the 'bootloader_message' + * structure described above. It is encouraged to use the + * 'bootloader_control' structure to store the A/B metadata, but not + * mandatory. + */ +struct bootloader_control { + // NUL terminated active slot suffix. + char slot_suffix[4]; + // Bootloader Control AB magic number (see BOOT_CTRL_MAGIC). + uint32_t magic; + // Version of struct being used (see BOOT_CTRL_VERSION). + uint8_t version; + // Number of slots being managed. + uint8_t nb_slot : 3; + // Number of times left attempting to boot recovery. + uint8_t recovery_tries_remaining : 3; + // Ensure 4-bytes alignment for slot_info field. + uint8_t reserved0[2]; + // Per-slot information. Up to 4 slots. + struct slot_metadata slot_info[4]; + // Reserved for further use. + uint8_t reserved1[8]; + // CRC32 of all 28 bytes preceding this field (little endian + // format). + uint32_t crc32_le; +} __attribute__((packed)); + +#if (__STDC_VERSION__ >= 201112L) +_Static_assert(sizeof(struct bootloader_control) == + sizeof(((struct bootloader_message *)0)->slot_suffix), + "struct bootloader_control has wrong size"); +#endif + /* Read and write the bootloader command from the "misc" partition. * These return zero on success. */ |