@@ -302,66 +302,37 @@ uint32_t boot_status_internal_off(const struct boot_status *bs, int elem_sz)
302
302
return off ;
303
303
}
304
304
305
- static int app_max_sectors (struct boot_loader_state * state )
306
- {
307
- uint32_t sz = 0 ;
308
- uint32_t sector_sz ;
309
- uint32_t trailer_sz ;
310
- uint32_t available_sectors_pri ;
311
- uint32_t available_sectors_sec ;
312
- uint32_t trailer_sectors = 0 ;
313
-
314
- sector_sz = boot_img_sector_size (state , BOOT_PRIMARY_SLOT , 0 );
315
- trailer_sz = boot_trailer_sz (BOOT_WRITE_SZ (state ));
316
-
317
- while (1 ) {
318
- sz += sector_sz ;
319
- ++ trailer_sectors ;
320
-
321
- if (sz >= trailer_sz ) {
322
- break ;
323
- }
324
- }
325
-
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 );
330
- }
331
-
332
305
int boot_slots_compatible (struct boot_loader_state * state )
333
306
{
334
307
size_t num_sectors_pri ;
335
308
size_t num_sectors_sec ;
336
309
size_t sector_sz_pri = 0 ;
337
310
size_t sector_sz_sec = 0 ;
338
311
size_t i ;
339
- size_t num_usable_sectors ;
340
312
341
313
num_sectors_pri = boot_img_num_sectors (state , BOOT_PRIMARY_SLOT );
342
314
num_sectors_sec = boot_img_num_sectors (state , BOOT_SECONDARY_SLOT );
343
- num_usable_sectors = app_max_sectors (state );
344
315
345
316
if (num_sectors_pri != num_sectors_sec &&
346
- (num_sectors_pri + 1 ) != num_sectors_sec &&
347
- num_usable_sectors != (num_sectors_sec - 1 )) {
317
+ (num_sectors_pri + 1 ) != num_sectors_sec ) {
348
318
BOOT_LOG_WRN ("Cannot upgrade: not a compatible amount of sectors" );
349
319
BOOT_LOG_DBG ("slot0 sectors: %d, slot1 sectors: %d, usable sectors: %d" ,
350
320
(int )num_sectors_pri , (int )num_sectors_sec ,
351
- (int )(num_usable_sectors ));
321
+ (int )(num_sectors_sec - 1 ));
352
322
return 0 ;
353
323
} else if (num_sectors_pri > BOOT_MAX_IMG_SECTORS ) {
354
324
BOOT_LOG_WRN ("Cannot upgrade: more sectors than allowed" );
355
325
return 0 ;
356
326
}
357
327
358
- if ((num_usable_sectors + 1 ) != num_sectors_sec ) {
328
+ /* Optimal says secondary has one more than primary. Always. Both have trailers. */
329
+ if ((num_sectors_pri + 1 ) != num_sectors_sec ) {
359
330
BOOT_LOG_DBG ("Non-optimal sector distribution, slot0 has %d usable sectors "
360
- "but slot1 has %d usable sectors" , (int )(num_usable_sectors ),
331
+ "but slot1 has %d usable sectors" , (int )(num_sectors_pri ),
361
332
((int )num_sectors_sec - 1 ));
362
333
}
363
334
364
- for (i = 0 ; i < num_usable_sectors ; i ++ ) {
335
+ for (i = 0 ; i < ( num_sectors_sec - 1 ) ; i ++ ) {
365
336
sector_sz_pri = boot_img_sector_size (state , BOOT_PRIMARY_SLOT , i );
366
337
sector_sz_sec = boot_img_sector_size (state , BOOT_SECONDARY_SLOT , i );
367
338
@@ -417,7 +388,6 @@ int swap_status_source(struct boot_loader_state *state)
417
388
struct boot_swap_state state_primary_slot ;
418
389
struct boot_swap_state state_secondary_slot ;
419
390
int rc ;
420
- uint8_t source ;
421
391
uint8_t image_index ;
422
392
423
393
#if (BOOT_IMAGE_NUMBER == 1 )
@@ -439,10 +409,8 @@ int swap_status_source(struct boot_loader_state *state)
439
409
state_primary_slot .copy_done == BOOT_FLAG_UNSET &&
440
410
state_secondary_slot .magic != BOOT_MAGIC_GOOD ) {
441
411
442
- source = BOOT_STATUS_SOURCE_PRIMARY_SLOT ;
443
-
444
412
BOOT_LOG_INF ("Boot source: primary slot" );
445
- return source ;
413
+ return BOOT_STATUS_SOURCE_PRIMARY_SLOT ;
446
414
}
447
415
448
416
BOOT_LOG_INF ("Boot source: none" );
@@ -729,11 +697,23 @@ void swap_run(struct boot_loader_state *state, struct boot_status *bs,
729
697
730
698
int app_max_size (struct boot_loader_state * state )
731
699
{
732
- uint32_t sector_sz_primary ;
700
+ uint32_t available_pri_sz ;
701
+ uint32_t available_sec_sz ;
702
+
703
+ size_t trailer_sz = boot_trailer_sz (BOOT_WRITE_SZ (state ));
704
+ size_t sector_sz = boot_img_sector_size (state , BOOT_PRIMARY_SLOT , 0 );
705
+ size_t padding_sz = sector_sz ;
706
+
707
+ /* The trailer size needs to be sector-aligned */
708
+ trailer_sz = ALIGN_UP (trailer_sz , sector_sz );
733
709
734
- sector_sz_primary = boot_img_sector_size (state , BOOT_PRIMARY_SLOT , 0 );
710
+ /* The slot whose size is used to compute the maximum image size must be the one containing the
711
+ * padding required for the swap.
712
+ */
713
+ available_pri_sz = boot_img_num_sectors (state , BOOT_PRIMARY_SLOT ) * sector_sz - trailer_sz ;
714
+ available_sec_sz = boot_img_num_sectors (state , BOOT_SECONDARY_SLOT ) * sector_sz - trailer_sz - padding_sz ;
735
715
736
- return app_max_sectors ( state ) * sector_sz_primary ;
716
+ return ( available_pri_sz < available_sec_sz ? available_pri_sz : available_sec_sz ) ;
737
717
}
738
718
739
719
/* Compute the total size of the given image. Includes the size of the TLVs. */
0 commit comments