void stage_cache_add(int stage_id, const struct prog *stage) { struct imd *imd; const struct imd_entry *e; struct stage_cache *meta; void *c; imd = imd_get(); e = imd_entry_add(imd, CBMEM_ID_STAGEx_META + stage_id, sizeof(*meta)); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't add %x metadata to imd\n", CBMEM_ID_STAGEx_META + stage_id); return; } meta = imd_entry_at(imd, e); meta->load_addr = (uintptr_t)prog_start(stage); meta->entry_addr = (uintptr_t)prog_entry(stage); meta->arg = (uintptr_t)prog_entry_arg(stage); e = imd_entry_add(imd, CBMEM_ID_STAGEx_CACHE + stage_id, prog_size(stage)); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't add stage_cache %x to imd\n", CBMEM_ID_STAGEx_CACHE + stage_id); return; } c = imd_entry_at(imd, e); memcpy(c, prog_start(stage), prog_size(stage)); }
void stage_cache_load_stage(int stage_id, struct prog *stage) { struct imd *imd; struct stage_cache *meta; const struct imd_entry *e; void *c; size_t size; imd = imd_get(); e = imd_entry_find(imd, CBMEM_ID_STAGEx_META + stage_id); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't find %x metadata in imd\n", CBMEM_ID_STAGEx_META + stage_id); return; } meta = imd_entry_at(imd, e); e = imd_entry_find(imd, CBMEM_ID_STAGEx_CACHE + stage_id); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't find stage_cache %x in imd\n", CBMEM_ID_STAGEx_CACHE + stage_id); return; } c = imd_entry_at(imd, e); size = imd_entry_size(imd, e); memcpy((void *)(uintptr_t)meta->load_addr, c, size); prog_set_area(stage, (void *)(uintptr_t)meta->load_addr, size); prog_set_entry(stage, (void *)(uintptr_t)meta->entry_addr, (void *)(uintptr_t)meta->arg); }
void cbmem_add_records_to_cbtable(struct lb_header *header) { struct imd_cursor cursor; struct imd *imd; imd = cbmem_get_imd(); if (imd_cursor_init(imd, &cursor)) return; while (1) { const struct imd_entry *e; struct lb_cbmem_entry *lbe; uint32_t id; e = imd_cursor_next(&cursor); if (e == NULL) break; id = imd_entry_id(imd, e); /* Don't add these metadata entries. */ if (id == CBMEM_ID_IMD_ROOT || id == CBMEM_ID_IMD_SMALL) continue; lbe = (struct lb_cbmem_entry *)lb_new_record(header); lbe->tag = LB_TAG_CBMEM_ENTRY; lbe->size = sizeof(*lbe); lbe->address = (uintptr_t)imd_entry_at(imd, e); lbe->entry_size = imd_entry_size(imd, e); lbe->id = id; } }
void *cbmem_entry_start(const struct cbmem_entry *entry) { struct imd *imd; struct imd imd_backing; imd = imd_init_backing_with_recover(&imd_backing); return imd_entry_at(imd, cbmem_to_imd(entry)); }
void *cbmem_find(u32 id) { struct imd *imd; struct imd imd_backing; const struct imd_entry *e; imd = imd_init_backing_with_recover(&imd_backing); e = imd_entry_find(imd, id); if (e == NULL) return NULL; return imd_entry_at(imd, e); }
void stage_cache_get_raw(int stage_id, void **base, size_t *size) { struct imd *imd; const struct imd_entry *e; imd = imd_get(); e = imd_entry_find(imd, CBMEM_ID_STAGEx_RAW + stage_id); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't find %x raw data to imd\n", CBMEM_ID_STAGEx_RAW + stage_id); return; } *base = imd_entry_at(imd, e); *size = imd_entry_size(imd, e); }
void stage_cache_add_raw(int stage_id, const void *base, const size_t size) { struct imd *imd; const struct imd_entry *e; void *c; imd = imd_get(); e = imd_entry_add(imd, CBMEM_ID_STAGEx_RAW + stage_id, size); if (e == NULL) { printk(BIOS_DEBUG, "Error: Can't add %x raw data to imd\n", CBMEM_ID_STAGEx_RAW + stage_id); return; } c = imd_entry_at(imd, e); if (c == NULL) { printk(BIOS_DEBUG, "Error: Can't get %x raw entry in imd\n", CBMEM_ID_STAGEx_RAW + stage_id); return; } memcpy(c, base, size); }