@@ -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
329332int 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,
726730int 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