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@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4210 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Patrick Georgi 2009-04-25 14:39:12 +00:00
parent 72631a01fa
commit dcce5210c7
1 changed files with 13 additions and 4 deletions

View File

@ -96,14 +96,23 @@ struct cbfs_file *cbfs_find(const char *name)
return NULL; return NULL;
offset = 0 - ntohl(header->romsize) + ntohl(header->offset); offset = 0 - ntohl(header->romsize) + ntohl(header->offset);
int align= ntohl(header->align);
while(1) { while(1) {
struct cbfs_file *file = (struct cbfs_file *) offset; 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)) return NULL;
if (cbfs_check_magic(file) && printk_info("Check %s\n", CBFS_NAME(file));
!strcmp(CBFS_NAME(file), name)) if (!strcmp(CBFS_NAME(file), name))
return file; 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)) if (offset < 0xFFFFFFFF - ntohl(header->romsize))
return NULL; return NULL;