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:
parent
bea01e32b2
commit
4a7325228f
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue