Skip to content

Commit 47d826e

Browse files
committed
boot: bootutil: swap_offset: Fix maximum application size
Fixes this functionality to have the maximum allowable application size Signed-off-by: Jamie McCrae <[email protected]>
1 parent d5d3359 commit 47d826e

File tree

1 file changed

+20
-25
lines changed

1 file changed

+20
-25
lines changed

boot/bootutil/src/swap_offset.c

+20-25
Original file line numberDiff line numberDiff line change
@@ -307,23 +307,26 @@ static int app_max_sectors(struct boot_loader_state *state)
307307
uint32_t sz = 0;
308308
uint32_t sector_sz;
309309
uint32_t trailer_sz;
310-
uint32_t first_trailer_idx;
310+
uint32_t available_sectors_pri;
311+
uint32_t available_sectors_sec;
312+
uint32_t trailer_sectors = 0;
311313

312314
sector_sz = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0);
313315
trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state));
314-
first_trailer_idx = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT);
315316

316317
while (1) {
317318
sz += sector_sz;
319+
++trailer_sectors;
318320

319321
if (sz >= trailer_sz) {
320322
break;
321323
}
322-
323-
first_trailer_idx--;
324324
}
325325

326-
return first_trailer_idx;
326+
available_sectors_pri = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT) - trailer_sectors;
327+
available_sectors_sec = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT) - 1;
328+
329+
return (available_sectors_pri < available_sectors_sec ? available_sectors_pri : available_sectors_sec);
327330
}
328331

329332
int boot_slots_compatible(struct boot_loader_state *state)
@@ -333,34 +336,35 @@ int boot_slots_compatible(struct boot_loader_state *state)
333336
size_t sector_sz_pri = 0;
334337
size_t sector_sz_sec = 0;
335338
size_t i;
336-
size_t num_usable_sectors_pri;
339+
size_t num_usable_sectors;
337340

338341
num_sectors_pri = boot_img_num_sectors(state, BOOT_PRIMARY_SLOT);
339342
num_sectors_sec = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT);
340-
num_usable_sectors_pri = app_max_sectors(state);
343+
num_usable_sectors = app_max_sectors(state);
341344

342-
if ((num_sectors_pri != num_sectors_sec) &&
343-
((num_sectors_pri + 1) != num_sectors_sec) &&
344-
((num_usable_sectors_pri + 1) != (num_sectors_sec))) {
345+
if (num_sectors_pri != num_sectors_sec &&
346+
(num_sectors_pri + 1) != num_sectors_sec &&
347+
num_usable_sectors != (num_sectors_sec - 1)) {
345348
BOOT_LOG_WRN("Cannot upgrade: not a compatible amount of sectors");
346-
BOOT_LOG_DBG("slot0 sectors: %d, slot1 sectors: %d, usable slot0 sectors: %d",
349+
BOOT_LOG_DBG("slot0 sectors: %d, slot1 sectors: %d, usable sectors: %d",
347350
(int)num_sectors_pri, (int)num_sectors_sec,
348-
(int)(num_usable_sectors_pri - 1));
351+
(int)(num_usable_sectors));
349352
return 0;
350353
} else if (num_sectors_pri > BOOT_MAX_IMG_SECTORS) {
351354
BOOT_LOG_WRN("Cannot upgrade: more sectors than allowed");
352355
return 0;
353356
}
354357

355-
if ((num_usable_sectors_pri + 1) != num_sectors_sec) {
358+
if ((num_usable_sectors + 1) != num_sectors_sec) {
356359
BOOT_LOG_DBG("Non-optimal sector distribution, slot0 has %d usable sectors "
357-
"but slot1 has %d usable sectors", (int)(num_usable_sectors_pri),
360+
"but slot1 has %d usable sectors", (int)(num_usable_sectors),
358361
((int)num_sectors_sec - 1));
359362
}
360363

361-
for (i = 0; i < num_sectors_pri; i++) {
364+
for (i = 0; i < num_usable_sectors; i++) {
362365
sector_sz_pri = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, i);
363366
sector_sz_sec = boot_img_sector_size(state, BOOT_SECONDARY_SLOT, i);
367+
364368
if (sector_sz_pri != sector_sz_sec) {
365369
BOOT_LOG_WRN("Cannot upgrade: not same sector layout");
366370
return 0;
@@ -726,19 +730,10 @@ void swap_run(struct boot_loader_state *state, struct boot_status *bs,
726730
int app_max_size(struct boot_loader_state *state)
727731
{
728732
uint32_t sector_sz_primary;
729-
uint32_t sector_sz_secondary;
730-
uint32_t sz_primary;
731-
uint32_t sz_secondary;
732733

733734
sector_sz_primary = boot_img_sector_size(state, BOOT_PRIMARY_SLOT, 0);
734-
sector_sz_secondary = boot_img_sector_size(state, BOOT_SECONDARY_SLOT, 0);
735-
736-
/* Account for image flags and move sector */
737-
sz_primary = app_max_sectors(state) * sector_sz_primary;
738-
sz_secondary = boot_img_num_sectors(state, BOOT_SECONDARY_SLOT) * sector_sz_secondary -
739-
sector_sz_primary;
740735

741-
return (sz_primary <= sz_secondary ? sz_primary : sz_secondary);
736+
return app_max_sectors(state) * sector_sz_primary;
742737
}
743738

744739
/* Compute the total size of the given image. Includes the size of the TLVs. */

0 commit comments

Comments
 (0)