aboutsummaryrefslogtreecommitdiffstats
path: root/package/system/mtd
diff options
context:
space:
mode:
authorDaniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>2018-08-31 18:14:24 -0700
committerPetr Štetiar <ynezz@true.cz>2019-07-17 22:59:29 +0200
commitfd104daa2f818d39d9b53476f7e099fc481ce783 (patch)
tree9fd93e8e13eeaee6802d3e280cf08149286affa8 /package/system/mtd
parent261df949faad6dda43454868628f79265e9cc5e7 (diff)
downloadupstream-fd104daa2f818d39d9b53476f7e099fc481ce783.tar.gz
upstream-fd104daa2f818d39d9b53476f7e099fc481ce783.tar.bz2
upstream-fd104daa2f818d39d9b53476f7e099fc481ce783.zip
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>
Diffstat (limited to 'package/system/mtd')
-rw-r--r--package/system/mtd/src/fis.c6
-rw-r--r--package/system/mtd/src/fis.h2
-rw-r--r--package/system/mtd/src/mtd.c21
3 files changed, 26 insertions, 3 deletions
diff --git a/package/system/mtd/src/fis.c b/package/system/mtd/src/fis.c
index b50411cfeb..e314c10258 100644
--- a/package/system/mtd/src/fis.c
+++ b/package/system/mtd/src/fis.c
@@ -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));
memcpy(desc->hdr.name, part->name, sizeof(desc->hdr.name));
desc->crc.desc = 0;
- desc->crc.file = 0;
+ desc->crc.file = part->crc;
desc->hdr.flash_base = offset;
desc->hdr.mem_base = part->loadaddr;
desc->hdr.entry_point = part->loadaddr;
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;
size -= desc->hdr.size;
}
diff --git a/package/system/mtd/src/fis.h b/package/system/mtd/src/fis.h
index bdf1103d8a..2be2cb1f04 100644
--- a/package/system/mtd/src/fis.h
+++ b/package/system/mtd/src/fis.h
@@ -6,6 +6,8 @@ struct fis_part {
uint32_t offset;
uint32_t loadaddr;
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);
diff --git a/package/system/mtd/src/mtd.c b/package/system/mtd/src/mtd.c
index eccb4f6a1a..9baed3fd5e 100644
--- a/package/system/mtd/src/mtd.c
+++ b/package/system/mtd/src/mtd.c
@@ -44,6 +44,7 @@
#include <sys/reboot.h>
#include <linux/reboot.h>
#include <mtd/mtd-user.h>
+#include "crc32.h"
#include "fis.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 skip = 0;
uint32_t offset = 0;
+ int buflen_raw = 0;
int jffs2_replaced = 0;
int skip_bad_blocks = 0;
#ifdef FIS_SUPPORT
static struct fis_part new_parts[MAX_ARGS];
static struct fis_part old_parts[MAX_ARGS];
+ struct fis_part *cur_part = NULL;
int n_new = 0, n_old = 0;
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(&new_parts, 0, sizeof(new_parts));
+ if (!part_offset)
+ cur_part = new_parts;
do {
next = strchr(tmp, ':');
@@ -588,6 +593,9 @@ resume:
buflen += r;
}
+ if (buflen_raw == 0)
+ buflen_raw = buflen;
+
if (buflen == 0)
break;
@@ -599,6 +607,7 @@ resume:
if (skip > 0) {
skip -= buflen;
+ buflen_raw = 0;
buflen = 0;
if (skip <= 0)
indicate_writing(mtd);
@@ -622,6 +631,7 @@ resume:
w += skip;
e += skip;
skip -= buflen;
+ buflen_raw = 0;
buflen = 0;
offset = 0;
continue;
@@ -687,6 +697,17 @@ resume:
}
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;
offset = 0;
}