summaryrefslogtreecommitdiff
path: root/payloads/libpayload/drivers
diff options
context:
space:
mode:
authorNico Huber <nico.huber@secunet.com>2012-11-13 17:11:01 +0100
committerStefan Reinauer <stefan.reinauer@coreboot.org>2012-11-15 18:51:37 +0100
commit425973cf42ad5c298dd2f501d8b9437c60ae9b6f (patch)
treea7697e2cbbea4f90e960d3a5e6900e621bb6cbf9 /payloads/libpayload/drivers
parentdd5979ab4330d8677ad250ec4afcd7cb10c83cbc (diff)
downloadcoreboot-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.c2
-rw-r--r--payloads/libpayload/drivers/video/corebootfb.c6
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;