You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ut...@apache.org on 2020/05/15 11:03:37 UTC
[mynewt-mcumgr] 02/02: cmd/img_mgmt/port/zephyr: fix to
img_mgmt_impl_erase_image_data()
This is an automated email from the ASF dual-hosted git repository.
utzig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-mcumgr.git
commit 3fdb7fe0a59dd879f81569a4fb36ea4b44b83792
Author: Andrzej Puzdrowski <an...@nordicsemi.no>
AuthorDate: Tue May 12 12:59:59 2020 +0200
cmd/img_mgmt/port/zephyr: fix to img_mgmt_impl_erase_image_data()
It was possible that the function tried to erase non erase-block-size
aligned number of bytes which might have cause failure.
Additionally the image trailer area might have been not erased at all.
Reworked implementation so:
- the erase request is corrected to erase proper amount of memory
- erase of image trailer is ensured.
Signed-off-by: Andrzej Puzdrowski <an...@nordicsemi.no>
---
cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c | 59 +++++++++++++++++++++++---
1 file changed, 54 insertions(+), 5 deletions(-)
diff --git a/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c b/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
index 3bf30b5..eb5647a 100644
--- a/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
+++ b/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c
@@ -318,18 +318,67 @@ img_mgmt_impl_erase_image_data(unsigned int off, unsigned int num_bytes)
const struct flash_area *fa;
int rc;
+ if (off != 0) {
+ rc = MGMT_ERR_EINVAL;
+ goto end;
+ }
+
rc = flash_area_open(FLASH_AREA_ID(image_1), &fa);
if (rc != 0) {
- return MGMT_ERR_EUNKNOWN;
+ LOG_ERR("Can't bind to the flash area (err %d)", rc);
+ rc = MGMT_ERR_EUNKNOWN;
+ goto end;
}
- rc = flash_area_erase(fa, off, num_bytes);
- flash_area_close(fa);
+ /* align requested erase size to the erase-block-size */
+ struct device *dev = flash_area_get_device(fa);
+ struct flash_pages_info page;
+
+ rc = flash_get_page_info_by_offs(dev, fa->fa_off + num_bytes -1, &page);
if (rc != 0) {
- return MGMT_ERR_EUNKNOWN;
+ LOG_ERR("bad offset (0x%x)", fa->fa_off + num_bytes -1);
+ rc = MGMT_ERR_EUNKNOWN;
+ goto end_fa;
}
- return 0;
+ size_t erase_size = page.start_offset + page.size - fa->fa_off;
+
+ rc = flash_area_erase(fa, 0, erase_size);
+
+ if (rc != 0) {
+ LOG_ERR("image slot erase of 0x%x bytes failed (err %d)", erase_size,
+ rc);
+ rc = MGMT_ERR_EUNKNOWN;
+ goto end_fa;
+ }
+
+ LOG_INF("Erased 0x%x bytes of image slot", erase_size);
+
+ /* erase the image trailer area if it was not erased */
+ off = BOOT_TRAILER_IMG_STATUS_OFFS(fa);
+ if (off >= erase_size) {
+ rc = flash_get_page_info_by_offs(dev, fa->fa_off + off, &page);
+
+ off = page.start_offset - fa->fa_off;
+ erase_size = fa->fa_size - off;
+
+ rc = flash_area_erase(fa, off, erase_size);
+ if (rc != 0) {
+ LOG_ERR("image slot trailer erase of 0x%x bytes failed (err %d)",
+ erase_size, rc);
+ rc = MGMT_ERR_EUNKNOWN;
+ goto end_fa;
+ }
+
+ LOG_INF("Erased 0x%x bytes of image slot trailer", erase_size);
+ }
+
+ rc = 0;
+
+end_fa:
+ flash_area_close(fa);
+end:
+ return rc;
}
#if IMG_MGMT_LAZY_ERASE