Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f98872fc authored by Jonas Gorski's avatar Jonas Gorski Committed by David Woodhouse
Browse files

mtd: bcm63xxpart: check the image tag's crc32



Only use the values from the image tag if it is valid. Always create
the CFE, NVRAM and linux partitions, to allow flashing a new image even
if the old is invalid without overwriting CFE or NVRAM.

Signed-off-by: default avatarJonas Gorski <jonas.gorski@gmail.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
parent 80516678
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/crc32.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
@@ -80,8 +81,7 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
	unsigned int cfelen, nvramlen;
	int namelen = 0;
	int i;
	char *boardid;
	char *tagversion;
	u32 computed_crc;

	if (bcm63xx_detect_cfe(master))
		return -EINVAL;
@@ -103,11 +103,15 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
		return -EIO;
	}

	computed_crc = crc32_le(IMAGETAG_CRC_START, (u8 *)buf,
				offsetof(struct bcm_tag, header_crc));
	if (computed_crc == buf->header_crc) {
		char *boardid = &(buf->board_id[0]);
		char *tagversion = &(buf->tag_version[0]);

		sscanf(buf->kernel_address, "%u", &kerneladdr);
		sscanf(buf->kernel_length, "%u", &kernellen);
		sscanf(buf->total_length, "%u", &totallen);
	tagversion = &(buf->tag_version[0]);
	boardid = &(buf->board_id[0]);

		pr_info("CFE boot tag found with version %s and board type %s\n",
			tagversion, boardid);
@@ -117,6 +121,15 @@ static int bcm63xx_parse_cfe_partitions(struct mtd_info *master,
		spareaddr = roundup(totallen, master->erasesize) + cfelen;
		sparelen = master->size - spareaddr - nvramlen;
		rootfslen = spareaddr - rootfsaddr;
	} else {
		pr_warn("CFE boot tag CRC invalid (expected %08x, actual %08x)\n",
			buf->header_crc, computed_crc);
		kernellen = 0;
		rootfslen = 0;
		rootfsaddr = 0;
		spareaddr = cfelen;
		sparelen = master->size - cfelen - nvramlen;
	}

	/* Determine number of partitions */
	namelen = 8;