bootloader_message: Add helpers for handling IBootControl MergeStatus.
Move merge_status from bootloader_control_ab, which is in vendor space, to a new generic AOSP struct in system space. This will allow more devices to share the same HAL implementation. This patch also changes libboot_control to compensate for merge_status moving out of vendor space. The reference HAL library now also provides separate helper functions for managing the merge status, so devices using a custom boot control HAL can still take advantage of the new misc implementation. Bug: 139156011 Test: manual test Change-Id: I5cd824e25f9d07aad1476301def5cdc3f506b029
This commit is contained in:
@@ -292,6 +292,49 @@ bool WriteMiscPartitionVendorSpace(const void* data, size_t size, size_t offset,
|
||||
err);
|
||||
}
|
||||
|
||||
static bool ValidateSystemSpaceRegion(size_t offset, size_t size, std::string* err) {
|
||||
if (size <= SYSTEM_SPACE_SIZE_IN_MISC && offset <= (SYSTEM_SPACE_SIZE_IN_MISC - size)) {
|
||||
return true;
|
||||
}
|
||||
*err = android::base::StringPrintf("Out of bound access (offset %zu size %zu)", offset, size);
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool ReadMiscPartitionSystemSpace(void* data, size_t size, size_t offset, std::string* err) {
|
||||
if (!ValidateSystemSpaceRegion(offset, size, err)) {
|
||||
return false;
|
||||
}
|
||||
auto misc_blk_device = get_misc_blk_device(err);
|
||||
if (misc_blk_device.empty()) {
|
||||
return false;
|
||||
}
|
||||
return read_misc_partition(data, size, misc_blk_device, SYSTEM_SPACE_OFFSET_IN_MISC + offset,
|
||||
err);
|
||||
}
|
||||
|
||||
static bool WriteMiscPartitionSystemSpace(const void* data, size_t size, size_t offset,
|
||||
std::string* err) {
|
||||
if (!ValidateSystemSpaceRegion(offset, size, err)) {
|
||||
return false;
|
||||
}
|
||||
auto misc_blk_device = get_misc_blk_device(err);
|
||||
if (misc_blk_device.empty()) {
|
||||
return false;
|
||||
}
|
||||
return write_misc_partition(data, size, misc_blk_device, SYSTEM_SPACE_OFFSET_IN_MISC + offset,
|
||||
err);
|
||||
}
|
||||
|
||||
bool ReadMiscVirtualAbMessage(misc_virtual_ab_message* message, std::string* err) {
|
||||
return ReadMiscPartitionSystemSpace(message, sizeof(*message),
|
||||
offsetof(misc_system_space_layout, virtual_ab_message), err);
|
||||
}
|
||||
|
||||
bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::string* err) {
|
||||
return WriteMiscPartitionSystemSpace(&message, sizeof(message),
|
||||
offsetof(misc_system_space_layout, virtual_ab_message), err);
|
||||
}
|
||||
|
||||
extern "C" bool write_reboot_bootloader(void) {
|
||||
std::string err;
|
||||
return write_reboot_bootloader(&err);
|
||||
|
||||
Reference in New Issue
Block a user