Patrick Georgi has submitted this change. ( https://review.coreboot.org/c/coreboot/+/55038 )
Change subject: src/lib/fmap.c: use le*toh() functions where needed ......................................................................
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 --- M src/lib/fmap.c 1 file changed, 8 insertions(+), 6 deletions(-)
Approvals: build bot (Jenkins): Verified Julius Werner: Looks good to me, approved
diff --git a/src/lib/fmap.c b/src/lib/fmap.c index 254d787..6ff8431 100644 --- a/src/lib/fmap.c +++ b/src/lib/fmap.c @@ -8,6 +8,7 @@ #include <stddef.h> #include <string.h> #include <symbols.h> +#include <endian.h>
#include "fmap_config.h"
@@ -49,7 +50,8 @@ print_once(BIOS_DEBUG, "FMAP: Found "%s" version %d.%d at %#x.\n", fmap->name, fmap->ver_major, fmap->ver_minor, FMAP_OFFSET); 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; }
@@ -188,10 +190,10 @@ }
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->size = area->size; + ar->offset = le32toh(area->offset); + ar->size = le32toh(area->size);
rdev_munmap(&fmrd, area);
@@ -226,8 +228,8 @@ if (area == NULL) return -1;
- if ((ar->offset != area->offset) || - (ar->size != area->size)) { + if ((ar->offset != le32toh(area->offset)) || + (ar->size != le32toh(area->size))) { rdev_munmap(&fmrd, area); offset += sizeof(struct fmap_area); continue;