diff options
author | Nico Huber <nico.huber@secunet.com> | 2012-11-13 17:11:01 +0100 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2012-11-15 18:51:37 +0100 |
commit | 425973cf42ad5c298dd2f501d8b9437c60ae9b6f (patch) | |
tree | a7697e2cbbea4f90e960d3a5e6900e621bb6cbf9 /payloads/libpayload/drivers | |
parent | dd5979ab4330d8677ad250ec4afcd7cb10c83cbc (diff) | |
download | coreboot-425973cf42ad5c298dd2f501d8b9437c60ae9b6f.tar.xz |
libpayload: Always use virtual pointers in struct sysinfo_t
We had mixed virtual and physical pointers in struct sysinfo_t. Some
being virtual by accident which led to problems when we tried to
reinitialize lib_sysinfo after relocating FILO (to get intentionally
virtual pointers valid again). I guess this didn't cause much trouble
before, as lib_get_sysinfo() was always called with physical addresses
being equal to their virtual counterparts.
For FILO, two possibilities seem practical: Either, have all pointers in
struct sysinfo_t physical, so relocation doesn't hurt. Or, have all
pointers virtual and call lib_get_sysinfo() again after relocation.
This patch goes the latter way, changing the following pointers for
situations where virtual pointers differ from physical:
.extra_version
.build
.compile_time
.compile_by
.compile_host
.compile_domain
.compiler
.linker
.assembler
.cb_version
.vdat_addr
.tstamp_table
.cbmem_cons
.mrc_cache
We could also just correct the accidentally virtual pointers. But, IMO,
this would lower the risk of future confusion.
Note 1: Looks like .version gets never set.
Note 2: .option_table and .framebuffer were virtual pointers but treated
like physical ones. Even in FILO, this led to no problems as
they were set before relocation.
Change-Id: I4c456f56f049d9f8fc40e62520b1d8ec3dad48f8
Signed-off-by: Nico Huber <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/1855
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'payloads/libpayload/drivers')
-rw-r--r-- | payloads/libpayload/drivers/options.c | 2 | ||||
-rw-r--r-- | payloads/libpayload/drivers/video/corebootfb.c | 6 |
2 files changed, 4 insertions, 4 deletions
diff --git a/payloads/libpayload/drivers/options.c b/payloads/libpayload/drivers/options.c index a01f977620..d15d81be57 100644 --- a/payloads/libpayload/drivers/options.c +++ b/payloads/libpayload/drivers/options.c @@ -54,7 +54,7 @@ struct nvram_accessor *use_mem = &(struct nvram_accessor) { struct cb_cmos_option_table *get_system_option_table(void) { - return phys_to_virt(lib_sysinfo.option_table); + return lib_sysinfo.option_table; } int options_checksum_valid(const struct nvram_accessor *nvram) diff --git a/payloads/libpayload/drivers/video/corebootfb.c b/payloads/libpayload/drivers/video/corebootfb.c index 0fb1740785..5672d1f375 100644 --- a/payloads/libpayload/drivers/video/corebootfb.c +++ b/payloads/libpayload/drivers/video/corebootfb.c @@ -63,11 +63,11 @@ static const u32 vga_colors[] = { }; /* Addresses for the various components */ -static unsigned long fbinfo; +static struct cb_framebuffer *fbinfo; static unsigned long fbaddr; static unsigned long chars; -#define FI ((struct cb_framebuffer *) phys_to_virt(fbinfo)) +#define FI (fbinfo) #define FB ((unsigned char *) phys_to_virt(fbaddr)) #define CHARS ((unsigned short *) phys_to_virt(chars)) @@ -233,7 +233,7 @@ static int corebootfb_init(void) if (lib_sysinfo.framebuffer == NULL) return -1; - fbinfo = (unsigned long)lib_sysinfo.framebuffer; + fbinfo = lib_sysinfo.framebuffer; fbaddr = FI->physical_address; |