void stage_cache_load_stage(int stage_id, struct prog *stage) { struct stage_cache *meta; const struct cbmem_entry *e; void *c; size_t size; void *load_addr; prog_set_entry(stage, NULL, NULL); meta = cbmem_find(CBMEM_ID_STAGEx_META + stage_id); if (meta == NULL) return; e = cbmem_entry_find(CBMEM_ID_STAGEx_CACHE + stage_id); if (e == NULL) return; c = cbmem_entry_start(e); size = cbmem_entry_size(e); load_addr = (void *)(uintptr_t)meta->load_addr; memcpy(load_addr, c, size); prog_set_area(stage, load_addr, size); prog_set_entry(stage, (void *)(uintptr_t)meta->entry_addr, NULL); }
void *cbmem_add(u32 id, u64 size) { const struct cbmem_entry *entry; entry = cbmem_entry_add(id, size); if (entry == NULL) return NULL; return cbmem_entry_start(entry); }
void *cbmem_find(u32 id) { const struct cbmem_entry *entry; entry = cbmem_entry_find(id); if (entry == NULL) return NULL; return cbmem_entry_start(entry); }
static void *get_tcpa_log(u32 *size) { const struct cbmem_entry *ce; const u32 tcpa_default_log_len = 0x10000; void *lasa; ce = cbmem_entry_find(CBMEM_ID_TCPA_LOG); if (ce) { lasa = cbmem_entry_start(ce); *size = cbmem_entry_size(ce); printk(BIOS_DEBUG, "TCPA log found at %p\n", lasa); return lasa; } lasa = cbmem_add(CBMEM_ID_TCPA_LOG, tcpa_default_log_len); if (!lasa) { printk(BIOS_ERR, "TCPA log creation failed\n"); return NULL; } printk(BIOS_DEBUG, "TCPA log created at %p\n", lasa); memset (lasa, 0, tcpa_default_log_len); *size = tcpa_default_log_len; return lasa; }