+ assert(run_size > 0);
+ }
+
+ uint32_t padding_at_start = 0;
+ if (c->write_start_alignment || c->write_end_alignment) {
+ /* align write region according to bank requirements */
+ target_addr_t aligned_start = flash_write_align_start(c, run_address);
+ padding_at_start = run_address - aligned_start;
+ if (padding_at_start > 0) {
+ LOG_WARNING("Section start address " TARGET_ADDR_FMT
+ " breaks the required alignment of flash bank %s",
+ run_address, c->name);
+ LOG_WARNING("Padding %d bytes from " TARGET_ADDR_FMT,
+ padding_at_start, aligned_start);
+
+ run_address -= padding_at_start;
+ run_size += padding_at_start;
+ }
+
+ target_addr_t run_end = run_address + run_size - 1;
+ target_addr_t aligned_end = flash_write_align_end(c, run_end);
+ pad_bytes = aligned_end - run_end;
+ if (pad_bytes > 0) {
+ LOG_INFO("Padding image section %d at " TARGET_ADDR_FMT
+ " with %d bytes (bank write end alignment)",
+ section_last, run_end + 1, pad_bytes);
+
+ padding[section_last] += pad_bytes;
+ run_size += pad_bytes;
+ }
+
+ } else if (unlock || erase) {
+ /* If we're applying any sector automagic, then pad this
+ * (maybe-combined) segment to the end of its last sector.
+ */
+ int sector;
+ uint32_t offset_start = run_address - c->base;
+ uint32_t offset_end = offset_start + run_size;
+ uint32_t end = offset_end, delta;
+
+ for (sector = 0; sector < c->num_sectors; sector++) {
+ end = c->sectors[sector].offset
+ + c->sectors[sector].size;
+ if (offset_end <= end)
+ break;
+ }
+
+ delta = end - offset_end;
+ padding[section_last] += delta;
+ run_size += delta;