@@ -302,66 +302,37 @@ uint32_t boot_status_internal_off(const struct boot_status *bs, int elem_sz)
302302 return off ;
303303}
304304
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-
332305int boot_slots_compatible (struct boot_loader_state * state )
333306{
334307 size_t num_sectors_pri ;
335308 size_t num_sectors_sec ;
336309 size_t sector_sz_pri = 0 ;
337310 size_t sector_sz_sec = 0 ;
338311 size_t i ;
339- size_t num_usable_sectors ;
340312
341313 num_sectors_pri = boot_img_num_sectors (state , BOOT_PRIMARY_SLOT );
342314 num_sectors_sec = boot_img_num_sectors (state , BOOT_SECONDARY_SLOT );
343- num_usable_sectors = app_max_sectors (state );
344315
345316 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 ) {
348318 BOOT_LOG_WRN ("Cannot upgrade: not a compatible amount of sectors" );
349319 BOOT_LOG_DBG ("slot0 sectors: %d, slot1 sectors: %d, usable sectors: %d" ,
350320 (int )num_sectors_pri , (int )num_sectors_sec ,
351- (int )(num_usable_sectors ));
321+ (int )(num_sectors_sec - 1 ));
352322 return 0 ;
353323 } else if (num_sectors_pri > BOOT_MAX_IMG_SECTORS ) {
354324 BOOT_LOG_WRN ("Cannot upgrade: more sectors than allowed" );
355325 return 0 ;
356326 }
357327
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 ) {
359330 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 ),
361332 ((int )num_sectors_sec - 1 ));
362333 }
363334
364- for (i = 0 ; i < num_usable_sectors ; i ++ ) {
335+ for (i = 0 ; i < ( num_sectors_sec - 1 ) ; i ++ ) {
365336 sector_sz_pri = boot_img_sector_size (state , BOOT_PRIMARY_SLOT , i );
366337 sector_sz_sec = boot_img_sector_size (state , BOOT_SECONDARY_SLOT , i );
367338
@@ -417,7 +388,6 @@ int swap_status_source(struct boot_loader_state *state)
417388 struct boot_swap_state state_primary_slot ;
418389 struct boot_swap_state state_secondary_slot ;
419390 int rc ;
420- uint8_t source ;
421391 uint8_t image_index ;
422392
423393#if (BOOT_IMAGE_NUMBER == 1 )
@@ -439,10 +409,8 @@ int swap_status_source(struct boot_loader_state *state)
439409 state_primary_slot .copy_done == BOOT_FLAG_UNSET &&
440410 state_secondary_slot .magic != BOOT_MAGIC_GOOD ) {
441411
442- source = BOOT_STATUS_SOURCE_PRIMARY_SLOT ;
443-
444412 BOOT_LOG_INF ("Boot source: primary slot" );
445- return source ;
413+ return BOOT_STATUS_SOURCE_PRIMARY_SLOT ;
446414 }
447415
448416 BOOT_LOG_INF ("Boot source: none" );
@@ -729,11 +697,23 @@ void swap_run(struct boot_loader_state *state, struct boot_status *bs,
729697
730698int app_max_size (struct boot_loader_state * state )
731699{
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 );
733709
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 ;
735715
736- return app_max_sectors ( state ) * sector_sz_primary ;
716+ return ( available_pri_sz < available_sec_sz ? available_pri_sz : available_sec_sz ) ;
737717}
738718
739719/* Compute the total size of the given image. Includes the size of the TLVs. */
0 commit comments