Fix and clean up coreboot image detection heuristic.

Additional compile fix for NetBSD.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Stefan Reinauer <stepan@coresystems.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3420 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Carl-Daniel Hailfinger 2008-07-11 00:06:38 +00:00
parent 2fbbb29e54
commit 2f45e770d7
1 changed files with 20 additions and 12 deletions

View File

@ -45,6 +45,11 @@ static char *def_name = "DEFAULT";
int show_id(uint8_t *bios, int size, int force) int show_id(uint8_t *bios, int size, int force)
{ {
unsigned int *walk; unsigned int *walk;
unsigned int mb_part_offset, mb_vendor_offset;
char *mb_part, *mb_vendor;
mainboard_vendor = def_name;
mainboard_part = def_name;
walk = (unsigned int *)(bios + size - 0x10); walk = (unsigned int *)(bios + size - 0x10);
walk--; walk--;
@ -63,25 +68,28 @@ int show_id(uint8_t *bios, int size, int force)
* are outside the image of if the start of ID strings are nonsensical * are outside the image of if the start of ID strings are nonsensical
* (nonprintable and not \0). * (nonprintable and not \0).
*/ */
if ((*walk) == 0 || ((*walk) & 0x3ff) != 0 || *walk > size || mb_part_offset = *(walk - 1);
*(walk - 1) > size || *(walk - 2) > size || mb_vendor_offset = *(walk - 2);
(!isprint((const char *)(bios + size - *(walk - 1))) && if ((*walk) == 0 || ((*walk) & 0x3ff) != 0 || (*walk) > size ||
((const char *)(bios + size - *(walk - 1)))) || mb_part_offset > size || mb_vendor_offset > size) {
(!isprint((const char *)(bios + size - *(walk - 2))) &&
((const char *)(bios + size - *(walk - 2))))) {
printf("Flash image seems to be a legacy BIOS. Disabling checks.\n"); printf("Flash image seems to be a legacy BIOS. Disabling checks.\n");
mainboard_vendor = def_name; return 0;
mainboard_part = def_name; }
mb_part = (char *)(bios + size - mb_part_offset);
mb_vendor = (char *)(bios + size - mb_vendor_offset);
if (!isprint((unsigned char)*mb_part) ||
!isprint((unsigned char)*mb_vendor)) {
printf("Flash image seems to have garbage in the ID location."
" Disabling checks.\n");
return 0; return 0;
} }
printf_debug("coreboot last image size " printf_debug("coreboot last image size "
"(not ROM size) is %d bytes.\n", *walk); "(not ROM size) is %d bytes.\n", *walk);
walk--; mainboard_part = strdup(mb_part);
mainboard_part = strdup((const char *)(bios + size - *walk)); mainboard_vendor = strdup(mb_vendor);
walk--;
mainboard_vendor = strdup((const char *)(bios + size - *walk));
printf_debug("Manufacturer: %s\n", mainboard_vendor); printf_debug("Manufacturer: %s\n", mainboard_vendor);
printf_debug("Mainboard ID: %s\n", mainboard_part); printf_debug("Mainboard ID: %s\n", mainboard_part);