Example #1
0
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);
}
Example #2
0
static int vboot_locate(struct cbfs_props *props)
{
    struct region selected_region;

    /* Don't honor vboot results until the vboot logic has run. */
    if (!vboot_logic_executed())
        return -1;

    if (vb2_get_selected_region(&selected_region))
        return -1;

    props->offset = region_offset(&selected_region);
    props->size = region_sz(&selected_region);

    return 0;
}