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_find(u32 id) { const struct cbmem_entry *entry; entry = cbmem_entry_find(id); if (entry == NULL) return NULL; return cbmem_entry_start(entry); }
const struct cbmem_entry *cbmem_entry_add(u32 id, u64 size64) { struct cbmem_root *root; const struct cbmem_entry *entry; unsigned long base; u32 size; u32 aligned_size; entry = cbmem_entry_find(id); if (entry != NULL) return entry; /* Only handle sizes <= UINT_MAX internally. */ if (size64 > (u64)UINT_MAX) return NULL; size = size64; root = get_root(); if (root == NULL) return NULL; /* Nothing can be added once it is locked down. */ if (root->locked) return NULL; if (root->max_entries == root->num_entries) return NULL; aligned_size = ALIGN(size, DYN_CBMEM_ALIGN_SIZE); base = (unsigned long)cbmem_base(); base -= aligned_size; return cbmem_entry_append(root, id, base, aligned_size); }
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; }