You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/10/21 02:26:05 UTC
[1/2] incubator-mynewt-core git commit: Boot loader update
Repository: incubator-mynewt-core
Updated Branches:
refs/heads/develop dbb78037e -> f855c453f
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_ns_01.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_ns_01.c b/boot/bootutil/test/src/testcases/boot_test_nv_ns_01.c
index b4cb4ea..10bb38f 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_ns_01.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_ns_01.c
@@ -29,19 +29,11 @@ TEST_CASE(boot_test_nv_ns_01)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr, 1);
boot_test_util_write_hash(&hdr, 1);
boot_set_pending();
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_REVERT, NULL, &hdr);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_REVERT, NULL, &hdr);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_ns_10.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_ns_10.c b/boot/bootutil/test/src/testcases/boot_test_nv_ns_10.c
index a6bbff2..05095f0 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_ns_10.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_ns_10.c
@@ -29,17 +29,9 @@ TEST_CASE(boot_test_nv_ns_10)
.ih_ver = { 0, 2, 3, 4 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr, 0);
boot_test_util_write_hash(&hdr, 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_ns_11.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_ns_11.c b/boot/bootutil/test/src/testcases/boot_test_nv_ns_11.c
index 4a43ef2..2191aaa 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_ns_11.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_ns_11.c
@@ -38,19 +38,11 @@ TEST_CASE(boot_test_nv_ns_11)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
boot_test_util_write_image(&hdr1, 1);
boot_test_util_write_hash(&hdr1, 1);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_revert.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_revert.c b/boot/bootutil/test/src/testcases/boot_test_revert.c
index f564f7c..4339afb 100644
--- a/boot/bootutil/test/src/testcases/boot_test_revert.c
+++ b/boot/bootutil/test/src/testcases/boot_test_revert.c
@@ -37,14 +37,6 @@ TEST_CASE(boot_test_revert)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -54,5 +46,5 @@ TEST_CASE(boot_test_revert)
/* Indicate that the image in slot 0 is being tested. */
boot_test_util_mark_revert();
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_REVERT, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_REVERT, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_revert_continue.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_revert_continue.c b/boot/bootutil/test/src/testcases/boot_test_revert_continue.c
index 4abd87f..1edc898 100644
--- a/boot/bootutil/test/src/testcases/boot_test_revert_continue.c
+++ b/boot/bootutil/test/src/testcases/boot_test_revert_continue.c
@@ -41,14 +41,6 @@ TEST_CASE(boot_test_revert_continue)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -61,11 +53,10 @@ TEST_CASE(boot_test_revert_continue)
boot_test_util_swap_areas(2, 5);
status.idx = 1;
- status.elem_sz = 1;
status.state = 0;
rc = boot_write_status(&status);
TEST_ASSERT_FATAL(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_REVERT, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_REVERT, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vb_ns_11.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vb_ns_11.c b/boot/bootutil/test/src/testcases/boot_test_vb_ns_11.c
index 3596e22..7ed538c 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vb_ns_11.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vb_ns_11.c
@@ -40,14 +40,6 @@ TEST_CASE(boot_test_vb_ns_11)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -57,5 +49,5 @@ TEST_CASE(boot_test_vb_ns_11)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vm_ns_01.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vm_ns_01.c b/boot/bootutil/test/src/testcases/boot_test_vm_ns_01.c
index 807f548..b1618c3 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vm_ns_01.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vm_ns_01.c
@@ -31,14 +31,6 @@ TEST_CASE(boot_test_vm_ns_01)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr, 1);
boot_test_util_write_hash(&hdr, 1);
@@ -46,5 +38,5 @@ TEST_CASE(boot_test_vm_ns_01)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_REVERT, NULL, &hdr);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_REVERT, NULL, &hdr);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vm_ns_10.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vm_ns_10.c b/boot/bootutil/test/src/testcases/boot_test_vm_ns_10.c
index 24c7361..48a51d1 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vm_ns_10.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vm_ns_10.c
@@ -29,17 +29,9 @@ TEST_CASE(boot_test_vm_ns_10)
.ih_ver = { 0, 2, 3, 4 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr, 0);
boot_test_util_write_hash(&hdr, 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_2areas.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_2areas.c b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_2areas.c
index 19cc2b3..80a8ef3 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_2areas.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_2areas.c
@@ -40,14 +40,6 @@ TEST_CASE(boot_test_vm_ns_11_2areas)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -57,5 +49,5 @@ TEST_CASE(boot_test_vm_ns_11_2areas)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_a.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_a.c b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_a.c
index 7ef5196..cdbc87e 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_a.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_a.c
@@ -38,19 +38,11 @@ TEST_CASE(boot_test_vm_ns_11_a)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
boot_test_util_write_image(&hdr1, 1);
boot_test_util_write_hash(&hdr1, 1);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_b.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_b.c b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_b.c
index 5c79981..d42d0fb 100644
--- a/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_b.c
+++ b/boot/bootutil/test/src/testcases/boot_test_vm_ns_11_b.c
@@ -40,14 +40,6 @@ TEST_CASE(boot_test_vm_ns_11_b)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -57,5 +49,5 @@ TEST_CASE(boot_test_vm_ns_11_b)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/sys/flash_map/include/flash_map/flash_map.h
----------------------------------------------------------------------
diff --git a/sys/flash_map/include/flash_map/flash_map.h b/sys/flash_map/include/flash_map/flash_map.h
index b7f1136..ae8d528 100644
--- a/sys/flash_map/include/flash_map/flash_map.h
+++ b/sys/flash_map/include/flash_map/flash_map.h
@@ -72,7 +72,7 @@ void flash_area_close(const struct flash_area *);
*/
int flash_area_read(const struct flash_area *, uint32_t off, void *dst,
uint32_t len);
-int flash_area_write(const struct flash_area *, uint32_t off, void *src,
+int flash_area_write(const struct flash_area *, uint32_t off, const void *src,
uint32_t len);
int flash_area_erase(const struct flash_area *, uint32_t off, uint32_t len);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/sys/flash_map/src/flash_map.c
----------------------------------------------------------------------
diff --git a/sys/flash_map/src/flash_map.c b/sys/flash_map/src/flash_map.c
index 124cfeb..6cbfad6 100644
--- a/sys/flash_map/src/flash_map.c
+++ b/sys/flash_map/src/flash_map.c
@@ -105,13 +105,14 @@ flash_area_read(const struct flash_area *fa, uint32_t off, void *dst,
}
int
-flash_area_write(const struct flash_area *fa, uint32_t off, void *src,
+flash_area_write(const struct flash_area *fa, uint32_t off, const void *src,
uint32_t len)
{
if (off > fa->fa_size || off + len > fa->fa_size) {
return -1;
}
- return hal_flash_write(fa->fa_device_id, fa->fa_off + off, src, len);
+ return hal_flash_write(fa->fa_device_id, fa->fa_off + off,
+ (void *)src, len);
}
int
[2/2] incubator-mynewt-core git commit: Boot loader update
Posted by cc...@apache.org.
Boot loader update
1. Increase copy magic number from 4 bytes to 16.
2. Ensure magic, status, and swap state get written sequentially within
a sector.
3. Standardize on the flash_map API (flash_area_open(), etc.).
Previously, we were using both the flash map API and direct HAL flash
reads.
4. Remove boot request; now boot loader calculates flash information on
its own.
5. Remove boot_req and boot_state global variables.
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/f855c453
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/f855c453
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/f855c453
Branch: refs/heads/develop
Commit: f855c453f9d0e8fe8289f81e200c04bb30ce8304
Parents: dbb7803
Author: Christopher Collins <cc...@apache.org>
Authored: Wed Oct 19 17:23:37 2016 -0700
Committer: Christopher Collins <cc...@apache.org>
Committed: Thu Oct 20 19:16:19 2016 -0700
----------------------------------------------------------------------
apps/boot/src/boot.c | 13 +-
boot/boot_serial/src/boot_serial.c | 4 +-
boot/bootutil/include/bootutil/bootutil.h | 43 +-
boot/bootutil/include/bootutil/image.h | 15 +-
boot/bootutil/signed_images.md | 8 +-
boot/bootutil/src/bootutil_misc.c | 315 ++++--
boot/bootutil/src/bootutil_priv.h | 55 +-
boot/bootutil/src/image_validate.c | 34 +-
boot/bootutil/src/loader.c | 962 ++++++++++---------
boot/bootutil/syscfg.yml | 2 -
boot/bootutil/test/src/boot_test.h | 3 +-
boot/bootutil/test/src/boot_test_utils.c | 67 +-
.../test/src/testcases/boot_test_invalid_hash.c | 10 +-
.../src/testcases/boot_test_no_flag_has_hash.c | 10 +-
.../test/src/testcases/boot_test_no_hash.c | 10 +-
.../test/src/testcases/boot_test_nv_bs_10.c | 10 +-
.../test/src/testcases/boot_test_nv_bs_11.c | 13 +-
.../src/testcases/boot_test_nv_bs_11_2areas.c | 11 +-
.../test/src/testcases/boot_test_nv_ns_01.c | 10 +-
.../test/src/testcases/boot_test_nv_ns_10.c | 10 +-
.../test/src/testcases/boot_test_nv_ns_11.c | 10 +-
.../test/src/testcases/boot_test_revert.c | 10 +-
.../src/testcases/boot_test_revert_continue.c | 11 +-
.../test/src/testcases/boot_test_vb_ns_11.c | 10 +-
.../test/src/testcases/boot_test_vm_ns_01.c | 10 +-
.../test/src/testcases/boot_test_vm_ns_10.c | 10 +-
.../src/testcases/boot_test_vm_ns_11_2areas.c | 10 +-
.../test/src/testcases/boot_test_vm_ns_11_a.c | 10 +-
.../test/src/testcases/boot_test_vm_ns_11_b.c | 10 +-
sys/flash_map/include/flash_map/flash_map.h | 2 +-
sys/flash_map/src/flash_map.c | 5 +-
31 files changed, 908 insertions(+), 795 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/apps/boot/src/boot.c
----------------------------------------------------------------------
diff --git a/apps/boot/src/boot.c b/apps/boot/src/boot.c
index 6a25b57..966e453 100755
--- a/apps/boot/src/boot.c
+++ b/apps/boot/src/boot.c
@@ -50,14 +50,6 @@ static os_stack_t boot_ser_stack[BOOT_SER_STACK_SZ];
int
main(void)
{
- struct flash_area descs[AREA_DESC_MAX];
- /** Areas representing the beginning of image slots. */
- uint8_t img_starts[2];
- struct boot_req req = {
- .br_area_descs = descs,
- .br_slot_areas = img_starts,
- };
-
struct boot_rsp rsp;
int rc;
@@ -68,9 +60,6 @@ main(void)
hal_bsp_init();
#endif
- rc = boot_build_request(&req, AREA_DESC_MAX);
- assert(rc == 0);
-
#if MYNEWT_VAL(BOOT_SERIAL)
/*
* Configure a GPIO as input, and compare it against expected value.
@@ -84,7 +73,7 @@ main(void)
os_start();
}
#endif
- rc = boot_go(&req, &rsp);
+ rc = boot_go(&rsp);
assert(rc == 0);
system_start((void *)(rsp.br_image_addr + rsp.br_hdr->ih_hdr_size));
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/boot_serial/src/boot_serial.c
----------------------------------------------------------------------
diff --git a/boot/boot_serial/src/boot_serial.c b/boot/boot_serial/src/boot_serial.c
index 564fb41..fdc2d2e 100644
--- a/boot/boot_serial/src/boot_serial.c
+++ b/boot/boot_serial/src/boot_serial.c
@@ -110,8 +110,8 @@ bs_list(char *buf, int len)
flash_area_read(fap, 0, &hdr, sizeof(hdr));
if (hdr.ih_magic == IMAGE_MAGIC &&
- bootutil_img_validate(&hdr, fap->fa_device_id, fap->fa_off,
- tmpbuf, sizeof(tmpbuf), NULL, 0, NULL) == 0) {
+ bootutil_img_validate(&hdr, fap, tmpbuf, sizeof(tmpbuf),
+ NULL, 0, NULL) == 0) {
good_img = 1;
} else {
good_img = 0;
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/include/bootutil/bootutil.h
----------------------------------------------------------------------
diff --git a/boot/bootutil/include/bootutil/bootutil.h b/boot/bootutil/include/bootutil/bootutil.h
index ebc3441..f75f59c 100644
--- a/boot/bootutil/include/bootutil/bootutil.h
+++ b/boot/bootutil/include/bootutil/bootutil.h
@@ -26,45 +26,14 @@
extern "C" {
#endif
-#define BOOT_STATUS_SOURCE_NONE 0
-#define BOOT_STATUS_SOURCE_SCRATCH 1
-#define BOOT_STATUS_SOURCE_SLOT0 2
-
-#define BOOT_SWAP_TYPE_NONE 0
-#define BOOT_SWAP_TYPE_TEST 1
-#define BOOT_SWAP_TYPE_REVERT 2
+#define BOOT_SWAP_TYPE_NONE 1
+#define BOOT_SWAP_TYPE_TEST 2
+#define BOOT_SWAP_TYPE_REVERT 3
+#define BOOT_SWAP_TYPE_FAIL 4
struct image_header;
struct boot_img_trailer;
-/** A request object instructing the boot loader how to proceed. */
-struct boot_req {
- /**
- * Array of area descriptors indicating the layout of flash(es); must
- * be terminated with a 0-length element.
- */
- struct flash_area *br_area_descs;
-
- /**
- * Array of indices of elements in the br_area_descs array; indicates which
- * areas represent the beginning of an image slot. These are indices
- * to br_area_descs array.
- */
- uint8_t *br_slot_areas;
-
- /**
- * The number of image areas (i.e., the size of the br_image_areas array).
- */
- uint8_t br_num_image_areas;
-
- /** The area to use as the image scratch area, index is
- index to br_area_descs array, of the */
- uint8_t br_scratch_area_idx;
-
- /** Size of the image slot */
- uint32_t br_img_sz;
-};
-
/**
* A response object provided by the boot loader code; indicates where to jump
* to execute the main image.
@@ -82,9 +51,7 @@ struct boot_rsp {
};
/* you must have pre-allocated all the entries within this structure */
-int boot_build_request(struct boot_req *preq, int area_descriptor_max);
-
-int boot_go(const struct boot_req *req, struct boot_rsp *rsp);
+int boot_go(struct boot_rsp *rsp);
int boot_swap_type(void);
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/include/bootutil/image.h
----------------------------------------------------------------------
diff --git a/boot/bootutil/include/bootutil/image.h b/boot/bootutil/include/bootutil/image.h
index 67e56e0..6e89da6 100644
--- a/boot/bootutil/include/bootutil/image.h
+++ b/boot/bootutil/include/bootutil/image.h
@@ -26,6 +26,8 @@
extern "C" {
#endif
+struct flash_area;
+
#define IMAGE_MAGIC 0x96f3b83c
#define IMAGE_MAGIC_NONE 0xffffffff
@@ -77,18 +79,13 @@ struct image_tlv {
uint16_t it_len;
};
-struct boot_image_location {
- uint8_t bil_flash_id;
- uint32_t bil_address;
-};
-
-
_Static_assert(sizeof(struct image_header) == IMAGE_HEADER_SIZE,
"struct image_header not required size");
-int bootutil_img_validate(struct image_header *hdr, uint8_t flash_id,
- uint32_t addr, uint8_t *tmp_buf, uint32_t tmp_buf_sz,
- uint8_t *seed, int seed_len, uint8_t *out_hash);
+int bootutil_img_validate(struct image_header *hdr,
+ const struct flash_area *fap,
+ uint8_t *tmp_buf, uint32_t tmp_buf_sz,
+ uint8_t *seed, int seed_len, uint8_t *out_hash);
#ifdef __cplusplus
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/signed_images.md
----------------------------------------------------------------------
diff --git a/boot/bootutil/signed_images.md b/boot/bootutil/signed_images.md
index 39792ea..64869c1 100644
--- a/boot/bootutil/signed_images.md
+++ b/boot/bootutil/signed_images.md
@@ -66,8 +66,6 @@ This gets bootutil to turn on image signature validation.
pkg.name: libs/mykeys
pkg.deps:
- libs/bootutil
- pkg.features.bootloader:
- - IMAGE_KEYS_RSA
## Sample source file
This exports the keys.
@@ -87,5 +85,11 @@ This exports the keys.
## Building bootloader
+Enable the BOOTUTIL_SIGN_RSA syscfg setting in your app or target syscfg.yml
+file
+
+ syscfg.vals:
+ BOOTUTIL_SIGN_RSA: 1
+
After you've created the key package, you must include it in the build
for bootloader. So modify the pkg.yml for apps/boot to include it.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/src/bootutil_misc.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/src/bootutil_misc.c b/boot/bootutil/src/bootutil_misc.c
index 37bfaa2..a3c3d04 100644
--- a/boot/bootutil/src/bootutil_misc.c
+++ b/boot/bootutil/src/bootutil_misc.c
@@ -33,10 +33,17 @@
int boot_current_slot;
+const uint32_t boot_img_magic[4] = {
+ 0xf395c277,
+ 0x7fefd260,
+ 0x0f505235,
+ 0x8079b62c,
+};
+
struct boot_swap_table {
/** * For each field, a value of 0 means "any". */
- uint32_t bsw_magic_slot0;
- uint32_t bsw_magic_slot1;
+ uint8_t bsw_magic_slot0;
+ uint8_t bsw_magic_slot1;
uint8_t bsw_image_ok_slot0;
uint8_t bsw_swap_type;
@@ -50,14 +57,14 @@ static const struct boot_swap_table boot_swap_tables[] = {
{
/* | slot-0 | slot-1 |
*----------+------------+------------|
- * magic | 0xffffffff | 0xffffffff |
- * image-ok | 0x** | N/A |
+ * magic | Unset | Unset |
+ * image-ok | Any | N/A |
* ---------+------------+------------'
* swap: none |
* -----------------------------------'
*/
- .bsw_magic_slot0 = 0xffffffff,
- .bsw_magic_slot1 = 0xffffffff,
+ .bsw_magic_slot0 = BOOT_MAGIC_UNSET,
+ .bsw_magic_slot1 = BOOT_MAGIC_UNSET,
.bsw_image_ok_slot0 = 0,
.bsw_swap_type = BOOT_SWAP_TYPE_NONE,
},
@@ -65,14 +72,14 @@ static const struct boot_swap_table boot_swap_tables[] = {
{
/* | slot-0 | slot-1 |
*----------+------------+------------|
- * magic | 0x******** | 0x12344321 |
- * image-ok | 0x** | N/A |
+ * magic | Any | Good |
+ * image-ok | Any | N/A |
* ---------+------------+------------'
* swap: test |
* -----------------------------------'
*/
.bsw_magic_slot0 = 0,
- .bsw_magic_slot1 = 0x12344321,
+ .bsw_magic_slot1 = BOOT_MAGIC_GOOD,
.bsw_image_ok_slot0 = 0,
.bsw_swap_type = BOOT_SWAP_TYPE_TEST,
},
@@ -80,14 +87,14 @@ static const struct boot_swap_table boot_swap_tables[] = {
{
/* | slot-0 | slot-1 |
*----------+------------+------------|
- * magic | 0x12344321 | 0xffffffff |
+ * magic | Good | Unset |
* image-ok | 0xff | N/A |
* ---------+------------+------------'
* swap: revert (test image running) |
* -----------------------------------'
*/
- .bsw_magic_slot0 = 0x12344321,
- .bsw_magic_slot1 = 0xffffffff,
+ .bsw_magic_slot0 = BOOT_MAGIC_GOOD,
+ .bsw_magic_slot1 = BOOT_MAGIC_UNSET,
.bsw_image_ok_slot0 = 0xff,
.bsw_swap_type = BOOT_SWAP_TYPE_REVERT,
},
@@ -95,14 +102,14 @@ static const struct boot_swap_table boot_swap_tables[] = {
{
/* | slot-0 | slot-1 |
*----------+------------+------------|
- * magic | 0x12344321 | 0xffffffff |
+ * magic | Good | Unset |
* image-ok | 0x01 | N/A |
* ---------+------------+------------'
* swap: none (confirmed test image) |
* -----------------------------------'
*/
- .bsw_magic_slot0 = 0x12344321,
- .bsw_magic_slot1 = 0xffffffff,
+ .bsw_magic_slot0 = BOOT_MAGIC_GOOD,
+ .bsw_magic_slot1 = BOOT_MAGIC_UNSET,
.bsw_image_ok_slot0 = 0x01,
.bsw_swap_type = BOOT_SWAP_TYPE_NONE,
},
@@ -111,24 +118,124 @@ static const struct boot_swap_table boot_swap_tables[] = {
#define BOOT_SWAP_TABLES_COUNT \
(sizeof boot_swap_tables / sizeof boot_swap_tables[0])
+int
+boot_magic_code(const uint32_t *magic)
+{
+ int i;
+
+ if (memcmp(magic, boot_img_magic, sizeof boot_img_magic) == 0) {
+ return BOOT_MAGIC_GOOD;
+ }
+
+ for (i = 0; i < 4; i++) {
+ if (magic[i] == 0xffffffff) {
+ return BOOT_MAGIC_UNSET;
+ }
+ }
+
+ return BOOT_MAGIC_BAD;
+}
+
+uint32_t
+boot_status_sz(uint8_t min_write_sz)
+{
+ return BOOT_STATUS_MAX_ENTRIES * BOOT_STATUS_STATE_COUNT * min_write_sz;
+}
+
+uint32_t
+boot_trailer_sz(uint8_t min_write_sz)
+{
+ return sizeof boot_img_magic +
+ boot_status_sz(min_write_sz) +
+ min_write_sz * 2;
+}
+
+static uint32_t
+boot_magic_off(const struct flash_area *fap)
+{
+ uint32_t off_from_end;
+ uint8_t elem_sz;
+
+ elem_sz = flash_area_align(fap);
+
+ off_from_end = boot_trailer_sz(elem_sz);
+
+ assert(off_from_end <= fap->fa_size);
+ return fap->fa_size - off_from_end;
+}
+
+uint32_t
+boot_status_off(const struct flash_area *fap)
+{
+ return boot_magic_off(fap) + sizeof boot_img_magic;
+}
+
+static uint32_t
+boot_copy_done_off(const struct flash_area *fap)
+{
+ return fap->fa_size - flash_area_align(fap) * 2;
+}
+
+static uint32_t
+boot_image_ok_off(const struct flash_area *fap)
+{
+ return fap->fa_size - flash_area_align(fap);
+}
+
+int
+boot_read_swap_state(const struct flash_area *fap,
+ struct boot_swap_state *state)
+{
+ uint32_t magic[4];
+ uint32_t off;
+ int rc;
+
+ off = boot_magic_off(fap);
+ rc = flash_area_read(fap, off, magic, sizeof magic);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+ state->magic = boot_magic_code(magic);
+
+ off = boot_copy_done_off(fap);
+ rc = flash_area_read(fap, off, &state->copy_done, 1);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ off = boot_image_ok_off(fap);
+ rc = flash_area_read(fap, off, &state->image_ok, 1);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ return 0;
+}
+
/**
* Reads the image trailer from the scratch area.
*/
int
-boot_read_scratch_trailer(struct boot_img_trailer *bit)
+boot_read_swap_state_scratch(struct boot_swap_state *state)
{
- int rc;
const struct flash_area *fap;
- uint32_t off;
+ int rc;
rc = flash_area_open(FLASH_AREA_IMAGE_SCRATCH, &fap);
if (rc) {
- return rc;
+ rc = BOOT_EFLASH;
+ goto done;
}
- off = fap->fa_size - sizeof(struct boot_img_trailer);
- rc = flash_area_read(fap, off, bit, sizeof(*bit));
- flash_area_close(fap);
+ rc = boot_read_swap_state(fap, state);
+ if (rc != 0) {
+ goto done;
+ }
+
+ rc = 0;
+
+done:
+ flash_area_close(fap);
return rc;
}
@@ -136,49 +243,107 @@ boot_read_scratch_trailer(struct boot_img_trailer *bit)
* Reads the image trailer from a given image slot.
*/
int
-boot_read_img_trailer(int slot, struct boot_img_trailer *bit)
+boot_read_swap_state_img(int slot, struct boot_swap_state *state)
{
- int rc;
const struct flash_area *fap;
- uint32_t off;
int area_id;
+ int rc;
area_id = flash_area_id_from_image_slot(slot);
rc = flash_area_open(area_id, &fap);
- if (rc) {
- return rc;
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
}
- off = fap->fa_size - sizeof(struct boot_img_trailer);
- rc = flash_area_read(fap, off, bit, sizeof(*bit));
- flash_area_close(fap);
+ rc = boot_read_swap_state(fap, state);
+ if (rc != 0) {
+ goto done;
+ }
+
+ rc = 0;
+
+done:
+ flash_area_close(fap);
return rc;
}
int
+boot_write_magic(const struct flash_area *fap)
+{
+ uint32_t off;
+ int rc;
+
+ off = boot_magic_off(fap);
+
+ rc = flash_area_write(fap, off, boot_img_magic, sizeof boot_img_magic);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ return 0;
+}
+
+int
+boot_write_copy_done(const struct flash_area *fap)
+{
+ uint32_t off;
+ uint8_t val;
+ int rc;
+
+ off = boot_copy_done_off(fap);
+
+ val = 1;
+ rc = flash_area_write(fap, off, &val, 1);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ return 0;
+}
+
+int
+boot_write_image_ok(const struct flash_area *fap)
+{
+ uint32_t off;
+ uint8_t val;
+ int rc;
+
+ off = boot_image_ok_off(fap);
+
+ val = 1;
+ rc = flash_area_write(fap, off, &val, 1);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ return 0;
+}
+
+int
boot_swap_type(void)
{
const struct boot_swap_table *table;
- struct boot_img_trailer bit_slot0;
- struct boot_img_trailer bit_slot1;
+ struct boot_swap_state state_slot0;
+ struct boot_swap_state state_slot1;
int rc;
int i;
- rc = boot_read_img_trailer(0, &bit_slot0);
+ rc = boot_read_swap_state_img(0, &state_slot0);
assert(rc == 0);
- rc = boot_read_img_trailer(1, &bit_slot1);
+ rc = boot_read_swap_state_img(1, &state_slot1);
assert(rc == 0);
for (i = 0; i < BOOT_SWAP_TABLES_COUNT; i++) {
table = boot_swap_tables + i;
if ((table->bsw_magic_slot0 == 0 ||
- table->bsw_magic_slot0 == bit_slot0.bit_copy_start) &&
+ table->bsw_magic_slot0 == state_slot0.magic) &&
(table->bsw_magic_slot1 == 0 ||
- table->bsw_magic_slot1 == bit_slot1.bit_copy_start) &&
+ table->bsw_magic_slot1 == state_slot1.magic) &&
(table->bsw_image_ok_slot0 == 0 ||
- table->bsw_image_ok_slot0 == bit_slot0.bit_img_ok)) {
+ table->bsw_image_ok_slot0 == state_slot0.image_ok)) {
return table->bsw_swap_type;
}
@@ -189,7 +354,8 @@ boot_swap_type(void)
}
/**
- * Write the test image version number from the boot vector.
+ * Marks the image in slot 1 as pending. On the next reboot, the system will
+ * perform a one-time boot of the slot 1 image.
*
* @return 0 on success; nonzero on failure.
*/
@@ -197,31 +363,29 @@ int
boot_set_pending(void)
{
const struct flash_area *fap;
- struct boot_img_trailer bit_slot1;
- uint32_t off;
+ struct boot_swap_state state_slot1;
int area_id;
int rc;
- rc = boot_read_img_trailer(1, &bit_slot1);
- assert(rc == 0);
+ rc = boot_read_swap_state_img(1, &state_slot1);
+ if (rc != 0) {
+ return rc;
+ }
- switch (bit_slot1.bit_copy_start) {
- case BOOT_IMG_MAGIC:
+ switch (state_slot1.magic) {
+ case BOOT_MAGIC_GOOD:
/* Swap already scheduled. */
return 0;
- case 0xffffffff:
- bit_slot1.bit_copy_start = BOOT_IMG_MAGIC;
-
+ case BOOT_MAGIC_UNSET:
area_id = flash_area_id_from_image_slot(1);
rc = flash_area_open(area_id, &fap);
- if (rc) {
- return rc;
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ } else {
+ rc = boot_write_magic(fap);
}
- off = fap->fa_size - sizeof(struct boot_img_trailer);
- rc = flash_area_write(fap, off, &bit_slot1,
- sizeof bit_slot1.bit_copy_start);
flash_area_close(fap);
return rc;
@@ -233,9 +397,7 @@ boot_set_pending(void)
}
/**
- * Deletes the main image version number from the boot vector.
- * This must be called by the app to confirm that it is ok to keep booting
- * to this image.
+ * Marks the image in slot 0 as confirmed. The system will continue booting into the image in slot 0 until told to boot from a different slot.
*
* @return 0 on success; nonzero on failure.
*/
@@ -243,39 +405,52 @@ int
boot_set_confirmed(void)
{
const struct flash_area *fap;
- struct boot_img_trailer bit_slot0;
- uint32_t off;
- uint8_t img_ok;
+ struct boot_swap_state state_slot0;
int rc;
- rc = boot_read_img_trailer(0, &bit_slot0);
- assert(rc == 0);
+ rc = boot_read_swap_state_img(0, &state_slot0);
+ if (rc != 0) {
+ return rc;
+ }
- if (bit_slot0.bit_copy_start != BOOT_IMG_MAGIC) {
+ switch (state_slot0.magic) {
+ case BOOT_MAGIC_GOOD:
+ /* Confirm needed; proceed. */
+ break;
+
+ case BOOT_MAGIC_UNSET:
/* Already confirmed. */
return 0;
+
+ case BOOT_MAGIC_BAD:
+ /* Unexpected state. */
+ return BOOT_EBADVECT;
}
- if (bit_slot0.bit_copy_done == 0xff) {
+ if (state_slot0.copy_done == 0xff) {
/* Swap never completed. This is unexpected. */
- return -1;
+ return BOOT_EBADVECT;
}
- if (bit_slot0.bit_img_ok != 0xff) {
+ if (state_slot0.image_ok != 0xff) {
/* Already confirmed. */
return 0;
}
rc = flash_area_open(FLASH_AREA_IMAGE_0, &fap);
if (rc) {
- return rc;
+ rc = BOOT_EFLASH;
+ goto done;
}
- off = fap->fa_size -
- sizeof(struct boot_img_trailer) +
- offsetof(struct boot_img_trailer, bit_img_ok);
+ rc = boot_write_image_ok(fap);
+ if (rc != 0) {
+ goto done;
+ }
+
+ rc = 0;
- img_ok = 1;
- rc = flash_area_write(fap, off, &img_ok, 1);
+done:
+ flash_area_close(fap);
return rc;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/src/bootutil_priv.h
----------------------------------------------------------------------
diff --git a/boot/bootutil/src/bootutil_priv.h b/boot/bootutil/src/bootutil_priv.h
index 5ed1414..52ca226 100644
--- a/boot/bootutil/src/bootutil_priv.h
+++ b/boot/bootutil/src/bootutil_priv.h
@@ -27,6 +27,8 @@
extern "C" {
#endif
+struct flash_area;
+
#define BOOT_EFLASH 1
#define BOOT_EFILE 2
#define BOOT_EBADIMAGE 3
@@ -42,37 +44,62 @@ extern "C" {
*/
struct boot_status {
uint32_t idx; /* Which area we're operating on */
- uint8_t elem_sz; /* Size of the status element to write in bytes */
uint8_t state; /* Which part of the swapping process are we at */
};
+#define BOOT_MAGIC_GOOD 1
+#define BOOT_MAGIC_BAD 2
+#define BOOT_MAGIC_UNSET 3
+
/**
- * End-of-image slot data structure.
+ * End-of-image slot structure.
+ *
+ * 0 1 2 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * ~ MAGIC (16 octets) ~
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * ~ ~
+ * ~ Swap status (variable, aligned) ~
+ * ~ ~
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Copy done | 0xff padding (up to min-write-sz) ~
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Image OK | 0xff padding (up to min-write-sz) ~
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
-#define BOOT_IMG_MAGIC 0x12344321
- struct boot_img_trailer {
- uint32_t bit_copy_start;
- uint8_t bit_copy_done;
- uint8_t bit_img_ok;
- uint16_t _pad;
+extern const uint32_t boot_img_magic[4];
+
+struct boot_swap_state {
+ uint8_t magic; /* One of the BOOT_MAGIC_[...] values. */
+ uint8_t copy_done;
+ uint8_t image_ok;
};
#define BOOT_STATUS_STATE_COUNT 3
#define BOOT_STATUS_MAX_ENTRIES 128
+#define BOOT_STATUS_SOURCE_NONE 0
+#define BOOT_STATUS_SOURCE_SCRATCH 1
+#define BOOT_STATUS_SOURCE_SLOT0 2
+
int bootutil_verify_sig(uint8_t *hash, uint32_t hlen, uint8_t *sig, int slen,
uint8_t key_id);
+uint32_t boot_trailer_sz(uint8_t min_write_sz);
+uint32_t boot_status_off(const struct flash_area *fap);
+int boot_read_swap_state(const struct flash_area *fap,
+ struct boot_swap_state *state);
+int boot_read_swap_state_img(int slot, struct boot_swap_state *state);
+int boot_read_swap_state_scratch(struct boot_swap_state *state);
+int boot_write_magic(const struct flash_area *fap);
int boot_write_status(struct boot_status *bs);
int boot_schedule_test_swap(void);
+int boot_write_copy_done(const struct flash_area *fap);
+int boot_write_image_ok(const struct flash_area *fap);
-uint32_t boot_status_sz(int elem_sz);
-
-#if MYNEWT_VAL(TEST)
-struct boot_req;
-void boot_req_set(struct boot_req *req);
-#endif
+uint32_t boot_status_sz(uint8_t min_write_sz);
#ifdef __cplusplus
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/src/image_validate.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/src/image_validate.c b/boot/bootutil/src/image_validate.c
index 3793948..8c01324 100644
--- a/boot/bootutil/src/image_validate.c
+++ b/boot/bootutil/src/image_validate.c
@@ -24,6 +24,7 @@
#include "syscfg/syscfg.h"
#include "hal/hal_flash.h"
+#include "flash_map/flash_map.h"
#include "bootutil/image.h"
#include "bootutil/sign_key.h"
@@ -38,8 +39,9 @@
* Compute SHA256 over the image.
*/
static int
-bootutil_img_hash(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
- uint8_t *tmp_buf, uint32_t tmp_buf_sz, uint8_t *hash_result, uint8_t *seed, int seed_len)
+bootutil_img_hash(struct image_header *hdr, const struct flash_area *fap,
+ uint8_t *tmp_buf, uint32_t tmp_buf_sz,
+ uint8_t *hash_result, uint8_t *seed, int seed_len)
{
mbedtls_sha256_context sha256_ctx;
uint32_t blk_sz;
@@ -68,7 +70,7 @@ bootutil_img_hash(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
if (blk_sz > tmp_buf_sz) {
blk_sz = tmp_buf_sz;
}
- rc = hal_flash_read(flash_id, addr + off, tmp_buf, blk_sz);
+ rc = flash_area_read(fap, off, tmp_buf, blk_sz);
if (rc) {
return rc;
}
@@ -84,8 +86,9 @@ bootutil_img_hash(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
* Return non-zero if image could not be validated/does not validate.
*/
int
-bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
- uint8_t *tmp_buf, uint32_t tmp_buf_sz, uint8_t *seed, int seed_len, uint8_t *out_hash)
+bootutil_img_validate(struct image_header *hdr, const struct flash_area *fap,
+ uint8_t *tmp_buf, uint32_t tmp_buf_sz,
+ uint8_t *seed, int seed_len, uint8_t *out_hash)
{
uint32_t off;
uint32_t size;
@@ -113,23 +116,22 @@ bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
return -1;
}
- rc = bootutil_img_hash(hdr, flash_id, addr, tmp_buf, tmp_buf_sz, hash, seed, seed_len);
+ rc = bootutil_img_hash(hdr, fap, tmp_buf, tmp_buf_sz, hash,
+ seed, seed_len);
if (rc) {
return rc;
}
- if(out_hash) {
+ if (out_hash) {
memcpy(out_hash, hash, 32);
}
- /*
- * After image there's TLVs.
- */
+ /* After image there are TLVs. */
off = hdr->ih_img_size + hdr->ih_hdr_size;
size = off + hdr->ih_tlv_size;
for (; off < size; off += sizeof(tlv) + tlv.it_len) {
- rc = hal_flash_read(flash_id, addr + off, &tlv, sizeof(tlv));
+ rc = flash_area_read(fap, off, &tlv, sizeof tlv);
if (rc) {
return rc;
}
@@ -137,14 +139,14 @@ bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
if (tlv.it_len != sizeof(hash)) {
return -1;
}
- sha_off = addr + off + sizeof(tlv);
+ sha_off = off + sizeof(tlv);
}
#if MYNEWT_VAL(BOOTUTIL_SIGN_RSA)
if (tlv.it_type == IMAGE_TLV_RSA2048) {
if (tlv.it_len != 256) { /* 2048 bits */
return -1;
}
- sig_off = addr + off + sizeof(tlv);
+ sig_off = off + sizeof(tlv);
sig_len = tlv.it_len;
}
#endif
@@ -153,7 +155,7 @@ bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
if (tlv.it_len < 64) { /* oids + 2 * 28 bytes */
return -1;
}
- sig_off = addr + off + sizeof(tlv);
+ sig_off = off + sizeof(tlv);
sig_len = tlv.it_len;
}
#endif
@@ -165,7 +167,7 @@ bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
*/
return -1;
}
- rc = hal_flash_read(flash_id, sha_off, buf, sizeof(hash));
+ rc = flash_area_read(fap, sha_off, buf, sizeof hash);
if (rc) {
return rc;
}
@@ -181,7 +183,7 @@ bootutil_img_validate(struct image_header *hdr, uint8_t flash_id, uint32_t addr,
*/
return -1;
}
- rc = hal_flash_read(flash_id, sig_off, buf, sig_len);
+ rc = flash_area_read(fap, sig_off, buf, sig_len);
if (rc) {
return -1;
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/src/loader.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/src/loader.c b/boot/bootutil/src/loader.c
index c1a4281..08eb721 100644
--- a/boot/bootutil/src/loader.c
+++ b/boot/bootutil/src/loader.c
@@ -35,46 +35,48 @@
#include "bootutil/image.h"
#include "bootutil_priv.h"
+#define BOOT_MAX_IMG_SECTORS 120
+
/** Number of image slots in flash; currently limited to two. */
#define BOOT_NUM_SLOTS 2
-/** The request object provided by the client. */
-static const struct boot_req *boot_req;
+static struct {
+ struct {
+ struct image_header hdr;
+ struct flash_area sectors[BOOT_MAX_IMG_SECTORS];
+ } imgs[BOOT_NUM_SLOTS];
-/** Info about image slots. */
-static struct boot_img {
- struct image_header hdr;
- struct boot_image_location loc;
- uint32_t area;
-} boot_img[BOOT_NUM_SLOTS];
+ int num_img_sectors;
+ struct flash_area scratch_sector;
-static int boot_erase_area(int area_idx, uint32_t sz);
-static uint32_t boot_copy_sz(int max_idx, int *cnt);
+ uint8_t write_sz;
+} boot_data;
struct boot_status_table {
- /** * For each field, a value of 0 means "any". */
- uint32_t bst_magic_slot0;
- uint32_t bst_magic_scratch;
+ /**
+ * For each field, a value of 0 means "any".
+ */
+ uint8_t bst_magic_slot0;
+ uint8_t bst_magic_scratch;
uint8_t bst_copy_done_slot0;
-
uint8_t bst_status_source;
};
/**
- * This set of tables maps image trailer contents to swap status location.
- * When searching for a match, these tables must be iterated sequentially.
+ * This set of tables maps swap state contents to boot status location.
+ * When searching for a match, these tables must be iterated in order.
*/
static const struct boot_status_table boot_status_tables[] = {
{
/* | slot-0 | scratch |
* ----------+------------+------------|
- * magic | 0x12344321 | 0x******** |
+ * magic | Good | Any |
* copy-done | 0x01 | N/A |
* ----------+------------+------------'
* status: none |
* ------------------------------------'
*/
- .bst_magic_slot0 = BOOT_IMG_MAGIC,
+ .bst_magic_slot0 = BOOT_MAGIC_GOOD,
.bst_magic_scratch = 0,
.bst_copy_done_slot0 = 0x01,
.bst_status_source = BOOT_STATUS_SOURCE_NONE,
@@ -83,13 +85,13 @@ static const struct boot_status_table boot_status_tables[] = {
{
/* | slot-0 | scratch |
* ----------+------------+------------|
- * magic | 0x12344321 | 0x******** |
+ * magic | Good | Any |
* copy-done | 0xff | N/A |
* ----------+------------+------------'
* status: slot 0 |
* ------------------------------------'
*/
- .bst_magic_slot0 = BOOT_IMG_MAGIC,
+ .bst_magic_slot0 = BOOT_MAGIC_GOOD,
.bst_magic_scratch = 0,
.bst_copy_done_slot0 = 0xff,
.bst_status_source = BOOT_STATUS_SOURCE_SLOT0,
@@ -98,14 +100,14 @@ static const struct boot_status_table boot_status_tables[] = {
{
/* | slot-0 | scratch |
* ----------+------------+------------|
- * magic | 0x******** | 0x12344321 |
- * copy-done | 0x** | N/A |
+ * magic | Any | Good |
+ * copy-done | Any | N/A |
* ----------+------------+------------'
* status: scratch |
* ------------------------------------'
*/
.bst_magic_slot0 = 0,
- .bst_magic_scratch = BOOT_IMG_MAGIC,
+ .bst_magic_scratch = BOOT_MAGIC_GOOD,
.bst_copy_done_slot0 = 0,
.bst_status_source = BOOT_STATUS_SOURCE_SCRATCH,
},
@@ -113,17 +115,17 @@ static const struct boot_status_table boot_status_tables[] = {
{
/* | slot-0 | scratch |
* ----------+------------+------------|
- * magic | 0xffffffff | 0xffffffff |
+ * magic | Unset | Any |
* copy-done | 0xff | N/A |
* ----------+------------+------------|
* status: slot 0 |
- * ------------------------------------+-------------------------------+
- * This represents one of two cases: |
- * o No swaps ever (no status to read anyway, so no harm in checking). |
- * o Mid-revert; status in slot 0. |
- * --------------------------------------------------------------------'
+ * ------------------------------------+------------------------------+
+ * This represents one of two cases: |
+ * o No swaps ever (no status to read, so no harm in checking). |
+ * o Mid-revert; status in slot 0. |
+ * -------------------------------------------------------------------'
*/
- .bst_magic_slot0 = 0xffffffff,
+ .bst_magic_slot0 = BOOT_MAGIC_UNSET,
.bst_magic_scratch = 0,
.bst_copy_done_slot0 = 0xff,
.bst_status_source = BOOT_STATUS_SOURCE_SLOT0,
@@ -133,34 +135,55 @@ static const struct boot_status_table boot_status_tables[] = {
#define BOOT_STATUS_TABLES_COUNT \
(sizeof boot_status_tables / sizeof boot_status_tables[0])
+/**
+ * This table indicates the next swap type that should be performed. The first
+ * column contains the current swap type. The second column contains the swap
+ * type that should be effected after the first completes.
+ */
+static const uint8_t boot_swap_trans_table[][2] = {
+ /* From To */
+ { BOOT_SWAP_TYPE_REVERT, BOOT_SWAP_TYPE_NONE },
+ { BOOT_SWAP_TYPE_TEST, BOOT_SWAP_TYPE_REVERT },
+};
+
+#define BOOT_SWAP_TRANS_TABLE_SIZE \
+ (sizeof boot_swap_trans_table / sizeof boot_swap_trans_table[0])
+
+/**
+ * Determines where in flash the most recent boot status is stored. The boot
+ * status is necessary for completing a swap that was interrupted by a boot
+ * loader reset.
+ *
+ * @return A BOOT_STATUS_SOURCE_[...] code indicating where * status should be read from.
+ */
static int
boot_status_source(void)
{
const struct boot_status_table *table;
- struct boot_img_trailer bit_scratch;
- struct boot_img_trailer bit_slot0;
- struct boot_img_trailer bit_slot1;
+ struct boot_swap_state state_scratch;
+ struct boot_swap_state state_slot0;
+ struct boot_swap_state state_slot1;
int rc;
int i;
- rc = boot_read_img_trailer(0, &bit_slot0);
+ rc = boot_read_swap_state_img(0, &state_slot0);
assert(rc == 0);
- rc = boot_read_img_trailer(1, &bit_slot1);
+ rc = boot_read_swap_state_img(1, &state_slot1);
assert(rc == 0);
- rc = boot_read_scratch_trailer(&bit_scratch);
+ rc = boot_read_swap_state_scratch(&state_scratch);
assert(rc == 0);
for (i = 0; i < BOOT_STATUS_TABLES_COUNT; i++) {
table = boot_status_tables + i;
if ((table->bst_magic_slot0 == 0 ||
- table->bst_magic_slot0 == bit_slot0.bit_copy_start) &&
+ table->bst_magic_slot0 == state_slot0.magic) &&
(table->bst_magic_scratch == 0 ||
- table->bst_magic_scratch == bit_scratch.bit_copy_start) &&
+ table->bst_magic_scratch == state_scratch.magic) &&
(table->bst_copy_done_slot0 == 0 ||
- table->bst_copy_done_slot0 == bit_slot0.bit_copy_done)) {
+ table->bst_copy_done_slot0 == state_slot0.copy_done)) {
return table->bst_status_source;
}
@@ -169,191 +192,156 @@ boot_status_source(void)
return BOOT_STATUS_SOURCE_NONE;
}
+/**
+ * Calculates the type of swap that just completed.
+ */
static int
-boot_partial_swap_type(void)
+boot_previous_swap_type(void)
{
- int swap_type;
-
- swap_type = boot_swap_type();
- switch (swap_type) {
- case BOOT_SWAP_TYPE_NONE:
- return BOOT_SWAP_TYPE_REVERT;
+ int post_swap_type;
+ int i;
- case BOOT_SWAP_TYPE_REVERT:
- return BOOT_SWAP_TYPE_TEST;
+ post_swap_type = boot_swap_type();
- default:
- assert(0);
- return BOOT_SWAP_TYPE_REVERT;
+ for (i = 0; i < BOOT_SWAP_TRANS_TABLE_SIZE; i++){
+ if (boot_swap_trans_table[i][1] == post_swap_type) {
+ return boot_swap_trans_table[i][0];
+ }
}
-}
+
+ /* XXX: Temporary assert. */
+ assert(0);
-/**
- * Calculates the flash offset of the specified image slot.
- *
- * @param slot_num The number of the slot to calculate.
- * @param loc The flash location of the slot.
- *
- */
-static void
-boot_slot_addr(int slot_num, struct boot_image_location *loc)
-{
- const struct flash_area *area_desc;
- uint8_t area_idx;
-
- area_idx = boot_req->br_slot_areas[slot_num];
- area_desc = boot_req->br_area_descs + area_idx;
- loc->bil_flash_id = area_desc->fa_device_id;
- loc->bil_address = area_desc->fa_off;
+ return BOOT_SWAP_TYPE_REVERT;
}
-/**
- * Reads the header of image present in flash. Header corresponding to
- * empty image slot is filled with 0xff bytes.
- *
- * @param out_headers Points to an array of image headers. Each
- * element is filled with the header of the
- * corresponding image in flash.
- * @param addresses An array containing the flash addresses of each
- * image slot.
- * @param num_addresses The number of headers to read. This should
- * also be equal to the lengths of the
- * out_headers and addresses arrays.
- */
static int
-boot_read_image_header(struct boot_image_location *loc,
- struct image_header *out_hdr)
+boot_read_image_header(int slot, struct image_header *out_hdr)
{
+ const struct flash_area *fap;
+ int area_id;
int rc;
- rc = hal_flash_read(loc->bil_flash_id, loc->bil_address, out_hdr,
- sizeof *out_hdr);
+ area_id = flash_area_id_from_image_slot(slot);
+ rc = flash_area_open(area_id, &fap);
if (rc != 0) {
rc = BOOT_EFLASH;
- } else if (out_hdr->ih_magic != IMAGE_MAGIC) {
- rc = BOOT_EBADIMAGE;
+ goto done;
}
- if (rc) {
- memset(out_hdr, 0xff, sizeof(*out_hdr));
+ rc = flash_area_read(fap, 0, out_hdr, sizeof *out_hdr);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
}
+
+ rc = 0;
+
+done:
+ flash_area_close(fap);
return rc;
}
-static void
+static int
boot_read_image_headers(void)
{
- struct boot_img *b;
+ int rc;
int i;
for (i = 0; i < BOOT_NUM_SLOTS; i++) {
- b = &boot_img[i];
- boot_slot_addr(i, &b->loc);
- boot_read_image_header(&b->loc, &b->hdr);
- b->area = boot_req->br_img_sz;
+ rc = boot_read_image_header(i, &boot_data.imgs[i].hdr);
+ if (rc != 0) {
+ return rc;
+ }
}
+
+ return 0;
}
-int
-boot_build_request(struct boot_req *preq, int area_descriptor_max)
+static uint8_t
+boot_write_sz(void)
{
- int cnt;
- int total;
- int rc;
- const struct flash_area *fap;
- struct flash_area *descs = preq->br_area_descs;
- uint8_t *img_starts = preq->br_slot_areas;
+ uint8_t elem_sz;
+ uint8_t align;
- cnt = area_descriptor_max;
- rc = flash_area_to_sectors(FLASH_AREA_IMAGE_0, &cnt, descs);
- img_starts[0] = 0;
- total = cnt;
+ /* Figure out what size to write update status update as. The size depends
+ * on what the minimum write size is for scratch area, active image slot.
+ * We need to use the bigger of those 2 values.
+ */
+ elem_sz = hal_flash_align(boot_data.imgs[0].sectors[0].fa_device_id);
+ align = hal_flash_align(boot_data.scratch_sector.fa_device_id);
+ if (align > elem_sz) {
+ elem_sz = align;
+ }
- flash_area_open(FLASH_AREA_IMAGE_0, &fap);
- preq->br_img_sz = fap->fa_size;
+ return elem_sz;
+}
- cnt = area_descriptor_max - total;
- if (cnt < 0) {
- return -1;
- }
+/**
+ * Determines the sector layout of both image slots and the scratch area.
+ * This information is necessary for calculating the number of bytes to erase
+ * and copy during an image swap. The information collected during this
+ * function is used to populate the boot_data global.
+ */
+static int
+boot_read_sectors(void)
+{
+ const struct flash_area *sector0;
+ const struct flash_area *sector1;
+ const struct flash_area *scratch;
+ int num_sectors_slot0;
+ int num_sectors_slot1;
+ int rc;
+ int i;
- rc = flash_area_to_sectors(FLASH_AREA_IMAGE_1, &cnt,
- &descs[total]);
+ num_sectors_slot0 = BOOT_MAX_IMG_SECTORS;
+ rc = flash_area_to_sectors(FLASH_AREA_IMAGE_0, &num_sectors_slot0,
+ boot_data.imgs[0].sectors);
if (rc != 0) {
- return -2;
+ return BOOT_EFLASH;
}
- img_starts[1] = total;
- total += cnt;
- cnt = area_descriptor_max - total;
- if (cnt < 0) {
- return -3;
+ num_sectors_slot1 = BOOT_MAX_IMG_SECTORS;
+ rc = flash_area_to_sectors(FLASH_AREA_IMAGE_1, &num_sectors_slot1,
+ boot_data.imgs[1].sectors);
+ if (rc != 0) {
+ return BOOT_EFLASH;
}
- rc = flash_area_to_sectors(FLASH_AREA_IMAGE_SCRATCH, &cnt,
- &descs[total]);
- if(rc != 0) {
- return -4;
+ rc = flash_area_open(FLASH_AREA_IMAGE_SCRATCH, &scratch);
+ if (rc != 0) {
+ return BOOT_EFLASH;
}
+ boot_data.scratch_sector = *scratch;
+ boot_data.write_sz = hal_flash_align(scratch->fa_device_id);
- preq->br_scratch_area_idx = total;
- total += cnt;
- preq->br_num_image_areas = total;
- return 0;
-}
-
-/*
- * Status about copy-in-progress is either in slot0 (target slot) or
- * in scratch area. It is in scratch area if the process is currently
- * moving the last sector within image.
- *
- * If the copy-in-progress status is within the image slot, it will
- * be at the end of the area.
- * If the sector containing the boot copy status is in scratch, it's
- * offset from beginning of scratch depends on how much of the image
- * fits inside the scratch area.
- *
- * We start copy from the end of image, so boot-copy-status is in
- * scratch when the first area is being moved. Otherwise it will be
- * in slot 0.
- */
-static void
-boot_magic_loc(int slot_num, uint8_t *flash_id, uint32_t *off)
-{
- struct boot_img *b;
-
- b = &boot_img[slot_num];
- *flash_id = b->loc.bil_flash_id;
- *off = b->area + b->loc.bil_address - sizeof(struct boot_img_trailer);
-}
+ /* Ensure both image slots have identical sector layouts. */
+ if (num_sectors_slot0 != num_sectors_slot1) {
+ return BOOT_EFLASH;
+ }
+ for (i = 0; i < num_sectors_slot0; i++) {
+ sector0 = boot_data.imgs[0].sectors + i;
+ sector1 = boot_data.imgs[1].sectors + i;
+ if (sector0->fa_size != sector1->fa_size) {
+ return BOOT_EFLASH;
+ }
+ }
-static void
-boot_scratch_loc(uint8_t *flash_id, uint32_t *off)
-{
- struct flash_area *scratch;
- int cnt;
+ boot_data.num_img_sectors = num_sectors_slot0;
- scratch = &boot_req->br_area_descs[boot_req->br_scratch_area_idx];
- *flash_id = scratch->fa_device_id;
+ boot_data.write_sz = boot_write_sz();
- /* Calculate where the boot status would be if it was copied to scratch. */
- *off = boot_copy_sz(boot_req->br_slot_areas[1], &cnt);
- *off += (scratch->fa_off - sizeof(struct boot_img_trailer));
+ return 0;
}
static uint32_t
-boot_status_off(uint32_t trailer_off, int status_idx, int status_state,
- int elem_sz)
+boot_status_internal_off(int idx, int state, int elem_sz)
{
- uint32_t status_start;
int idx_sz;
- status_start = trailer_off - boot_status_sz(elem_sz);
+ idx_sz = elem_sz * BOOT_STATUS_STATE_COUNT;
- idx_sz = BOOT_STATUS_STATE_COUNT * elem_sz;
- return status_start +
- status_idx * idx_sz +
- status_state * elem_sz;
+ return idx * idx_sz + state * elem_sz;
}
/**
@@ -361,23 +349,24 @@ boot_status_off(uint32_t trailer_off, int status_idx, int status_state,
* to recover in case the boot lodaer was reset in the middle of a swap
* operation.
*/
-static void
-boot_read_status_bytes(struct boot_status *bs, uint8_t flash_id,
- uint32_t trailer_off)
+static int
+boot_read_status_bytes(const struct flash_area *fap, struct boot_status *bs)
{
- uint32_t status_sz;
uint32_t off;
uint8_t status;
int found;
+ int rc;
int i;
- status_sz = boot_status_sz(bs->elem_sz);
- off = trailer_off - status_sz;
+ off = boot_status_off(fap);
found = 0;
- for (i = 0; i < status_sz; i++) {
- hal_flash_read(flash_id, off + i * bs->elem_sz,
- &status, sizeof status);
+ for (i = 0; i < BOOT_STATUS_MAX_ENTRIES; i++) {
+ rc = flash_area_read(fap, off + i * boot_data.write_sz, &status, 1);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
if (status == 0xff) {
if (found) {
break;
@@ -392,28 +381,8 @@ boot_read_status_bytes(struct boot_status *bs, uint8_t flash_id,
bs->idx = i / BOOT_STATUS_STATE_COUNT;
bs->state = i % BOOT_STATUS_STATE_COUNT;
}
-}
-
-static uint8_t
-boot_status_elem_sz(void)
-{
- const struct flash_area *scratch;
- uint8_t elem_sz;
- uint8_t align;
- /* Figure out what size to write update status update as. The size depends
- * on what the minimum write size is for scratch area, active image slot.
- * We need to use the bigger of those 2 values.
- */
- elem_sz = hal_flash_align(boot_img[0].loc.bil_flash_id);
-
- scratch = &boot_req->br_area_descs[boot_req->br_scratch_area_idx];
- align = hal_flash_align(scratch->fa_device_id);
- if (align > elem_sz) {
- elem_sz = align;
- }
-
- return elem_sz;
+ return 0;
}
/**
@@ -423,37 +392,44 @@ boot_status_elem_sz(void)
* there is no operation in progress.
*/
static int
-boot_read_status(struct boot_status *boot_state)
+boot_read_status(struct boot_status *bs)
{
- uint32_t off;
- uint8_t flash_id;
+ const struct flash_area *fap;
int status_loc;
+ int area_id;
+ int rc;
- memset(boot_state, 0, sizeof *boot_state);
-
- boot_state->elem_sz = boot_status_elem_sz();
+ memset(bs, 0, sizeof *bs);
status_loc = boot_status_source();
switch (status_loc) {
case BOOT_STATUS_SOURCE_NONE:
- break;
+ return 0;
case BOOT_STATUS_SOURCE_SCRATCH:
- boot_scratch_loc(&flash_id, &off);
- boot_read_status_bytes(boot_state, flash_id, off);
+ area_id = FLASH_AREA_IMAGE_SCRATCH;
break;
case BOOT_STATUS_SOURCE_SLOT0:
- boot_magic_loc(0, &flash_id, &off);
- boot_read_status_bytes(boot_state, flash_id, off);
+ area_id = FLASH_AREA_IMAGE_0;
break;
default:
assert(0);
- break;
+ return BOOT_EBADARGS;
}
- return boot_state->idx != 0 || boot_state->state != 0;
+ rc = flash_area_open(area_id, &fap);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ rc = boot_read_status_bytes(fap, bs);
+ if (rc != 0) {
+ return rc;
+ }
+
+ return 0;
}
/**
@@ -467,29 +443,46 @@ boot_read_status(struct boot_status *boot_state)
int
boot_write_status(struct boot_status *bs)
{
- uint32_t trailer_off;
- uint32_t status_off;
- uint8_t flash_id;
+ const struct flash_area *fap;
+ uint32_t off;
+ int area_id;
+ int rc;
if (bs->idx == 0) {
/* Write to scratch. */
- boot_scratch_loc(&flash_id, &trailer_off);
+ area_id = FLASH_AREA_IMAGE_SCRATCH;
} else {
/* Write to slot 0. */
- boot_magic_loc(0, &flash_id, &trailer_off);
+ area_id = FLASH_AREA_IMAGE_0;
+ }
+
+ rc = flash_area_open(area_id, &fap);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
}
- status_off = boot_status_off(trailer_off, bs->idx, bs->state, bs->elem_sz);
- hal_flash_write(flash_id, status_off, &bs->state, 1);
+ off = boot_status_off(fap) +
+ boot_status_internal_off(bs->idx, bs->state, boot_data.write_sz);
- return 0;
+ rc = flash_area_write(fap, off, &bs->state, 1);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
+
+ rc = 0;
+
+done:
+ flash_area_close(fap);
+ return rc;
}
/*
* Validate image hash/signature in a slot.
*/
static int
-boot_image_check(struct image_header *hdr, struct boot_image_location *loc)
+boot_image_check(struct image_header *hdr, const struct flash_area *fap)
{
static void *tmpbuf;
@@ -499,19 +492,18 @@ boot_image_check(struct image_header *hdr, struct boot_image_location *loc)
return BOOT_ENOMEM;
}
}
- if (bootutil_img_validate(hdr, loc->bil_flash_id, loc->bil_address,
- tmpbuf, BOOT_TMPBUF_SZ, NULL, 0, NULL)) {
+ if (bootutil_img_validate(hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
+ NULL, 0, NULL)) {
return BOOT_EBADIMAGE;
}
return 0;
}
-
static int
split_image_check(struct image_header *app_hdr,
- struct boot_image_location *app_loc,
+ const struct flash_area *app_fap,
struct image_header *loader_hdr,
- struct boot_image_location *loader_loc)
+ const struct flash_area *loader_fap)
{
static void *tmpbuf;
uint8_t loader_hash[32];
@@ -522,41 +514,53 @@ split_image_check(struct image_header *app_hdr,
return BOOT_ENOMEM;
}
}
- if (bootutil_img_validate(loader_hdr, loader_loc->bil_flash_id,
- loader_loc->bil_address, tmpbuf, BOOT_TMPBUF_SZ,
- NULL, 0, loader_hash)) {
+ if (bootutil_img_validate(loader_hdr, loader_fap, tmpbuf, BOOT_TMPBUF_SZ,
+ NULL, 0, loader_hash)) {
return BOOT_EBADIMAGE;
}
- if (bootutil_img_validate(app_hdr, app_loc->bil_flash_id,
- app_loc->bil_address,
- tmpbuf, BOOT_TMPBUF_SZ, loader_hash, 32, NULL)) {
+ if (bootutil_img_validate(app_hdr, app_fap, tmpbuf, BOOT_TMPBUF_SZ,
+ loader_hash, 32, NULL)) {
return BOOT_EBADIMAGE;
}
+
return 0;
}
static int
boot_validate_slot1(void)
{
- if (boot_img[1].hdr.ih_magic == 0xffffffff ||
- boot_img[1].hdr.ih_flags & IMAGE_F_NON_BOOTABLE) {
+ const struct flash_area *fap;
+ int rc;
+
+ if (boot_data.imgs[1].hdr.ih_magic == 0xffffffff ||
+ boot_data.imgs[1].hdr.ih_flags & IMAGE_F_NON_BOOTABLE) {
/* No bootable image in slot 1; continue booting from slot 0. */
return -1;
}
- if (boot_img[1].hdr.ih_magic != IMAGE_MAGIC ||
- boot_image_check(&boot_img[1].hdr, &boot_img[1].loc) != 0) {
+ /* Image in slot 1 is invalid. Erase the image and continue booting
+ * from slot 0.
+ */
+ rc = flash_area_open(FLASH_AREA_IMAGE_1, &fap);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
+
+ if (boot_data.imgs[1].hdr.ih_magic != IMAGE_MAGIC ||
+ boot_image_check(&boot_data.imgs[1].hdr, fap) != 0) {
/* Image in slot 1 is invalid. Erase the image and continue booting
* from slot 0.
*/
- boot_erase_area(boot_req->br_slot_areas[1], boot_img[1].area);
+ flash_area_erase(fap, 0, fap->fa_size);
return -1;
}
+ flash_area_close(fap);
+
/* Image in slot 1 is valid. */
return 0;
}
@@ -584,199 +588,236 @@ boot_validated_swap_type(void)
/* Boot loader wants to switch to slot 1. Ensure image is valid. */
rc = boot_validate_slot1();
if (rc != 0) {
- return BOOT_SWAP_TYPE_NONE;
+ return BOOT_SWAP_TYPE_FAIL;
}
return swap_type;
}
/**
- * Calculates the size of the swap status and image trailer at the end of each
- * image slot.
- */
-static int
-boot_meta_sz(int status_elem_sz)
-{
- return sizeof (struct boot_img_trailer) + boot_status_sz(status_elem_sz);
-}
-
-/**
- * How many sectors starting from sector[idx] can fit inside scratch.
+ * Calculates the number of sectors the scratch area can contain. A "last"
+ * source sector is specified because images are copied backwards in flash
+ * (final index to index number 0).
+ *
+ * @param last_sector_idx The index of the last source sector
+ * (inclusive).
+ * @param out_first_sector_idx The index of the first source sector
+ * (inclusive) gets written here.
+ *
+ * @return The number of bytes comprised by the
+ * [first-sector, last-sector] range.
*/
static uint32_t
-boot_copy_sz(int max_idx, int *cnt)
+boot_copy_sz(int last_sector_idx, int *out_first_sector_idx)
{
- int i;
+ uint32_t new_sz;
uint32_t sz;
- static uint32_t scratch_sz = 0;
+ int i;
- if (!scratch_sz) {
- for (i = boot_req->br_scratch_area_idx;
- i < boot_req->br_num_image_areas;
- i++) {
- scratch_sz += boot_req->br_area_descs[i].fa_size;
- }
- }
sz = 0;
- *cnt = 0;
- for (i = max_idx - 1; i >= 0; i--) {
- if (sz + boot_req->br_area_descs[i].fa_size > scratch_sz) {
+
+ for (i = last_sector_idx; i >= 0; i--) {
+ new_sz = sz + boot_data.imgs[0].sectors[i].fa_size;
+ if (new_sz > boot_data.scratch_sector.fa_size) {
break;
}
- sz += boot_req->br_area_descs[i].fa_size;
- *cnt = *cnt + 1;
+ sz = new_sz;
}
+
+ /* i currently refers to a sector that doesn't fit or it is -1 because all
+ * sectors have been processed. In both cases, exclude sector i.
+ */
+ *out_first_sector_idx = i + 1;
return sz;
}
/**
- * Erases one area.
+ * Erases a region of flash.
*
- * @param area_idx The index of the area.
+ * @param flash_area_idx The ID of the flash area containing the region
+ * to erase.
+ * @param off The offset within the flash area to start the
+ * erase.
* @param sz The number of bytes to erase.
*
* @return 0 on success; nonzero on failure.
*/
static int
-boot_erase_area(int area_idx, uint32_t sz)
+boot_erase_area(int flash_area_id, uint32_t off, uint32_t sz)
{
- const struct flash_area *area_desc;
+ const struct flash_area *fap;
int rc;
- area_desc = boot_req->br_area_descs + area_idx;
- rc = hal_flash_erase(area_desc->fa_device_id, area_desc->fa_off, sz);
+ rc = flash_area_open(flash_area_id, &fap);
if (rc != 0) {
- return BOOT_EFLASH;
+ rc = BOOT_EFLASH;
+ goto done;
}
- return 0;
+
+ rc = flash_area_erase(fap, off, sz);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
+
+ rc = 0;
+
+done:
+ flash_area_close(fap);
+ return rc;
}
/**
- * Copies the contents of one area to another. The destination area must
- * be erased prior to this function being called.
+ * Copies the contents of one flash region to another. You must erase the
+ * destination region prior to calling this function.
*
- * @param from_area_idx The index of the source area.
- * @param to_area_idx The index of the destination area.
- * @param sz The number of bytes to move.
+ * @param flash_area_id_src The ID of the source flash area.
+ * @param flash_area_id_dst The ID of the destination flash area.
+ * @param off_src The offset within the source flash area to
+ * copy from.
+ * @param off_dst The offset within the destination flash area to
+ * copy to.
+ * @param sz The number of bytes to copy.
*
* @return 0 on success; nonzero on failure.
*/
static int
-boot_copy_area(int from_area_idx, int to_area_idx, uint32_t sz)
+boot_copy_area(int flash_area_id_src, int flash_area_id_dst,
+ uint32_t off_src, uint32_t off_dst, uint32_t sz)
{
- const struct flash_area *from_area_desc;
- const struct flash_area *to_area_desc;
- uint32_t from_addr;
- uint32_t to_addr;
- uint32_t off;
+ const struct flash_area *fap_src;
+ const struct flash_area *fap_dst;
+ uint32_t bytes_copied;
int chunk_sz;
int rc;
static uint8_t buf[1024];
- from_area_desc = boot_req->br_area_descs + from_area_idx;
- to_area_desc = boot_req->br_area_descs + to_area_idx;
+ fap_src = NULL;
+ fap_dst = NULL;
+
+ rc = flash_area_open(flash_area_id_src, &fap_src);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
- assert(to_area_desc->fa_size >= from_area_desc->fa_size);
+ rc = flash_area_open(flash_area_id_dst, &fap_dst);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
- off = 0;
- while (off < sz) {
- if (sz - off > sizeof buf) {
+ bytes_copied = 0;
+ while (bytes_copied < sz) {
+ if (sz - bytes_copied > sizeof buf) {
chunk_sz = sizeof buf;
} else {
- chunk_sz = sz - off;
+ chunk_sz = sz - bytes_copied;
}
- from_addr = from_area_desc->fa_off + off;
- rc = hal_flash_read(from_area_desc->fa_device_id, from_addr, buf,
- chunk_sz);
+ rc = flash_area_read(fap_src, off_src + bytes_copied, buf, chunk_sz);
if (rc != 0) {
- return rc;
+ rc = BOOT_EFLASH;
+ goto done;
}
- to_addr = to_area_desc->fa_off + off;
- rc = hal_flash_write(to_area_desc->fa_device_id, to_addr, buf,
- chunk_sz);
+ rc = flash_area_write(fap_dst, off_dst + bytes_copied, buf, chunk_sz);
if (rc != 0) {
- return rc;
+ rc = BOOT_EFLASH;
+ goto done;
}
- off += chunk_sz;
+ bytes_copied += chunk_sz;
}
- return 0;
+ rc = 0;
+
+done:
+ flash_area_close(fap_src);
+ flash_area_close(fap_dst);
+ return rc;
}
/**
- * Swaps the contents of two flash areas belonging to images.
+ * Swaps the contents of two flash regions within the two image slots.
*
- * @param idx The index of first slot to exchange. This area
- * must be part of the first image slot.
- * @param sz The number of bytes swap.
- *
- * @param end_area Whether this is the last sector in the source
- * and destination slots (0/1).
+ * @param idx The index of the first sector in the range of
+ * sectors being swapped.
+ * @param sz The number of bytes to swap.
+ * @param bs The current boot status. This struct gets
+ * updated according to the outcome.
*
* @return 0 on success; nonzero on failure.
*/
static int
-boot_swap_areas(int idx, uint32_t sz, int end_area,
- struct boot_status *boot_state)
+boot_swap_areas(int idx, uint32_t sz, struct boot_status *bs)
{
- int area_idx_0;
- int area_idx_1;
+ uint32_t copy_sz;
+ uint32_t img_off;
int rc;
- area_idx_0 = boot_req->br_slot_areas[0] + idx;
- area_idx_1 = boot_req->br_slot_areas[1] + idx;
- assert(area_idx_0 != area_idx_1);
- assert(area_idx_0 != boot_req->br_scratch_area_idx);
- assert(area_idx_1 != boot_req->br_scratch_area_idx);
+ /* Calculate offset from start of image area. */
+ img_off = boot_data.imgs[0].sectors[idx].fa_off -
+ boot_data.imgs[0].sectors[0].fa_off;
- if (boot_state->state == 0) {
- rc = boot_erase_area(boot_req->br_scratch_area_idx, sz);
+ if (bs->state == 0) {
+ rc = boot_erase_area(FLASH_AREA_IMAGE_SCRATCH, 0, sz);
if (rc != 0) {
return rc;
}
- rc = boot_copy_area(area_idx_1, boot_req->br_scratch_area_idx, sz);
+ rc = boot_copy_area(FLASH_AREA_IMAGE_1, FLASH_AREA_IMAGE_SCRATCH,
+ img_off, 0, sz);
if (rc != 0) {
return rc;
}
- boot_state->state = 1;
- (void)boot_write_status(boot_state);
+ bs->state = 1;
+ (void)boot_write_status(bs);
}
- if (boot_state->state == 1) {
- rc = boot_erase_area(area_idx_1, sz);
+ if (bs->state == 1) {
+ rc = boot_erase_area(FLASH_AREA_IMAGE_1, img_off, sz);
if (rc != 0) {
return rc;
}
- rc = boot_copy_area(area_idx_0, area_idx_1,
- end_area ? (sz - boot_meta_sz(boot_state->elem_sz)) : sz);
+ copy_sz = sz;
+ if (boot_data.imgs[0].sectors[idx].fa_off + sz >=
+ boot_data.imgs[1].sectors[0].fa_off) {
+
+ /* This is the end of the area. Don't copy the image state into
+ * slot 1.
+ */
+ copy_sz -= boot_trailer_sz(boot_data.write_sz);
+ }
+
+ rc = boot_copy_area(FLASH_AREA_IMAGE_0, FLASH_AREA_IMAGE_1,
+ img_off, img_off, copy_sz);
if (rc != 0) {
return rc;
}
- boot_state->state = 2;
- (void)boot_write_status(boot_state);
+ bs->state = 2;
+ (void)boot_write_status(bs);
}
- if (boot_state->state == 2) {
- rc = boot_erase_area(area_idx_0, sz);
+ if (bs->state == 2) {
+ rc = boot_erase_area(FLASH_AREA_IMAGE_0, img_off, sz);
if (rc != 0) {
return rc;
}
- rc = boot_copy_area(boot_req->br_scratch_area_idx, area_idx_0, sz);
+ rc = boot_copy_area(FLASH_AREA_IMAGE_SCRATCH, FLASH_AREA_IMAGE_0,
+ 0, img_off, sz);
if (rc != 0) {
return rc;
}
- boot_state->idx++;
- boot_state->state = 0;
- (void)boot_write_status(boot_state);
+ bs->idx++;
+ bs->state = 0;
+ (void)boot_write_status(bs);
}
+
return 0;
}
@@ -784,24 +825,32 @@ boot_swap_areas(int idx, uint32_t sz, int end_area,
* Swaps the two images in flash. If a prior copy operation was interrupted
* by a system reset, this function completes that operation.
*
+ * @param bs The current boot status. This function reads
+ * this struct to determine if it is resuming
+ * an interrupted swap operation. This
+ * function writes the updated status to this
+ * function on return.
+ *
* @return 0 on success; nonzero on failure.
*/
static int
-boot_copy_image(struct boot_status *boot_state)
+boot_copy_image(struct boot_status *bs)
{
uint32_t sz;
- int i;
- int end_area = 1;
- int cnt;
- int cur_idx;
-
- for (i = boot_req->br_slot_areas[1], cur_idx = 0; i > 0; cur_idx++) {
- sz = boot_copy_sz(i, &cnt);
- i -= cnt;
- if (cur_idx >= boot_state->idx) {
- boot_swap_areas(i, sz, end_area, boot_state);
+ int first_sector_idx;
+ int last_sector_idx;
+ int swap_idx;
+
+ swap_idx = 0;
+ last_sector_idx = boot_data.num_img_sectors - 1;
+ while (last_sector_idx >= 0) {
+ sz = boot_copy_sz(last_sector_idx, &first_sector_idx);
+ if (swap_idx >= bs->idx) {
+ boot_swap_areas(first_sector_idx, sz, bs);
}
- end_area = 0;
+
+ last_sector_idx = first_sector_idx - 1;
+ swap_idx++;
}
return 0;
@@ -813,18 +862,20 @@ boot_copy_image(struct boot_status *boot_state)
static int
boot_finalize_test_swap(void)
{
- struct boot_img_trailer bit;
- uint32_t off;
- uint8_t flash_id;
+ const struct flash_area *fap;
int rc;
- boot_magic_loc(0, &flash_id, &off);
- off += offsetof(struct boot_img_trailer, bit_copy_done);
+ rc = flash_area_open(FLASH_AREA_IMAGE_0, &fap);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
- bit.bit_copy_done = 1;
- rc = hal_flash_write(flash_id, off, &bit.bit_copy_done, 1);
+ rc = boot_write_copy_done(fap);
+ if (rc != 0) {
+ return rc;
+ }
- return rc;
+ return 0;
}
/**
@@ -835,67 +886,95 @@ boot_finalize_test_swap(void)
static int
boot_finalize_revert_swap(void)
{
- struct boot_img_trailer bit;
- uint32_t off;
- uint8_t flash_id;
+ const struct flash_area *fap;
+ struct boot_swap_state state_slot0;
int rc;
- boot_magic_loc(0, &flash_id, &off);
+ rc = flash_area_open(FLASH_AREA_IMAGE_0, &fap);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
- bit.bit_copy_start = BOOT_IMG_MAGIC;
- bit.bit_copy_done = 1;
- bit.bit_img_ok = 1;
- rc = hal_flash_write(flash_id, off, &bit, sizeof bit);
+ rc = boot_read_swap_state(fap, &state_slot0);
+ if (rc != 0) {
+ return BOOT_EFLASH;
+ }
- return rc;
-}
+ if (state_slot0.magic == BOOT_MAGIC_UNSET) {
+ rc = boot_write_magic(fap);
+ if (rc != 0) {
+ return rc;
+ }
+ }
-uint32_t
-boot_status_sz(int elem_sz)
-{
- return BOOT_STATUS_MAX_ENTRIES * BOOT_STATUS_STATE_COUNT * elem_sz;
+ if (state_slot0.copy_done == 0xff) {
+ rc = boot_write_copy_done(fap);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+
+ if (state_slot0.image_ok == 0xff) {
+ rc = boot_write_image_ok(fap);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+
+ return 0;
}
/**
- * Prepares the booting process. Based on the information provided in the
- * request object, this function moves images around in flash as appropriate,
- * and tells you what address to boot from.
+ * Prepares the booting process. This function moves images around in flash as
+ * appropriate, and tells you what address to boot from.
*
- * @param req Contains information about the flash layout.
* @param rsp On success, indicates how booting should occur.
*
* @return 0 on success; nonzero on failure.
*/
int
-boot_go(const struct boot_req *req, struct boot_rsp *rsp)
+boot_go(struct boot_rsp *rsp)
{
- struct boot_status boot_state;
- int partial_swap;
+ struct boot_status bs;
int swap_type;
int slot;
int rc;
- /* Set the global boot request object. The remainder of the boot process
- * will reference the global.
- */
- boot_req = req;
+ /* Determine the sector layout of the image slots and scratch area. */
+ rc = boot_read_sectors();
+ if (rc != 0) {
+ return rc;
+ }
/* Attempt to read an image header from each slot. */
- boot_read_image_headers();
+ rc = boot_read_image_headers();
+ if (rc != 0) {
+ return rc;
+ }
/* Determine if we rebooted in the middle of an image swap operation. */
- partial_swap = boot_read_status(&boot_state);
- if (partial_swap) {
- /* Complete the partial swap. */
- rc = boot_copy_image(&boot_state);
+ rc = boot_read_status(&bs);
+ if (rc != 0) {
+ return rc;
+ }
+
+ /* If a partial swap was detected, complete it. */
+ if (bs.idx != 0 || bs.state != 0) {
+ rc = boot_copy_image(&bs);
assert(rc == 0);
- swap_type = boot_partial_swap_type();
+ /* Extrapolate the type of the partial swap. We need this information
+ * to know how to mark the swap complete in flash.
+ */
+ swap_type = boot_previous_swap_type();
} else {
swap_type = boot_validated_swap_type();
- if (swap_type != BOOT_SWAP_TYPE_NONE) {
- rc = boot_copy_image(&boot_state);
+ switch (swap_type) {
+ case BOOT_SWAP_TYPE_TEST:
+ case BOOT_SWAP_TYPE_REVERT:
+ rc = boot_copy_image(&bs);
assert(rc == 0);
+ break;
}
}
@@ -914,6 +993,15 @@ boot_go(const struct boot_req *req, struct boot_rsp *rsp)
boot_finalize_revert_swap();
break;
+ case BOOT_SWAP_TYPE_FAIL:
+ /* The image in slot 1 was invalid and is now erased. Ensure we don't
+ * try to boot into it again on the next reboot. Do this by pretending
+ * we just reverted back to slot 0.
+ */
+ slot = 0;
+ boot_finalize_revert_swap();
+ break;
+
default:
assert(0);
slot = 0;
@@ -921,76 +1009,72 @@ boot_go(const struct boot_req *req, struct boot_rsp *rsp)
}
/* Always boot from the primary slot. */
- rsp->br_flash_id = boot_img[0].loc.bil_flash_id;
- rsp->br_image_addr = boot_img[0].loc.bil_address;
- rsp->br_hdr = &boot_img[slot].hdr;
+ rsp->br_flash_id = boot_data.imgs[0].sectors[0].fa_device_id;
+ rsp->br_image_addr = boot_data.imgs[0].sectors[0].fa_off;
+ rsp->br_hdr = &boot_data.imgs[slot].hdr;
return 0;
}
-#define SPLIT_AREA_DESC_MAX (255)
-
int
split_go(int loader_slot, int split_slot, void **entry)
{
- int rc;
- /** Areas representing the beginning of image slots. */
- uint8_t img_starts[2];
- struct flash_area *descs;
+ const struct flash_area *loader_fap;
+ const struct flash_area *app_fap;
uint32_t entry_val;
- struct boot_req req = {
- .br_slot_areas = img_starts,
- };
+ int loader_flash_id;
+ int app_flash_id;
+ int rc;
- descs = calloc(SPLIT_AREA_DESC_MAX, sizeof(struct flash_area));
- if (descs == NULL) {
- return SPLIT_GO_ERR;
- }
+ app_fap = NULL;
+ loader_fap = NULL;
- req.br_area_descs = descs;
+ rc = boot_read_sectors();
+ if (rc != 0) {
+ goto done;
+ }
- rc = boot_build_request(&req, SPLIT_AREA_DESC_MAX);
+ rc = boot_read_image_headers();
if (rc != 0) {
- rc = SPLIT_GO_ERR;
- goto split_app_go_end;
+ goto done;
}
- boot_req = &req;
+ app_flash_id = flash_area_id_from_image_slot(split_slot);
+ rc = flash_area_open(app_flash_id, &app_fap);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
- boot_read_image_headers();
+ loader_flash_id = flash_area_id_from_image_slot(loader_slot);
+ rc = flash_area_open(loader_flash_id, &loader_fap);
+ if (rc != 0) {
+ rc = BOOT_EFLASH;
+ goto done;
+ }
- /* Don't check the bootable image flag because we could really
- * call a bootable or non-bootable image. Just validate that
- * the image check passes which is distinct from the normal check */
- rc = split_image_check(&boot_img[split_slot].hdr,
- &boot_img[split_slot].loc,
- &boot_img[loader_slot].hdr,
- &boot_img[loader_slot].loc);
+ /* Don't check the bootable image flag because we could really call a
+ * bootable or non-bootable image. Just validate that the image check
+ * passes which is distinct from the normal check.
+ */
+ rc = split_image_check(&boot_data.imgs[split_slot].hdr,
+ app_fap,
+ &boot_data.imgs[loader_slot].hdr,
+ loader_fap);
if (rc != 0) {
rc = SPLIT_GO_NON_MATCHING;
- goto split_app_go_end;
+ goto done;
}
- entry_val = (uint32_t) boot_img[split_slot].loc.bil_address +
- (uint32_t) boot_img[split_slot].hdr.ih_hdr_size;
+ entry_val = boot_data.imgs[split_slot].sectors[0].fa_off +
+ boot_data.imgs[split_slot].hdr.ih_hdr_size;
*entry = (void*) entry_val;
rc = SPLIT_GO_OK;
-split_app_go_end:
- free(descs);
- return rc;
-}
+ rc = 0;
-#if MYNEWT_VAL(TEST)
-
-/**
- * Used by unit tests. This allows a test to call boot loader functions
- * without starting the boot loader.
- */
-void
-boot_req_set(struct boot_req *req)
-{
- boot_req = req;
+done:
+ flash_area_close(app_fap);
+ flash_area_close(loader_fap);
+ return rc;
}
-
-#endif
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/syscfg.yml
----------------------------------------------------------------------
diff --git a/boot/bootutil/syscfg.yml b/boot/bootutil/syscfg.yml
index 5d59704..cfa3d44 100644
--- a/boot/bootutil/syscfg.yml
+++ b/boot/bootutil/syscfg.yml
@@ -7,5 +7,3 @@ syscfg.defs:
BOOTUTIL_SIGN_EC:
description: 'TBD'
value: '0'
-pkg.cflags.IMAGE_KEYS_RSA: -DIMAGE_SIGNATURES_RSA
-pkg.cflags.IMAGE_KEYS_EC: -DIMAGE_SIGNATURES_EC
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/boot_test.h
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/boot_test.h b/boot/bootutil/test/src/boot_test.h
index e883c8f..d43febf 100644
--- a/boot/bootutil/test/src/boot_test.h
+++ b/boot/bootutil/test/src/boot_test.h
@@ -74,8 +74,7 @@ void boot_test_util_verify_flash(const struct image_header *hdr0,
int orig_slot_0,
const struct image_header *hdr1,
int orig_slot_1);
-void boot_test_util_verify_all(const struct boot_req *req,
- int expected_swap_type,
+void boot_test_util_verify_all(int expected_swap_type,
const struct image_header *hdr0,
const struct image_header *hdr1);
#ifdef __cplusplus
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/boot_test_utils.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/boot_test_utils.c b/boot/bootutil/test/src/boot_test_utils.c
index 3040604..40e8960 100644
--- a/boot/bootutil/test/src/boot_test_utils.c
+++ b/boot/bootutil/test/src/boot_test_utils.c
@@ -120,7 +120,7 @@ boot_test_util_area_write_size(int dst_idx, uint32_t off, uint32_t size)
/* Don't include trailer in copy to second slot. */
desc = boot_test_area_descs + dst_idx;
- trailer_start = desc->fa_size - boot_status_sz(1);
+ trailer_start = desc->fa_size - boot_trailer_sz(1);
diff = off + size - trailer_start;
if (diff > 0) {
if (diff > size) {
@@ -262,35 +262,51 @@ boot_test_util_write_hash(const struct image_header *hdr, int slot)
TEST_ASSERT(rc == 0);
}
-void
-boot_test_util_write_bit(int flash_area_id, struct boot_img_trailer *bit)
+static void
+boot_test_util_write_swap_state(int flash_area_id,
+ const struct boot_swap_state *state)
{
const struct flash_area *fap;
int rc;
- /* XXX: This function only works by chance. It requires that the boot
- * loader have have been run once already so that its global state has been
- * populated.
- */
-
rc = flash_area_open(flash_area_id, &fap);
TEST_ASSERT_FATAL(rc == 0);
- rc = flash_area_write(fap, fap->fa_size - sizeof *bit, bit, sizeof *bit);
- TEST_ASSERT_FATAL(rc == 0);
+ switch (state->magic) {
+ case 0:
+ break;
+
+ case BOOT_MAGIC_GOOD:
+ rc = boot_write_magic(fap);
+ TEST_ASSERT_FATAL(rc == 0);
+ break;
+
+ default:
+ TEST_ASSERT_FATAL(0);
+ break;
+ }
+
+ if (state->copy_done != 0xff) {
+ rc = boot_write_copy_done(fap);
+ TEST_ASSERT_FATAL(rc == 0);
+ }
+
+ if (state->image_ok != 0xff) {
+ rc = boot_write_image_ok(fap);
+ TEST_ASSERT_FATAL(rc == 0);
+ }
}
void
boot_test_util_mark_revert(void)
{
- struct boot_img_trailer bit_slot0 = {
- .bit_copy_start = BOOT_IMG_MAGIC,
- .bit_copy_done = 0x01,
- .bit_img_ok = 0xff,
- ._pad = 0xffff,
+ struct boot_swap_state state_slot0 = {
+ .magic = BOOT_MAGIC_GOOD,
+ .copy_done = 0x01,
+ .image_ok = 0xff,
};
- boot_test_util_write_bit(FLASH_AREA_IMAGE_0, &bit_slot0);
+ boot_test_util_write_swap_state(FLASH_AREA_IMAGE_0, &state_slot0);
}
void
@@ -371,18 +387,14 @@ boot_test_util_verify_area(const struct flash_area *area_desc,
void
boot_test_util_verify_status_clear(void)
{
- struct boot_img_trailer bit;
- const struct flash_area *fap;
+ struct boot_swap_state state_slot0;
int rc;
- rc = flash_area_open(FLASH_AREA_IMAGE_0, &fap);
- TEST_ASSERT(rc == 0);
-
- rc = flash_area_read(fap, fap->fa_size - sizeof(bit), &bit, sizeof(bit));
- TEST_ASSERT(rc == 0);
+ rc = boot_read_swap_state_img(0, &state_slot0);
+ assert(rc == 0);
- TEST_ASSERT(bit.bit_copy_start != BOOT_IMG_MAGIC ||
- bit.bit_copy_done != 0xff);
+ TEST_ASSERT(state_slot0.magic != BOOT_MAGIC_UNSET ||
+ state_slot0.copy_done != 0);
}
@@ -420,7 +432,7 @@ boot_test_util_verify_flash(const struct image_header *hdr0, int orig_slot_0,
}
void
-boot_test_util_verify_all(const struct boot_req *req, int expected_swap_type,
+boot_test_util_verify_all(int expected_swap_type,
const struct image_header *hdr0,
const struct image_header *hdr1)
{
@@ -433,12 +445,11 @@ boot_test_util_verify_all(const struct boot_req *req, int expected_swap_type,
int rc;
int i;
- TEST_ASSERT_FATAL(req != NULL);
TEST_ASSERT_FATAL(hdr0 != NULL || hdr1 != NULL);
num_swaps = 0;
for (i = 0; i < 3; i++) {
- rc = boot_go(req, &rsp);
+ rc = boot_go(&rsp);
TEST_ASSERT_FATAL(rc == 0);
if (expected_swap_type != BOOT_SWAP_TYPE_NONE) {
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_invalid_hash.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_invalid_hash.c b/boot/bootutil/test/src/testcases/boot_test_invalid_hash.c
index c26abfb..515ab45 100644
--- a/boot/bootutil/test/src/testcases/boot_test_invalid_hash.c
+++ b/boot/bootutil/test/src/testcases/boot_test_invalid_hash.c
@@ -39,14 +39,6 @@ TEST_CASE(boot_test_invalid_hash)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
struct image_tlv tlv = {
.it_type = IMAGE_TLV_SHA256,
.it_len = 32
@@ -63,5 +55,5 @@ TEST_CASE(boot_test_invalid_hash)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_no_flag_has_hash.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_no_flag_has_hash.c b/boot/bootutil/test/src/testcases/boot_test_no_flag_has_hash.c
index 6bfa845..a4f555a 100644
--- a/boot/bootutil/test/src/testcases/boot_test_no_flag_has_hash.c
+++ b/boot/bootutil/test/src/testcases/boot_test_no_flag_has_hash.c
@@ -39,14 +39,6 @@ TEST_CASE(boot_test_no_flag_has_hash)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -56,5 +48,5 @@ TEST_CASE(boot_test_no_flag_has_hash)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_no_hash.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_no_hash.c b/boot/bootutil/test/src/testcases/boot_test_no_hash.c
index 6f05d16..a5c74dd 100644
--- a/boot/bootutil/test/src/testcases/boot_test_no_hash.c
+++ b/boot/bootutil/test/src/testcases/boot_test_no_hash.c
@@ -39,14 +39,6 @@ TEST_CASE(boot_test_no_hash)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -55,5 +47,5 @@ TEST_CASE(boot_test_no_hash)
rc = boot_set_pending();
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr0, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_bs_10.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_bs_10.c b/boot/bootutil/test/src/testcases/boot_test_nv_bs_10.c
index bb7bc9c..02d6d17 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_bs_10.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_bs_10.c
@@ -29,19 +29,11 @@ TEST_CASE(boot_test_nv_bs_10)
.ih_ver = { 0, 2, 3, 4 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr, 0);
boot_test_util_write_hash(&hdr, 0);
boot_test_util_swap_areas(boot_test_slot_areas[1],
BOOT_TEST_AREA_IDX_SCRATCH);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_NONE, &hdr, NULL);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_NONE, &hdr, NULL);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_bs_11.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_bs_11.c b/boot/bootutil/test/src/testcases/boot_test_nv_bs_11.c
index c3376b4..16efcf1 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_bs_11.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_bs_11.c
@@ -41,14 +41,6 @@ TEST_CASE(boot_test_nv_bs_11)
.ih_ver = { 1, 1, 5, 5 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -57,14 +49,11 @@ TEST_CASE(boot_test_nv_bs_11)
rc = boot_set_pending();
boot_test_util_copy_area(5, BOOT_TEST_AREA_IDX_SCRATCH);
- // XXX
- boot_req_set(&req);
status.idx = 0;
- status.elem_sz = 1;
status.state = 1;
rc = boot_write_status(&status);
TEST_ASSERT(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f855c453/boot/bootutil/test/src/testcases/boot_test_nv_bs_11_2areas.c
----------------------------------------------------------------------
diff --git a/boot/bootutil/test/src/testcases/boot_test_nv_bs_11_2areas.c b/boot/bootutil/test/src/testcases/boot_test_nv_bs_11_2areas.c
index 1cb808d..a69aedc 100644
--- a/boot/bootutil/test/src/testcases/boot_test_nv_bs_11_2areas.c
+++ b/boot/bootutil/test/src/testcases/boot_test_nv_bs_11_2areas.c
@@ -41,14 +41,6 @@ TEST_CASE(boot_test_nv_bs_11_2areas)
.ih_ver = { 1, 2, 3, 432 },
};
- struct boot_req req = {
- .br_area_descs = boot_test_area_descs,
- .br_slot_areas = boot_test_slot_areas,
- .br_num_image_areas = BOOT_TEST_AREA_IDX_SCRATCH + 1,
- .br_scratch_area_idx = BOOT_TEST_AREA_IDX_SCRATCH,
- .br_img_sz = (384 * 1024),
- };
-
boot_test_util_init_flash();
boot_test_util_write_image(&hdr0, 0);
boot_test_util_write_hash(&hdr0, 0);
@@ -60,11 +52,10 @@ TEST_CASE(boot_test_nv_bs_11_2areas)
boot_test_util_swap_areas(2, 5);
status.idx = 1;
- status.elem_sz = 1;
status.state = 0;
rc = boot_write_status(&status);
TEST_ASSERT_FATAL(rc == 0);
- boot_test_util_verify_all(&req, BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
+ boot_test_util_verify_all(BOOT_SWAP_TYPE_TEST, &hdr0, &hdr1);
}