diff options
-rw-r--r-- | util/flashrom/cbtable.c | 30 | ||||
-rw-r--r-- | util/flashrom/coreboot_tables.h | 7 |
2 files changed, 29 insertions, 8 deletions
diff --git a/util/flashrom/cbtable.c b/util/flashrom/cbtable.c index 2a3f2a75f0..4aa260bc03 100644 --- a/util/flashrom/cbtable.c +++ b/util/flashrom/cbtable.c @@ -4,7 +4,7 @@ * Copyright (C) 2002 Steven James <pyro@linuxlabs.com> * Copyright (C) 2002 Linux Networx * (Written by Eric Biederman <ebiederman@lnxi.com> for Linux Networx) - * Copyright (C) 2006-2007 coresystems GmbH + * Copyright (C) 2006-2009 coresystems GmbH * (Written by Stefan Reinauer <stepan@coresystems.de> for coresystems GmbH) * * This program is free software; you can redistribute it and/or modify @@ -124,7 +124,7 @@ static struct lb_header *find_lb_table(void *base, unsigned long start, head->table_checksum); continue; } - fprintf(stdout, "Found coreboot table at 0x%08lx.\n", addr); + printf_debug("Found coreboot table at 0x%08lx.\n", addr); return head; }; @@ -181,9 +181,10 @@ static void search_lb_records(struct lb_record *rec, struct lb_record *last, } } +#define BYTES_TO_MAP (1024*1024) int coreboot_init(void) { - uint8_t *low_1MB; + uint8_t *table_area; unsigned long addr, start; struct lb_header *lb_table; struct lb_record *rec, *last; @@ -196,18 +197,31 @@ int coreboot_init(void) #else start = 0x0; #endif - low_1MB = physmap("low megabyte", start, 1024*1024); + table_area = physmap("low megabyte", start, BYTES_TO_MAP); - lb_table = find_lb_table(low_1MB, 0x00000, 0x1000); + lb_table = find_lb_table(table_area, 0x00000, 0x1000); if (!lb_table) - lb_table = find_lb_table(low_1MB, 0xf0000, 1024*1024); + lb_table = find_lb_table(table_area, 0xf0000, BYTES_TO_MAP); + if (lb_table) { + struct lb_forward *forward = (struct lb_forward *) + (((char *)lb_table) + lb_table->header_bytes); + if (forward->tag == LB_TAG_FORWARD) { + start = forward->forward; + start &= ~(getpagesize()-1); + physunmap(table_area, BYTES_TO_MAP); + table_area = physmap("high tables", start, BYTES_TO_MAP); + lb_table = find_lb_table(table_area, 0x00000, 0x1000); + } + } + if (!lb_table) { printf("No coreboot table found.\n"); return -1; } - addr = ((char *)lb_table) - ((char *)low_1MB) + start; - printf_debug("coreboot table found at %p.\n", lb_table + start); + addr = ((char *)lb_table) - ((char *)table_area) + start; + fprintf(stdout, "coreboot table found at 0x%lx.\n", + (unsigned long)lb_table - (unsigned long)table_area + start); rec = (struct lb_record *)(((char *)lb_table) + lb_table->header_bytes); last = (struct lb_record *)(((char *)rec) + lb_table->table_bytes); printf_debug("coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n", diff --git a/util/flashrom/coreboot_tables.h b/util/flashrom/coreboot_tables.h index c4c2d4d17e..2eaff08765 100644 --- a/util/flashrom/coreboot_tables.h +++ b/util/flashrom/coreboot_tables.h @@ -135,6 +135,13 @@ struct lb_string { uint8_t string[0]; }; +#define LB_TAG_FORWARD 0x0011 +struct lb_forward { + uint32_t tag; + uint32_t size; + uint64_t forward; +}; + /* The following structures are for the cmos definitions table */ #define LB_TAG_CMOS_OPTION_TABLE 200 /* cmos header record */ |