void vboot_fill_handoff(void) { struct vboot_handoff *vh; struct vb2_shared_data *sd; sd = vb2_get_shared_data(); sd->workbuf_hash_offset = 0; sd->workbuf_hash_size = 0; printk(BIOS_INFO, "creating vboot_handoff structure\n"); vh = cbmem_add(CBMEM_ID_VBOOT_HANDOFF, sizeof(*vh)); if (vh == NULL) /* we don't need to failover gracefully here because this * shouldn't happen with the image that has passed QA. */ die("failed to allocate vboot_handoff structure\n"); memset(vh, 0, sizeof(*vh)); /* needed until we finish transtion to vboot2 for kernel verification */ fill_vboot_handoff(vh, sd); /* * The recovery mode switch is cleared (typically backed by EC) here * to allow multiple queries to get_recovery_mode_switch() and have * them return consistent results during the verified boot path as well * as dram initialization. x86 systems ignore the saved dram settings * in the recovery path in order to start from a clean slate. Therefore * clear the state here since this function is called when memory * is known to be up. */ clear_recovery_mode_switch(); }
void vboot_fill_handoff(void) { int i; struct vboot_handoff *vh; struct vb2_shared_data *sd; 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); sd->workbuf_hash_offset = 0; sd->workbuf_hash_size = 0; printk(BIOS_INFO, "creating vboot_handoff structure\n"); vh = cbmem_add(CBMEM_ID_VBOOT_HANDOFF, sizeof(*vh)); if (vh == NULL) /* we don't need to failover gracefully here because this * shouldn't happen with the image that has passed QA. */ die("failed to allocate vboot_handoff structure\n"); memset(vh, 0, sizeof(*vh)); /* needed until we finish transtion to vboot2 for kernel verification */ fill_vboot_handoff(vh, sd); /* Nothing left to do in readonly path. */ if (vboot_is_readonly_path(wd)) return; 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_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); }