struct lb_record *lb_new_record(struct lb_header *header) { struct lb_record *rec; rec = lb_last_record(header); if (header->table_entries) header->table_bytes += rec->size; rec = lb_last_record(header); header->table_entries++; rec->tag = LB_TAG_UNUSED; rec->size = sizeof(*rec); return rec; }
static void lb_reserve_table_memory(struct lb_header *head) { /* Dynamic cbmem has already reserved the memory where the coreboot tables * reside. Therefore, there is nothing to fix up. */ #if !CONFIG_DYNAMIC_CBMEM struct lb_record *last_rec; struct lb_memory *mem; uint64_t start; uint64_t end; int i, entries; last_rec = lb_last_record(head); mem = get_lb_mem(); start = (unsigned long)head; end = (unsigned long)last_rec; entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]); /* Resize the right two memory areas so this table is in * a reserved area of memory. Everything has been carefully * setup so that is all we need to do. */ for(i = 0; i < entries; i++ ) { uint64_t map_start = unpack_lb64(mem->map[i].start); uint64_t map_end = map_start + unpack_lb64(mem->map[i].size); /* Does this area need to be expanded? */ if (map_end == start) { mem->map[i].size = pack_lb64(end - map_start); } /* Does this area need to be contracted? */ else if (map_start == start) { mem->map[i].start = pack_lb64(end); mem->map[i].size = pack_lb64(map_end - end); } } #endif }
static unsigned long lb_table_fini(struct lb_header *head) { struct lb_record *rec, *first_rec; rec = lb_last_record(head); if (head->table_entries) { head->table_bytes += rec->size; } first_rec = lb_first_record(head); head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes); head->header_checksum = 0; head->header_checksum = compute_ip_checksum(head, sizeof(*head)); printk(BIOS_DEBUG, "Wrote coreboot table at: %p, 0x%x bytes, checksum %x\n", head, head->table_bytes, head->table_checksum); return (unsigned long)rec + rec->size; }
static unsigned long lb_table_fini(struct lb_header *head, int fixup) { struct lb_record *rec, *first_rec; rec = lb_last_record(head); if (head->table_entries) { head->table_bytes += rec->size; } if (fixup) lb_reserve_table_memory(head); first_rec = lb_first_record(head); head->table_checksum = compute_ip_checksum(first_rec, head->table_bytes); head->header_checksum = 0; head->header_checksum = compute_ip_checksum(head, sizeof(*head)); printk(BIOS_DEBUG, "Wrote coreboot table at: %p - %p checksum %x\n", head, rec, head->table_checksum); return (unsigned long)rec; }