From 965dacebc54c8108bd30afb757466ac9427272fa Mon Sep 17 00:00:00 2001 From: Philip Prindeville Date: Fri, 23 Dec 2011 17:36:09 -0700 Subject: [PATCH] Fix missing VM mapping When processing FORWARD records, we weren't accounting for the pointer being in the physical address space and not the virtual space instead. Change-Id: I35ef637fbec7886d4cfeac5fd650a17eae8d555a Signed-off-by: Philip Prindeville Reviewed-on: http://review.coreboot.org/499 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- payloads/libpayload/arch/i386/coreboot.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/payloads/libpayload/arch/i386/coreboot.c b/payloads/libpayload/arch/i386/coreboot.c index 3c99c4fde..709f8ae00 100644 --- a/payloads/libpayload/arch/i386/coreboot.c +++ b/payloads/libpayload/arch/i386/coreboot.c @@ -113,6 +113,7 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) { struct cb_header *header; unsigned char *ptr = addr; + void *forward; int i; for (i = 0; i < len; i += 16, ptr += 16) { @@ -145,7 +146,8 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) /* We only care about a few tags here (maybe more later). */ switch (rec->tag) { case CB_TAG_FORWARD: - return cb_parse_header((void *)(unsigned long)((struct cb_forward *)rec)->forward, len, info); + forward = phys_to_virt((void *)(unsigned long)((struct cb_forward *)rec)->forward); + return cb_parse_header(forward, len, info); continue; case CB_TAG_MEMORY: cb_parse_memory(ptr, info); -- 2.25.1