You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/04/18 20:04:20 UTC
[02/14] incubator-mynewt-core git commit: bootutil;
make boot_status persist write all data in single operation.
bootutil; make boot_status persist write all data in single operation.
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/9441a8e9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/9441a8e9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/9441a8e9
Branch: refs/heads/develop
Commit: 9441a8e91b4dc34aefa3cd83b9ec2c8c3af93ff8
Parents: a006be6
Author: Marko Kiiskila <ma...@runtime.io>
Authored: Tue Apr 12 16:02:05 2016 -0700
Committer: Marko Kiiskila <ma...@runtime.io>
Committed: Mon Apr 18 10:44:56 2016 -0700
----------------------------------------------------------------------
libs/bootutil/src/bootutil_misc.c | 44 ++++++------------
libs/bootutil/src/bootutil_priv.h | 19 +++++---
libs/bootutil/src/loader.c | 85 ++++++++++++++--------------------
3 files changed, 62 insertions(+), 86 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9441a8e9/libs/bootutil/src/bootutil_misc.c
----------------------------------------------------------------------
diff --git a/libs/bootutil/src/bootutil_misc.c b/libs/bootutil/src/bootutil_misc.c
index b82f5d3..7a8e114 100644
--- a/libs/bootutil/src/bootutil_misc.c
+++ b/libs/bootutil/src/bootutil_misc.c
@@ -167,9 +167,7 @@ boot_read_image_headers(struct image_header *out_headers,
* @return 0 on success; nonzero on failure.
*/
int
-boot_read_status(struct boot_status *out_status,
- struct boot_status_entry *out_entries,
- int num_areas)
+boot_read_status(struct boot_state *out_state, int num_areas)
{
struct fs_file *file;
uint32_t bytes_read;
@@ -182,35 +180,28 @@ boot_read_status(struct boot_status *out_status,
goto done;
}
- rc = fs_read(file, sizeof *out_status, out_status, &bytes_read);
- if (rc != 0 || bytes_read != sizeof *out_status) {
+ rc = fs_read(file, sizeof *out_state, out_state, &bytes_read);
+ if (rc != 0 || bytes_read != sizeof *out_state) {
rc = BOOT_EBADSTATUS;
goto done;
}
- rc = fs_read(file, num_areas * sizeof *out_entries, out_entries,
- &bytes_read);
- if (rc != 0 || bytes_read != num_areas * sizeof *out_entries) {
- rc = BOOT_EBADSTATUS;
- goto done;
+ if (out_state->status.bs_img1_length == 0xffffffff) {
+ out_state->status.bs_img1_length = 0;
}
-
- if (out_status->bs_img1_length == 0xffffffff) {
- out_status->bs_img1_length = 0;
- }
- if (out_status->bs_img2_length == 0xffffffff) {
- out_status->bs_img2_length = 0;
+ if (out_state->status.bs_img2_length == 0xffffffff) {
+ out_state->status.bs_img2_length = 0;
}
for (i = 0; i < num_areas; i++) {
- if (out_entries[i].bse_image_num == 0 &&
- out_status->bs_img1_length == 0) {
+ if (out_state->entries[i].bse_image_num == 0 &&
+ out_state->status.bs_img1_length == 0) {
rc = BOOT_EBADSTATUS;
goto done;
}
- if (out_entries[i].bse_image_num == 1 &&
- out_status->bs_img2_length == 0) {
+ if (out_state->entries[i].bse_image_num == 1 &&
+ out_state->status.bs_img2_length == 0) {
rc = BOOT_EBADSTATUS;
goto done;
@@ -237,9 +228,7 @@ done:
* @return 0 on success; nonzero on failure.
*/
int
-boot_write_status(const struct boot_status *status,
- const struct boot_status_entry *entries,
- int num_areas)
+boot_write_status(const struct boot_state *state, int num_areas)
{
struct fs_file *file;
int rc;
@@ -250,18 +239,11 @@ boot_write_status(const struct boot_status *status,
goto done;
}
- rc = fs_write(file, status, sizeof *status);
- if (rc != 0) {
- rc = BOOT_EFILE;
- goto done;
- }
-
- rc = fs_write(file, entries, num_areas * sizeof *entries);
+ rc = fs_write(file, state, sizeof *state);
if (rc != 0) {
rc = BOOT_EFILE;
goto done;
}
-
rc = 0;
done:
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9441a8e9/libs/bootutil/src/bootutil_priv.h
----------------------------------------------------------------------
diff --git a/libs/bootutil/src/bootutil_priv.h b/libs/bootutil/src/bootutil_priv.h
index 13e259e..2b4dc3e 100644
--- a/libs/bootutil/src/bootutil_priv.h
+++ b/libs/bootutil/src/bootutil_priv.h
@@ -51,6 +51,17 @@ struct boot_status_entry {
uint8_t bse_part_num;
};
+/**
+ * The boot status header read from the file system, or generated if not
+ * present on disk. The boot status indicates the state of the image slots in
+ * case the system was restarted while images were being moved in flash.
+ */
+struct boot_state {
+ struct boot_status status;
+ /** The entries associated with the boot status header. */
+ struct boot_status_entry entries[0];
+};
+
struct boot_image_location {
uint8_t bil_flash_id;
uint32_t bil_address;
@@ -63,12 +74,8 @@ int boot_vect_delete_main(void);
void boot_read_image_headers(struct image_header *out_headers,
const struct boot_image_location *addresses,
int num_addresses);
-int boot_read_status(struct boot_status *out_status,
- struct boot_status_entry *out_entries,
- int num_areas);
-int boot_write_status(const struct boot_status *status,
- const struct boot_status_entry *entries,
- int num_areas);
+int boot_read_status(struct boot_state *out_state, int num_areas);
+int boot_write_status(const struct boot_state *state, int num_areas);
void boot_clear_status(void);
int bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, int slen,
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/9441a8e9/libs/bootutil/src/loader.c
----------------------------------------------------------------------
diff --git a/libs/bootutil/src/loader.c b/libs/bootutil/src/loader.c
index 130264c..ae0c91a 100644
--- a/libs/bootutil/src/loader.c
+++ b/libs/bootutil/src/loader.c
@@ -38,15 +38,7 @@ static const struct boot_req *boot_req;
/** Image headers read from flash. */
struct image_header boot_img_hdrs[2];
-/**
- * The boot status header read from the file system, or generated if not
- * present on disk. The boot status indicates the state of the image slots in
- * case the system was restarted while images were being moved in flash.
- */
-struct boot_status boot_status;
-
-/** The entries associated with the boot status header. */
-struct boot_status_entry *boot_status_entries;
+static struct boot_state *boot;
/**
* Calculates the flash offset of the specified image slot.
@@ -146,8 +138,8 @@ boot_find_image_part(int image_num, int part_num)
int i;
for (i = 0; i < boot_req->br_num_image_areas; i++) {
- if (boot_status_entries[i].bse_image_num == image_num &&
- boot_status_entries[i].bse_part_num == part_num) {
+ if (boot->entries[i].bse_image_num == image_num &&
+ boot->entries[i].bse_part_num == part_num) {
return boot_req->br_image_areas[i];
}
@@ -310,12 +302,11 @@ boot_move_area(int from_area_idx, int to_area_idx,
return rc;
}
- boot_status_entries[src_image_idx].bse_image_num = BOOT_IMAGE_NUM_NONE;
- boot_status_entries[src_image_idx].bse_part_num = BOOT_IMAGE_NUM_NONE;
- boot_status_entries[dst_image_idx].bse_image_num = img_num;
- boot_status_entries[dst_image_idx].bse_part_num = part_num;
- rc = boot_write_status(&boot_status, boot_status_entries,
- boot_req->br_num_image_areas);
+ boot->entries[src_image_idx].bse_image_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[src_image_idx].bse_part_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[dst_image_idx].bse_image_num = img_num;
+ boot->entries[dst_image_idx].bse_part_num = part_num;
+ rc = boot_write_status(boot, boot_req->br_num_image_areas);
if (rc != 0) {
return rc;
}
@@ -376,12 +367,11 @@ boot_swap_areas(int area_idx_1, int img_num_1, uint8_t part_num_1,
return rc;
}
- boot_status_entries[scratch_image_idx] = boot_status_entries[image_idx_2];
- boot_status_entries[image_idx_2].bse_image_num = BOOT_IMAGE_NUM_NONE;
- boot_status_entries[image_idx_2].bse_part_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[scratch_image_idx] = boot->entries[image_idx_2];
+ boot->entries[image_idx_2].bse_image_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[image_idx_2].bse_part_num = BOOT_IMAGE_NUM_NONE;
- rc = boot_write_status(&boot_status, boot_status_entries,
- boot_req->br_num_image_areas);
+ rc = boot_write_status(boot, boot_req->br_num_image_areas);
if (rc != 0) {
return rc;
}
@@ -396,11 +386,10 @@ boot_swap_areas(int area_idx_1, int img_num_1, uint8_t part_num_1,
return rc;
}
- boot_status_entries[image_idx_2] = boot_status_entries[image_idx_1];
- boot_status_entries[image_idx_1].bse_image_num = BOOT_IMAGE_NUM_NONE;
- boot_status_entries[image_idx_1].bse_part_num = BOOT_IMAGE_NUM_NONE;
- rc = boot_write_status(&boot_status, boot_status_entries,
- boot_req->br_num_image_areas);
+ boot->entries[image_idx_2] = boot->entries[image_idx_1];
+ boot->entries[image_idx_1].bse_image_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[image_idx_1].bse_part_num = BOOT_IMAGE_NUM_NONE;
+ rc = boot_write_status(boot, boot_req->br_num_image_areas);
if (rc != 0) {
return rc;
}
@@ -415,11 +404,10 @@ boot_swap_areas(int area_idx_1, int img_num_1, uint8_t part_num_1,
return rc;
}
- boot_status_entries[image_idx_1] = boot_status_entries[scratch_image_idx];
- boot_status_entries[scratch_image_idx].bse_image_num = BOOT_IMAGE_NUM_NONE;
- boot_status_entries[scratch_image_idx].bse_part_num = BOOT_IMAGE_NUM_NONE;
- rc = boot_write_status(&boot_status, boot_status_entries,
- boot_req->br_num_image_areas);
+ boot->entries[image_idx_1] = boot->entries[scratch_image_idx];
+ boot->entries[scratch_image_idx].bse_image_num = BOOT_IMAGE_NUM_NONE;
+ boot->entries[scratch_image_idx].bse_part_num = BOOT_IMAGE_NUM_NONE;
+ rc = boot_write_status(boot, boot_req->br_num_image_areas);
if (rc != 0) {
return rc;
}
@@ -458,7 +446,7 @@ boot_fill_slot(int img_num, uint32_t img_length, int start_area_idx)
/* Determine what is currently in the destination area. */
dst_image_area_idx = boot_find_image_area_idx(dst_area_idx);
- if (boot_status_entries[dst_image_area_idx].bse_image_num ==
+ if (boot->entries[dst_image_area_idx].bse_image_num ==
BOOT_IMAGE_NUM_NONE) {
/* The destination doesn't contain anything useful; we don't
@@ -539,9 +527,9 @@ boot_build_status_one(int image_num, uint8_t flash_id, uint32_t addr,
offset = 0;
part_num = 0;
while (offset < length) {
- assert(boot_status_entries[i].bse_image_num == 0xff);
- boot_status_entries[i].bse_image_num = image_num;
- boot_status_entries[i].bse_part_num = part_num;
+ assert(boot->entries[i].bse_image_num == 0xff);
+ boot->entries[i].bse_image_num = image_num;
+ boot->entries[i].bse_part_num = part_num;
offset += boot_req->br_area_descs[area_idx].nad_length;
part_num++;
@@ -565,8 +553,8 @@ boot_build_status(void)
uint32_t address;
uint32_t len;
- memset(boot_status_entries, 0xff,
- boot_req->br_num_image_areas * sizeof *boot_status_entries);
+ memset(boot->entries, 0xff,
+ boot_req->br_num_image_areas * sizeof boot->entries[0]);
if (boot_img_hdrs[0].ih_magic == IMAGE_MAGIC) {
len = boot_img_hdrs[0].ih_img_size + boot_img_hdrs[0].ih_tlv_size;
@@ -574,7 +562,7 @@ boot_build_status(void)
boot_slot_addr(0, &flash_id, &address);
boot_build_status_one(0, flash_id, address, len);
} else {
- boot_status.bs_img1_length = 0;
+ boot->status.bs_img1_length = 0;
}
if (boot_img_hdrs[1].ih_magic == IMAGE_MAGIC) {
@@ -583,7 +571,7 @@ boot_build_status(void)
boot_slot_addr(1, &flash_id, &address);
boot_build_status_one(1, flash_id, address, len);
} else {
- boot_status.bs_img2_length = 0;
+ boot->status.bs_img2_length = 0;
}
}
@@ -615,18 +603,17 @@ boot_go(const struct boot_req *req, struct boot_rsp *rsp)
* interrupted (i.e., the system was reset before the boot loader could
* finish its task last time).
*/
- boot_status_entries =
- malloc(req->br_num_image_areas * sizeof *boot_status_entries);
- if (boot_status_entries == NULL) {
+ boot = malloc(sizeof(struct boot_state) +
+ req->br_num_image_areas * sizeof boot->entries[0]);
+ if (boot == NULL) {
return BOOT_ENOMEM;
}
- rc = boot_read_status(&boot_status, boot_status_entries,
- boot_req->br_num_image_areas);
+ rc = boot_read_status(boot, boot_req->br_num_image_areas);
if (rc == 0) {
/* We are resuming an interrupted image copy. */
/* XXX if copy has not actually started yet, validate image */
- rc = boot_copy_image(boot_status.bs_img1_length,
- boot_status.bs_img2_length);
+ rc = boot_copy_image(boot->status.bs_img1_length,
+ boot->status.bs_img2_length);
if (rc != 0) {
/* We failed to put the images back together; there is really no
* solution here.
@@ -684,8 +671,8 @@ boot_go(const struct boot_req *req, struct boot_rsp *rsp)
/* The user wants to run the image in the secondary slot. The contents
* of this slot need to moved to the primary slot.
*/
- rc = boot_copy_image(boot_status.bs_img1_length,
- boot_status.bs_img2_length);
+ rc = boot_copy_image(boot->status.bs_img1_length,
+ boot->status.bs_img2_length);
if (rc != 0) {
/* We failed to put the images back together; there is really no