From 0811a6492d2b8fc9cd03392b54eb8978f0450340 Mon Sep 17 00:00:00 2001 From: Yidi Lin Date: Thu, 15 Sep 2022 15:47:59 +0800 Subject: [PATCH] cbmem: use aligned_memcpy for reading lb_cbmem_entry information The lbtable contains the memory entries that have fields unnaturally aligned in memory. Therefore, we need to perform an aligned_memcpy() to fix the issues with platforms that don't allow unaligned accesses. BUG=b:246887035 TEST=cbmem -l; cbmem -r ${CBMEM ID} Change-Id: Id94e3d65118083a081fc060a6938836f6176ab54 Signed-off-by: Yidi Lin Reviewed-on: https://review.coreboot.org/c/coreboot/+/67672 Tested-by: build bot (Jenkins) Reviewed-by: Julius Werner Reviewed-by: Yu-Ping Wu --- util/cbmem/cbmem.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c index 15431f1d6e..c537a7ae66 100644 --- a/util/cbmem/cbmem.c +++ b/util/cbmem/cbmem.c @@ -235,7 +235,7 @@ static int find_cbmem_entry(uint32_t id, uint64_t *addr, size_t *size) while (offset < mapping_size(&lbtable_mapping)) { const struct lb_record *lbr; - const struct lb_cbmem_entry *lbe; + struct lb_cbmem_entry lbe; lbr = (const void *)(table + offset); offset += lbr->size; @@ -243,12 +243,12 @@ static int find_cbmem_entry(uint32_t id, uint64_t *addr, size_t *size) if (lbr->tag != LB_TAG_CBMEM_ENTRY) continue; - lbe = (const void *)lbr; - if (lbe->id != id) + aligned_memcpy(&lbe, lbr, sizeof(lbe)); + if (lbe.id != id) continue; - *addr = lbe->address; - *size = lbe->entry_size; + *addr = lbe.address; + *size = lbe.entry_size; ret = 0; break; } @@ -1128,7 +1128,7 @@ static void dump_cbmem_raw(unsigned int id) while (offset < mapping_size(&lbtable_mapping)) { const struct lb_record *lbr; - const struct lb_cbmem_entry *lbe; + struct lb_cbmem_entry lbe; lbr = (const void *)(table + offset); offset += lbr->size; @@ -1136,11 +1136,11 @@ static void dump_cbmem_raw(unsigned int id) if (lbr->tag != LB_TAG_CBMEM_ENTRY) continue; - lbe = (const void *)lbr; - if (lbe->id == id) { - debug("found id for raw dump %0x", lbe->id); - base = lbe->address; - size = lbe->entry_size; + aligned_memcpy(&lbe, lbr, sizeof(lbe)); + if (lbe.id == id) { + debug("found id for raw dump %0x", lbe.id); + base = lbe.address; + size = lbe.entry_size; break; } } @@ -1211,7 +1211,7 @@ static void dump_cbmem_toc(void) while (offset < mapping_size(&lbtable_mapping)) { const struct lb_record *lbr; - const struct lb_cbmem_entry *lbe; + struct lb_cbmem_entry lbe; lbr = (const void *)(table + offset); offset += lbr->size; @@ -1219,8 +1219,8 @@ static void dump_cbmem_toc(void) if (lbr->tag != LB_TAG_CBMEM_ENTRY) continue; - lbe = (const void *)lbr; - cbmem_print_entry(i, lbe->id, lbe->address, lbe->entry_size); + aligned_memcpy(&lbe, lbr, sizeof(lbe)); + cbmem_print_entry(i, lbe.id, lbe.address, lbe.entry_size); i++; } }