summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/flashrom/cbtable.c30
-rw-r--r--util/flashrom/coreboot_tables.h7
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 */