mtd: add CRC signature to RedBoot partition map

The code for calculating the CRC32 signatures for RedBoot FIS partitions
was already included, but for unknown reasons, it was never invoked. Some
bootloaders enforce checking these for loaded kernels, so they should be
written. This patch does so.

Tested-by: Brian Gonyer <bgonyer@gmail.com>
Signed-off-by: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
master
Daniel Gimpelevich 2018-08-31 18:14:24 -07:00 committed by Petr Štetiar
parent 261df949fa
commit fd104daa2f
3 changed files with 26 additions and 3 deletions

View File

@ -243,14 +243,14 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new)
memset(desc, 0, sizeof(struct fis_image_desc)); memset(desc, 0, sizeof(struct fis_image_desc));
memcpy(desc->hdr.name, part->name, sizeof(desc->hdr.name)); memcpy(desc->hdr.name, part->name, sizeof(desc->hdr.name));
desc->crc.desc = 0; desc->crc.desc = 0;
desc->crc.file = 0; desc->crc.file = part->crc;
desc->hdr.flash_base = offset; desc->hdr.flash_base = offset;
desc->hdr.mem_base = part->loadaddr; desc->hdr.mem_base = part->loadaddr;
desc->hdr.entry_point = part->loadaddr; desc->hdr.entry_point = part->loadaddr;
desc->hdr.size = (part->size > 0) ? part->size : size; desc->hdr.size = (part->size > 0) ? part->size : size;
desc->hdr.data_length = desc->hdr.size; desc->hdr.data_length = (part->length > 0) ? part->length :
desc->hdr.size;
offset += desc->hdr.size; offset += desc->hdr.size;
size -= desc->hdr.size; size -= desc->hdr.size;
} }

View File

@ -6,6 +6,8 @@ struct fis_part {
uint32_t offset; uint32_t offset;
uint32_t loadaddr; uint32_t loadaddr;
uint32_t size; uint32_t size;
uint32_t length;
uint32_t crc;
}; };
int fis_validate(struct fis_part *old, int n_old, struct fis_part *new, int n_new); int fis_validate(struct fis_part *old, int n_old, struct fis_part *new, int n_new);

View File

@ -44,6 +44,7 @@
#include <sys/reboot.h> #include <sys/reboot.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <mtd/mtd-user.h> #include <mtd/mtd-user.h>
#include "crc32.h"
#include "fis.h" #include "fis.h"
#include "mtd.h" #include "mtd.h"
@ -473,12 +474,14 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout, size_t part_offset)
ssize_t r, w, e; ssize_t r, w, e;
ssize_t skip = 0; ssize_t skip = 0;
uint32_t offset = 0; uint32_t offset = 0;
int buflen_raw = 0;
int jffs2_replaced = 0; int jffs2_replaced = 0;
int skip_bad_blocks = 0; int skip_bad_blocks = 0;
#ifdef FIS_SUPPORT #ifdef FIS_SUPPORT
static struct fis_part new_parts[MAX_ARGS]; static struct fis_part new_parts[MAX_ARGS];
static struct fis_part old_parts[MAX_ARGS]; static struct fis_part old_parts[MAX_ARGS];
struct fis_part *cur_part = NULL;
int n_new = 0, n_old = 0; int n_new = 0, n_old = 0;
if (fis_layout) { if (fis_layout) {
@ -488,6 +491,8 @@ mtd_write(int imagefd, const char *mtd, char *fis_layout, size_t part_offset)
memset(&old_parts, 0, sizeof(old_parts)); memset(&old_parts, 0, sizeof(old_parts));
memset(&new_parts, 0, sizeof(new_parts)); memset(&new_parts, 0, sizeof(new_parts));
if (!part_offset)
cur_part = new_parts;
do { do {
next = strchr(tmp, ':'); next = strchr(tmp, ':');
@ -588,6 +593,9 @@ resume:
buflen += r; buflen += r;
} }
if (buflen_raw == 0)
buflen_raw = buflen;
if (buflen == 0) if (buflen == 0)
break; break;
@ -599,6 +607,7 @@ resume:
if (skip > 0) { if (skip > 0) {
skip -= buflen; skip -= buflen;
buflen_raw = 0;
buflen = 0; buflen = 0;
if (skip <= 0) if (skip <= 0)
indicate_writing(mtd); indicate_writing(mtd);
@ -622,6 +631,7 @@ resume:
w += skip; w += skip;
e += skip; e += skip;
skip -= buflen; skip -= buflen;
buflen_raw = 0;
buflen = 0; buflen = 0;
offset = 0; offset = 0;
continue; continue;
@ -687,6 +697,17 @@ resume:
} }
w += buflen; w += buflen;
#ifdef FIS_SUPPORT
if (cur_part && cur_part->size
&& cur_part < &new_parts[MAX_ARGS - 1]
&& cur_part->length + buflen_raw > cur_part->size)
cur_part++;
if (cur_part) {
cur_part->length += buflen_raw;
cur_part->crc = crc32(cur_part->crc, buf, buflen_raw);
}
#endif
buflen_raw = 0;
buflen = 0; buflen = 0;
offset = 0; offset = 0;
} }