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; } }
const struct imd_entry *imd_cursor_next(struct imd_cursor *cursor) { struct imd_root *r; const struct imd_entry *e; if (cursor->current_imdr >= ARRAY_SIZE(cursor->imdr)) return NULL; r = imdr_root(cursor->imdr[cursor->current_imdr]); if (r == NULL) return NULL; if (cursor->current_entry >= r->num_entries) { /* Try next imdr. */ cursor->current_imdr++; cursor->current_entry = 0; return imd_cursor_next(cursor); } e = &r->entries[cursor->current_entry]; cursor->current_entry++; return e; }