diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/commonlib/include/commonlib/coreboot_tables.h | 8 | ||||
-rw-r--r-- | src/lib/coreboot_table.c | 14 |
2 files changed, 16 insertions, 6 deletions
diff --git a/src/commonlib/include/commonlib/coreboot_tables.h b/src/commonlib/include/commonlib/coreboot_tables.h index 6b5eb59cf8..76dce0a41b 100644 --- a/src/commonlib/include/commonlib/coreboot_tables.h +++ b/src/commonlib/include/commonlib/coreboot_tables.h @@ -95,6 +95,9 @@ enum { LB_TAG_OPTION_CHECKSUM = 0x00cc, }; +/* All table entry base addresses and sizes must be 4-byte aligned. */ +#define LB_ENTRY_ALIGN 4 + /* Since coreboot is usually compiled 32bit, gcc will align 64bit * types to 32bit boundaries. If the coreboot table is dumped on a * 64bit system, a uint64_t would be aligned to 64bit boundaries, @@ -104,7 +107,7 @@ enum { * to ensure compatibility. */ -typedef __aligned(4) uint64_t lb_uint64_t; +typedef __aligned(LB_ENTRY_ALIGN) uint64_t lb_uint64_t; struct lb_header { uint8_t signature[4]; /* LBIO */ @@ -203,6 +206,7 @@ struct lb_console { uint32_t tag; uint32_t size; uint16_t type; + uint8_t pad[2]; }; #define LB_TAG_CONSOLE_SERIAL8250 0 @@ -288,6 +292,7 @@ struct lb_framebuffer { uint8_t reserved_mask_pos; uint8_t reserved_mask_size; uint8_t orientation; + uint8_t pad[2]; }; struct lb_gpio { @@ -553,6 +558,7 @@ struct lb_tpm_physical_presence { uint32_t ppi_address; /* Address of ACPI PPI communication buffer */ uint8_t tpm_version; /* 1: TPM1.2, 2: TPM2.0 */ uint8_t ppi_version; /* BCD encoded */ + uint8_t pad[2]; }; diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index 0f20735204..eaf487ff4e 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -76,9 +76,11 @@ struct lb_record *lb_new_record(struct lb_header *header) { struct lb_record *rec; rec = lb_last_record(header); - if (header->table_entries) + if (header->table_entries) { + assert(IS_ALIGNED(rec->size, LB_ENTRY_ALIGN)); header->table_bytes += rec->size; - rec = lb_last_record(header); + rec = lb_last_record(header); + } header->table_entries++; rec->tag = LB_TAG_UNUSED; rec->size = sizeof(*rec); @@ -301,7 +303,7 @@ static struct lb_mainboard *lb_mainboard(struct lb_header *header) mainboard->size = ALIGN_UP(sizeof(*mainboard) + strlen(mainboard_vendor) + 1 + - strlen(mainboard_part_number) + 1, 8); + strlen(mainboard_part_number) + 1, LB_ENTRY_ALIGN); mainboard->vendor_idx = 0; mainboard->part_number_idx = strlen(mainboard_vendor) + 1; @@ -380,7 +382,7 @@ static void lb_strings(struct lb_header *header) rec = (struct lb_string *)lb_new_record(header); len = strlen(strings[i].string); rec->tag = strings[i].tag; - rec->size = ALIGN_UP(sizeof(*rec) + len + 1, 8); + rec->size = ALIGN_UP(sizeof(*rec) + len + 1, LB_ENTRY_ALIGN); memcpy(rec->string, strings[i].string, len+1); } @@ -422,8 +424,10 @@ 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) + if (head->table_entries) { + assert(IS_ALIGNED(rec->size, LB_ENTRY_ALIGN)); head->table_bytes += rec->size; + } first_rec = lb_first_record(head); head->table_checksum = compute_ip_checksum(first_rec, |