aboutsummaryrefslogtreecommitdiff
path: root/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vendorcode/google/chromeos/vboot2/vboot_handoff.c')
-rw-r--r--src/vendorcode/google/chromeos/vboot2/vboot_handoff.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
index e7e0d99632..955d72fa43 100644
--- a/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
+++ b/src/vendorcode/google/chromeos/vboot2/vboot_handoff.c
@@ -127,8 +127,9 @@ void vboot_fill_handoff(void)
int i;
struct vboot_handoff *vh;
struct vb2_shared_data *sd;
- struct region fw_main;
+ struct region_device fw_main;
struct vboot_components *fw_info;
+ size_t metadata_sz;
struct vb2_working_data *wd = vboot_get_working_data();
sd = vboot_get_work_buffer(wd);
@@ -151,15 +152,23 @@ void vboot_fill_handoff(void)
if (vboot_is_readonly_path(wd))
return;
- vb2_get_selected_region(wd, &fw_main);
- fw_info = vboot_locate_components(&fw_main);
+ if (vb2_get_selected_region(wd, &fw_main))
+ die("No component metadata.\n");
+
+ metadata_sz = sizeof(*fw_info);
+ metadata_sz += MAX_PARSED_FW_COMPONENTS * sizeof(fw_info->entries[0]);
+
+ fw_info = rdev_mmap(&fw_main, 0, metadata_sz);
+
if (fw_info == NULL)
die("failed to locate firmware components\n");
/* these offset & size are used to load a rw boot loader */
for (i = 0; i < fw_info->num_components; i++) {
- vh->components[i].address =
- region_offset(&fw_main) + fw_info->entries[i].offset;
+ vh->components[i].address = region_device_offset(&fw_main);
+ vh->components[i].address += fw_info->entries[i].offset;
vh->components[i].size = fw_info->entries[i].size;
}
+
+ rdev_munmap(&fw_main, fw_info);
}