summaryrefslogtreecommitdiffstats
path: root/cbtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'cbtable.c')
-rw-r--r--cbtable.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/cbtable.c b/cbtable.c
index 2a3f2a7..4aa260b 100644
--- a/cbtable.c
+++ b/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",
OpenPOWER on IntegriCloud