summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Huber <nico.h@gmx.de>2020-07-18 16:15:42 +0200
committerPatrick Georgi <pgeorgi@google.com>2020-08-24 09:13:23 +0000
commit12faea3095cbdb4f134442db1451487355368cf8 (patch)
tree4c9551bcc3882837da037597ffcdfb7ab5556509
parent5e0db58533c1d796129a0a29e03f1ca8e0e81063 (diff)
libpayload: Cache physical location of cb_table entries
In the presence of self-relocating payloads, it's safer to keep physical addresses in `libsysinfo`. This updates all the references to coreboot-table entries that are not consumed inside libpayload code. Change-Id: I95cb0af151e0707a1656deacddb8a5253ea38fc3 Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/43579 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Julius Werner <jwerner@chromium.org>
-rw-r--r--payloads/libpayload/include/sysinfo.h4
-rw-r--r--payloads/libpayload/libc/coreboot.c4
2 files changed, 4 insertions, 4 deletions
diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h
index 303e08e311..33610c3c79 100644
--- a/payloads/libpayload/include/sysinfo.h
+++ b/payloads/libpayload/include/sysinfo.h
@@ -91,8 +91,8 @@ struct sysinfo_t {
unsigned long *mbtable; /** Pointer to the multiboot table */
- struct cb_header *header;
- struct cb_mainboard *mainboard;
+ uintptr_t cb_header;
+ uintptr_t cb_mainboard;
void *vboot_workbuf;
diff --git a/payloads/libpayload/libc/coreboot.c b/payloads/libpayload/libc/coreboot.c
index 43d9df4147..be2eebb56d 100644
--- a/payloads/libpayload/libc/coreboot.c
+++ b/payloads/libpayload/libc/coreboot.c
@@ -287,7 +287,7 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
header->table_bytes) != header->table_checksum)
return -1;
- info->header = header;
+ info->cb_header = virt_to_phys(header);
/* Initialize IDs as undefined in case they don't show up in table. */
info->board_id = UNDEFINED_STRAPPING_ID;
@@ -358,7 +358,7 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
break;
#endif
case CB_TAG_MAINBOARD:
- info->mainboard = (struct cb_mainboard *)ptr;
+ info->cb_mainboard = virt_to_phys(ptr);
break;
case CB_TAG_GPIO:
cb_parse_gpios(ptr, info);