src/lib/fmap.c: use le*toh() functions where needed

FMAP was developed with assumption about endianness of the target machine.
This broke the parsing of the structure on big endian architectures. This
patch converts the endianness of the fields where applicable.

Signed-off-by: Krystian Hebel <krystian.hebel@3mdeb.com>
Change-Id: I8784ac29101531db757249496315f43e4008de4f
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55038
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Krystian Hebel 2020-09-30 18:23:14 +02:00 committed by Patrick Georgi
parent 2f105ed9ab
commit 93f6b8a8cc
1 changed files with 8 additions and 6 deletions

View File

@ -8,6 +8,7 @@
#include <stddef.h> #include <stddef.h>
#include <string.h> #include <string.h>
#include <symbols.h> #include <symbols.h>
#include <endian.h>
#include "fmap_config.h" #include "fmap_config.h"
@ -49,7 +50,8 @@ static void report(const struct fmap *fmap)
print_once(BIOS_DEBUG, "FMAP: Found \"%s\" version %d.%d at %#x.\n", print_once(BIOS_DEBUG, "FMAP: Found \"%s\" version %d.%d at %#x.\n",
fmap->name, fmap->ver_major, fmap->ver_minor, FMAP_OFFSET); fmap->name, fmap->ver_major, fmap->ver_minor, FMAP_OFFSET);
print_once(BIOS_DEBUG, "FMAP: base = %#llx size = %#x #areas = %d\n", print_once(BIOS_DEBUG, "FMAP: base = %#llx size = %#x #areas = %d\n",
(long long)fmap->base, fmap->size, fmap->nareas); (long long)le64toh(fmap->base), le32toh(fmap->size),
le16toh(fmap->nareas));
fmap_print_once = 1; fmap_print_once = 1;
} }
@ -188,10 +190,10 @@ int fmap_locate_area(const char *name, struct region *ar)
} }
printk(BIOS_DEBUG, "FMAP: area %s found @ %x (%d bytes)\n", printk(BIOS_DEBUG, "FMAP: area %s found @ %x (%d bytes)\n",
name, area->offset, area->size); name, le32toh(area->offset), le32toh(area->size));
ar->offset = area->offset; ar->offset = le32toh(area->offset);
ar->size = area->size; ar->size = le32toh(area->size);
rdev_munmap(&fmrd, area); rdev_munmap(&fmrd, area);
@ -226,8 +228,8 @@ int fmap_find_region_name(const struct region * const ar,
if (area == NULL) if (area == NULL)
return -1; return -1;
if ((ar->offset != area->offset) || if ((ar->offset != le32toh(area->offset)) ||
(ar->size != area->size)) { (ar->size != le32toh(area->size))) {
rdev_munmap(&fmrd, area); rdev_munmap(&fmrd, area);
offset += sizeof(struct fmap_area); offset += sizeof(struct fmap_area);
continue; continue;