diff options
Diffstat (limited to 'src/vendorcode/google/chromeos/vboot2/vboot_handoff.c')
-rw-r--r-- | src/vendorcode/google/chromeos/vboot2/vboot_handoff.c | 19 |
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); } |