[coreboot] [v2] r4210 - trunk/coreboot-v2/src/lib

svn at coreboot.org svn at coreboot.org
Sat Apr 25 16:39:13 CEST 2009


Author: oxygene
Date: 2009-04-25 16:39:12 +0200 (Sat, 25 Apr 2009)
New Revision: 4210

Modified:
   trunk/coreboot-v2/src/lib/cbfs.c
Log:
Make the CBFS file lookup skip file data instead of brute-forcing
its way through it, looking for magic numbers.
For one, it should speed up file access, esp. with many entries,
but it also helps against false positives (eg. seabios, which
contains the magic number for its own CBFS support, which _might_
just be aligned properly)

Also avoid infinite loops and give up searching for new files for
invalid magic numbers.

Signed-off-by: Patrick Georgi <patrick.georgi at coresystems.de>
Acked-by: Stefan Reinauer <stepan at coresystems.de>


Modified: trunk/coreboot-v2/src/lib/cbfs.c
===================================================================
--- trunk/coreboot-v2/src/lib/cbfs.c	2009-04-25 12:39:04 UTC (rev 4209)
+++ trunk/coreboot-v2/src/lib/cbfs.c	2009-04-25 14:39:12 UTC (rev 4210)
@@ -96,15 +96,24 @@
 		return NULL;
 	offset = 0 - ntohl(header->romsize) + ntohl(header->offset);
 
+	int align= ntohl(header->align);
+
 	while(1) {
 		struct cbfs_file *file = (struct cbfs_file *) offset;
-		if (cbfs_check_magic(file)) printk_info("Check %s\n", CBFS_NAME(file));
-		if (cbfs_check_magic(file) &&
-		    !strcmp(CBFS_NAME(file), name))
+		if (!cbfs_check_magic(file)) return NULL;
+		printk_info("Check %s\n", CBFS_NAME(file));
+		if (!strcmp(CBFS_NAME(file), name))
 			return file;
 
-		offset += ntohl(header->align);
+		int flen = ntohl(file->len);
+		int foffset = ntohl(file->offset);
+		printk_spew("CBFS: follow chain: %p + %x + %x + align -> ", offset, foffset, flen);
 
+		unsigned long oldoffset = offset;
+		offset = ALIGN(offset + foffset + flen, align);
+		printk_spew("%p\n", offset);
+		if (offset <= oldoffset) return NULL;
+
 		if (offset < 0xFFFFFFFF - ntohl(header->romsize))
 			return NULL;
 	}





More information about the coreboot mailing list