Fix missing VM mapping
authorPhilip Prindeville <philipp@redfish-solutions.com>
Sat, 24 Dec 2011 00:36:09 +0000 (17:36 -0700)
committerPatrick Georgi <patrick@georgi-clan.de>
Sat, 24 Dec 2011 10:55:15 +0000 (11:55 +0100)
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 <philipp@redfish-solutions.com>
Reviewed-on: http://review.coreboot.org/499
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
payloads/libpayload/arch/i386/coreboot.c

index 3c99c4fde089ee8f60527616db8707683ba81c91..709f8ae00fc6ac2d274d41835ecf4fbd660fc90e 100644 (file)
@@ -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);