bootutil: copy image size with fast overwrite
Previously when `MCUBOOT_OVERWRITE_ONLY_FAST` was set, the whole amount
of sectors that stored an image were being copied. After this commit
only the exact amount of data used by the image is copied; this avoids
copying some 0xff (or garbage) data between the end of the image and the
end of the last sector storing it.
Extra trailer management was added which suits using the copy upgrade
routine also for bootstrapping.
Signed-off-by: Fabio Utzig <fabio.utzig@nordicsemi.no>
diff --git a/boot/bootutil/src/loader.c b/boot/bootutil/src/loader.c
index a08ed7e..9822364 100644
--- a/boot/bootutil/src/loader.c
+++ b/boot/bootutil/src/loader.c
@@ -890,6 +890,13 @@
const struct flash_area *fap_secondary_slot;
uint8_t image_index;
+#if defined(MCUBOOT_OVERWRITE_ONLY_FAST)
+ uint32_t sector;
+ uint32_t trailer_sz;
+ uint32_t off;
+ uint32_t sz;
+#endif
+
(void)bs;
#if defined(MCUBOOT_OVERWRITE_ONLY_FAST)
@@ -917,15 +924,31 @@
rc = boot_erase_region(fap_primary_slot, size, this_size);
assert(rc == 0);
- size += this_size;
-
#if defined(MCUBOOT_OVERWRITE_ONLY_FAST)
- if (size >= src_size) {
+ if ((size + this_size) >= src_size) {
+ size += src_size - size;
+ size += BOOT_WRITE_SZ(state) - (size % BOOT_WRITE_SZ(state));
break;
}
#endif
+
+ size += this_size;
}
+#if defined(MCUBOOT_OVERWRITE_ONLY_FAST)
+ trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state));
+ sector = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT) - 1;
+ sz = 0;
+ do {
+ sz += boot_img_sector_size(state, BOOT_PRIMARY_SLOT, sector);
+ off = boot_img_sector_off(state, BOOT_PRIMARY_SLOT, sector);
+ sector--;
+ } while (sz < trailer_sz);
+
+ rc = boot_erase_region(fap_primary_slot, off, sz);
+ assert(rc == 0);
+#endif
+
#ifdef MCUBOOT_ENC_IMAGES
if (IS_ENCRYPTED(boot_img_hdr(state, BOOT_SECONDARY_SLOT))) {
rc = boot_enc_load(BOOT_CURR_ENC(state), image_index,
@@ -944,6 +967,16 @@
BOOT_LOG_INF("Copying the secondary slot to the primary slot: 0x%zx bytes",
size);
rc = boot_copy_region(state, fap_secondary_slot, fap_primary_slot, 0, 0, size);
+ if (rc != 0) {
+ return rc;
+ }
+
+#if defined(MCUBOOT_OVERWRITE_ONLY_FAST)
+ rc = boot_write_magic(fap_primary_slot);
+ if (rc != 0) {
+ return rc;
+ }
+#endif
#ifdef MCUBOOT_HW_ROLLBACK_PROT
/* Update the stored security counter with the new image's security counter