libpayload: Cache physical location of strings

In the presence of self-relocating payloads, it's safer to keep
physical addresses in `libsysinfo`. This updates the remaining
pointers that are not consumed by libpayload code, all of them
strings.

Also update the comment that `libsysinfo` only containts physical
addresses.

Change-Id: I9d095c826b00d621201c34b329fb9b5beb1ec794
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43581
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Nico Huber 2020-07-18 16:29:18 +02:00 committed by Patrick Georgi
parent bea01e32b2
commit 4a7325228f
2 changed files with 21 additions and 17 deletions

View File

@ -42,10 +42,11 @@
#include <coreboot_tables.h> #include <coreboot_tables.h>
/* /*
* All pointers in here shall be virtual. * This is a collection of information and pointers gathered
* mostly from the coreboot table.
* *
* If a relocation happens after the last call to lib_get_sysinfo(), * We do not store virtual pointers in here to avoid problems
* it is up to the user to call lib_get_sysinfo() again. * with self-relocating payloads.
*/ */
struct sysinfo_t { struct sysinfo_t {
unsigned int cpu_khz; unsigned int cpu_khz;
@ -68,18 +69,18 @@ struct sysinfo_t {
u32 vbnv_start; u32 vbnv_start;
u32 vbnv_size; u32 vbnv_size;
char *version; uintptr_t version;
char *extra_version; uintptr_t extra_version;
char *build; uintptr_t build;
char *compile_time; uintptr_t compile_time;
char *compile_by; uintptr_t compile_by;
char *compile_host; uintptr_t compile_host;
char *compile_domain; uintptr_t compile_domain;
char *compiler; uintptr_t compiler;
char *linker; uintptr_t linker;
char *assembler; uintptr_t assembler;
char *cb_version; uintptr_t cb_version;
struct cb_framebuffer framebuffer; struct cb_framebuffer framebuffer;
@ -87,7 +88,7 @@ struct sysinfo_t {
struct cb_gpio gpios[SYSINFO_MAX_GPIOS]; struct cb_gpio gpios[SYSINFO_MAX_GPIOS];
int num_macs; int num_macs;
struct mac_address macs[SYSINFO_MAX_MACS]; struct mac_address macs[SYSINFO_MAX_MACS];
char *serialno; uintptr_t serialno;
unsigned long *mbtable; /** Pointer to the multiboot table */ unsigned long *mbtable; /** Pointer to the multiboot table */

View File

@ -184,9 +184,12 @@ static void cb_parse_framebuffer(void *ptr, struct sysinfo_t *info)
} }
#endif #endif
static void cb_parse_string(unsigned char *ptr, char **info) static void cb_parse_string(const void *const ptr, uintptr_t *const info)
{ {
*info = (char *)((struct cb_string *)ptr)->string; /* ptr is already virtual (str->string just an offset to that),
but we want to keep physical addresses */
const struct cb_string *const str = ptr;
*info = virt_to_phys(str->string);
} }
static void cb_parse_wifi_calibration(void *ptr, struct sysinfo_t *info) static void cb_parse_wifi_calibration(void *ptr, struct sysinfo_t *info)