[LinuxBIOS] [PATCH] v3: add a check for a termination member

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Sat Jan 5 02:10:13 CET 2008


Check for a terminating LAR member which tells us that no further LAR
member except the bootblock will be found after this member.
The LAR member has a normal MAGIC, but all other parts of struct
lar_header are 0xff. That way, adding a new member in place of the
terminating member will not need an erase cycle.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

Index: LinuxBIOSv3-larplaceholder/lib/lar.c
===================================================================
--- LinuxBIOSv3-larplaceholder/lib/lar.c	(Revision 546)
+++ LinuxBIOSv3-larplaceholder/lib/lar.c	(Arbeitskopie)
@@ -58,7 +58,7 @@
 
 int find_file(const struct mem_file *archive, const char *filename, struct mem_file *result)
 {
-	char *walk, *fullname;
+	char *walk, *fullname, *tmp;
 	struct lar_header *header;
 
 	printk(BIOS_INFO, "LAR: Attempting to open '%s'.\n", filename);
@@ -105,10 +105,24 @@
 	for (walk = archive->start;
 	     (walk < (char *)(archive->start + archive->len - sizeof(struct lar_header))) && 
 			(walk >= (char *)archive->start); walk += 16) {
-		if (strncmp(walk, MAGIC, 8) != 0)
+		if (strncmp(walk, MAGIC, sizeof(header->magic)) != 0)
 			continue;
 
 		header = (struct lar_header *)walk;
+		/* The loop below deserves an explanation: The final iteration
+		 * of the loop will access the byte after the header. If that
+		 * iteration has been reached, all checked bytes in the header
+		 * were 0xff. This saves one state variable.
+		 */
+		for (tmp = walk + sizeof(header->magic);
+		     tmp <= walk + sizeof(*header); tmp++) {
+			if (*tmp != (char)0xff)
+				break;
+		}
+		if (tmp == walk + sizeof(*header)) {
+			printk(BIOS_SPEW, "LAR: termination pseudomember reached.\n");
+			break;
+		}
 		fullname = walk + sizeof(struct lar_header);
 
 		printk(BIOS_SPEW, "LAR: seen member %s\n", fullname);






More information about the coreboot mailing list