static pei_wrapper_entry_t load_reference_code(void) { struct prog prog = PROG_INIT(ASSET_REFCODE, CONFIG_CBFS_PREFIX "/refcode"); struct rmod_stage_load refcode = { .cbmem_id = CBMEM_ID_REFCODE, .prog = &prog, }; if (acpi_is_wakeup_s3()) { return load_refcode_from_cache(); } if (prog_locate(&prog)) { printk(BIOS_DEBUG, "Couldn't locate reference code.\n"); return NULL; } if (rmodule_stage_load(&refcode)) { printk(BIOS_DEBUG, "Error loading reference code.\n"); return NULL; } /* Cache loaded reference code. */ stage_cache_add(STAGE_REFCODE, &prog); return (pei_wrapper_entry_t)prog_entry(&prog); }
static int load_relocatable_ramstage(struct prog *ramstage) { struct rmod_stage_load rmod_ram = { .cbmem_id = CBMEM_ID_RAMSTAGE, .prog = ramstage, }; return rmodule_stage_load(&rmod_ram); }
int rmodule_stage_load_from_cbfs(struct rmod_stage_load *rsl) { struct cbfs_stage *stage; stage = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, rsl->prog->name, CBFS_TYPE_STAGE, NULL); if (stage == NULL) return -1; return rmodule_stage_load(rsl, stage); }
static int load_refcode_from_vboot(struct rmod_stage_load *refcode) { struct vboot_handoff *vboot_handoff; const struct firmware_component *fwc; struct cbfs_stage *stage; vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF); fwc = &vboot_handoff->components[CONFIG_VBOOT_REFCODE_INDEX]; if (vboot_handoff == NULL || vboot_handoff->selected_firmware == VB_SELECT_FIRMWARE_READONLY || CONFIG_VBOOT_REFCODE_INDEX >= MAX_PARSED_FW_COMPONENTS || fwc->size == 0 || fwc->address == 0) return -1; printk(BIOS_DEBUG, "refcode loading from vboot rw area.\n"); stage = (void *)(uintptr_t)fwc->address; if (rmodule_stage_load(refcode, stage)) { printk(BIOS_DEBUG, "Error loading reference code.\n"); return -1; } return 0; }
static void *vboot_load_ramstage(uint32_t cbmem_id, const char *name, const struct cbmem_entry **cbmem_entry) { struct vboot_handoff *vboot_handoff; struct cbfs_stage *stage; const struct firmware_component *fwc; struct rmod_stage_load rmod_load = { .cbmem_id = cbmem_id, .name = name, }; timestamp_add_now(TS_START_VBOOT); vboot_handoff = cbmem_add(CBMEM_ID_VBOOT_HANDOFF, sizeof(*vboot_handoff)); if (vboot_handoff == NULL) { printk(BIOS_DEBUG, "Could not add vboot_handoff structure.\n"); return NULL; } memset(vboot_handoff, 0, sizeof(*vboot_handoff)); vboot_invoke_wrapper(vboot_handoff); timestamp_add_now(TS_END_VBOOT); /* Take RO firmware path since no RW area was selected. */ if (vboot_handoff->selected_firmware != VB_SELECT_FIRMWARE_A && vboot_handoff->selected_firmware != VB_SELECT_FIRMWARE_B) { printk(BIOS_DEBUG, "No RW firmware selected: 0x%08x\n", vboot_handoff->selected_firmware); return NULL; } if (CONFIG_VBOOT_RAMSTAGE_INDEX >= MAX_PARSED_FW_COMPONENTS) { printk(BIOS_ERR, "Invalid ramstage index: %d\n", CONFIG_VBOOT_RAMSTAGE_INDEX); return NULL; } /* Check for invalid address. */ fwc = &vboot_handoff->components[CONFIG_VBOOT_RAMSTAGE_INDEX]; if (fwc->address == 0) { printk(BIOS_DEBUG, "RW ramstage image address invalid.\n"); return NULL; } printk(BIOS_DEBUG, "RW ramstage image at 0x%08x, 0x%08x bytes.\n", fwc->address, fwc->size); stage = (void *)fwc->address; if (rmodule_stage_load(&rmod_load, stage)) { vboot_handoff->selected_firmware = VB_SELECT_FIRMWARE_READONLY; printk(BIOS_DEBUG, "Could not load ramstage region.\n"); return NULL; } *cbmem_entry = rmod_load.cbmem_entry; return rmod_load.entry; }