[coreboot] r4012 - trunk/util/flashrom

svn at coreboot.org svn at coreboot.org
Tue Mar 17 15:39:25 CET 2009


Author: stepan
Date: 2009-03-17 15:39:25 +0100 (Tue, 17 Mar 2009)
New Revision: 4012

Modified:
   trunk/util/flashrom/cbtable.c
   trunk/util/flashrom/coreboot_tables.h
Log:
This patch adds "high coreboot table support" to coreboot version 2.

Some bootloaders seem to overwrite memory starting at 0x600, thus destroying
the coreboot table integrity, rendering the table useless.

By moving the table to the high tables area (if it's activated), this problem
is fixed.

In order to move the table, a 40 bytes mini coreboot table with a single sub
table is placed at 0x500/0x530 that points to the real coreboot table. This is
comparable to the ACPI RSDT or the MP floating table.

This patch also adds "table forward" support to flashrom and nvramtool.

Signed-off-by: Stefan Reinauer <stepan at coresystems.de>
Acked-by: Peter Stuge <peter at stuge.se>




Modified: trunk/util/flashrom/cbtable.c
===================================================================
--- trunk/util/flashrom/cbtable.c	2009-03-17 14:38:48 UTC (rev 4011)
+++ trunk/util/flashrom/cbtable.c	2009-03-17 14:39:25 UTC (rev 4012)
@@ -4,7 +4,7 @@
  * Copyright (C) 2002 Steven James <pyro at linuxlabs.com>
  * Copyright (C) 2002 Linux Networx
  * (Written by Eric Biederman <ebiederman at lnxi.com> for Linux Networx)
- * Copyright (C) 2006-2007 coresystems GmbH
+ * Copyright (C) 2006-2009 coresystems GmbH
  * (Written by Stefan Reinauer <stepan at coresystems.de> for coresystems GmbH)
  *
  * This program is free software; you can redistribute it and/or modify
@@ -124,7 +124,7 @@
 				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 @@
 	}
 }
 
+#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 @@
 #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",

Modified: trunk/util/flashrom/coreboot_tables.h
===================================================================
--- trunk/util/flashrom/coreboot_tables.h	2009-03-17 14:38:48 UTC (rev 4011)
+++ trunk/util/flashrom/coreboot_tables.h	2009-03-17 14:39:25 UTC (rev 4012)
@@ -135,6 +135,13 @@
 	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 */





More information about the coreboot mailing list