@@ -301,6 +301,93 @@ boot_version_cmp(const struct image_version *ver1,
301
301
}
302
302
#endif
303
303
304
+ #if (!defined(MCUBOOT_DIRECT_XIP ) && !defined(MCUBOOT_RAM_LOAD )) || \
305
+ defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
306
+ #if !defined(__BOOTSIM__ )
307
+ static void boot_get_sector_buffers (struct sector_buffer_t * buffers )
308
+ {
309
+ /* The array of slot sectors are defined here (as opposed to file scope) so
310
+ * that they don't get allocated for non-boot-loader apps. This is
311
+ * necessary because the gcc option "-fdata-sections" doesn't seem to have
312
+ * any effect in older gcc versions (e.g., 4.8.4).
313
+ */
314
+ static boot_sector_t primary_slot_sectors [BOOT_IMAGE_NUMBER ][BOOT_MAX_IMG_SECTORS ];
315
+ static boot_sector_t secondary_slot_sectors [BOOT_IMAGE_NUMBER ][BOOT_MAX_IMG_SECTORS ];
316
+ #if MCUBOOT_SWAP_USING_SCRATCH
317
+ static boot_sector_t scratch_sectors [BOOT_MAX_IMG_SECTORS ];
318
+ #endif
319
+
320
+ buffers -> primary = (boot_sector_t * )& primary_slot_sectors ;
321
+ buffers -> secondary = (boot_sector_t * )& secondary_slot_sectors ;
322
+ #if MCUBOOT_SWAP_USING_SCRATCH
323
+ buffers -> scratch = (boot_sector_t * )& scratch_sectors ;
324
+ #endif
325
+ }
326
+ #endif
327
+
328
+ static int
329
+ boot_initialize_area (struct boot_loader_state * state , int flash_area )
330
+ {
331
+ uint32_t num_sectors = BOOT_MAX_IMG_SECTORS ;
332
+ boot_sector_t * out_sectors ;
333
+ uint32_t * out_num_sectors ;
334
+ int rc ;
335
+
336
+ num_sectors = BOOT_MAX_IMG_SECTORS ;
337
+
338
+ if (flash_area == FLASH_AREA_IMAGE_PRIMARY (BOOT_CURR_IMG (state ))) {
339
+ out_sectors = BOOT_IMG (state , BOOT_PRIMARY_SLOT ).sectors ;
340
+ out_num_sectors = & BOOT_IMG (state , BOOT_PRIMARY_SLOT ).num_sectors ;
341
+ } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY (BOOT_CURR_IMG (state ))) {
342
+ out_sectors = BOOT_IMG (state , BOOT_SECONDARY_SLOT ).sectors ;
343
+ out_num_sectors = & BOOT_IMG (state , BOOT_SECONDARY_SLOT ).num_sectors ;
344
+ #if MCUBOOT_SWAP_USING_SCRATCH
345
+ } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH ) {
346
+ out_sectors = state -> scratch .sectors ;
347
+ out_num_sectors = & state -> scratch .num_sectors ;
348
+ #endif
349
+ } else {
350
+ return BOOT_EFLASH ;
351
+ }
352
+
353
+ #ifdef MCUBOOT_USE_FLASH_AREA_GET_SECTORS
354
+ rc = flash_area_get_sectors (flash_area , & num_sectors , out_sectors );
355
+ #else
356
+ _Static_assert (sizeof (int ) <= sizeof (uint32_t ), "Fix needed" );
357
+ rc = flash_area_to_sectors (flash_area , (int * )& num_sectors , out_sectors );
358
+ #endif /* defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */
359
+ if (rc != 0 ) {
360
+ return rc ;
361
+ }
362
+ * out_num_sectors = num_sectors ;
363
+ return 0 ;
364
+ }
365
+ #endif
366
+
367
+ #if defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
368
+ static int
369
+ boot_read_sectors_recovery (struct boot_loader_state * state )
370
+ {
371
+ uint8_t image_index ;
372
+ int rc ;
373
+
374
+ image_index = BOOT_CURR_IMG (state );
375
+
376
+ rc = boot_initialize_area (state , FLASH_AREA_IMAGE_PRIMARY (image_index ));
377
+ if (rc != 0 ) {
378
+ return BOOT_EFLASH ;
379
+ }
380
+
381
+ rc = boot_initialize_area (state , FLASH_AREA_IMAGE_SECONDARY (image_index ));
382
+ if (rc != 0 ) {
383
+ /* We need to differentiate from the primary image issue */
384
+ return BOOT_EFLASH_SEC ;
385
+ }
386
+
387
+ return 0 ;
388
+ }
389
+ #endif
390
+
304
391
305
392
#if (BOOT_IMAGE_NUMBER > 1 )
306
393
@@ -617,44 +704,6 @@ boot_write_sz(struct boot_loader_state *state)
617
704
return elem_sz ;
618
705
}
619
706
620
- static int
621
- boot_initialize_area (struct boot_loader_state * state , int flash_area )
622
- {
623
- uint32_t num_sectors = BOOT_MAX_IMG_SECTORS ;
624
- boot_sector_t * out_sectors ;
625
- uint32_t * out_num_sectors ;
626
- int rc ;
627
-
628
- num_sectors = BOOT_MAX_IMG_SECTORS ;
629
-
630
- if (flash_area == FLASH_AREA_IMAGE_PRIMARY (BOOT_CURR_IMG (state ))) {
631
- out_sectors = BOOT_IMG (state , BOOT_PRIMARY_SLOT ).sectors ;
632
- out_num_sectors = & BOOT_IMG (state , BOOT_PRIMARY_SLOT ).num_sectors ;
633
- } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY (BOOT_CURR_IMG (state ))) {
634
- out_sectors = BOOT_IMG (state , BOOT_SECONDARY_SLOT ).sectors ;
635
- out_num_sectors = & BOOT_IMG (state , BOOT_SECONDARY_SLOT ).num_sectors ;
636
- #if MCUBOOT_SWAP_USING_SCRATCH
637
- } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH ) {
638
- out_sectors = state -> scratch .sectors ;
639
- out_num_sectors = & state -> scratch .num_sectors ;
640
- #endif
641
- } else {
642
- return BOOT_EFLASH ;
643
- }
644
-
645
- #ifdef MCUBOOT_USE_FLASH_AREA_GET_SECTORS
646
- rc = flash_area_get_sectors (flash_area , & num_sectors , out_sectors );
647
- #else
648
- _Static_assert (sizeof (int ) <= sizeof (uint32_t ), "Fix needed" );
649
- rc = flash_area_to_sectors (flash_area , (int * )& num_sectors , out_sectors );
650
- #endif /* defined(MCUBOOT_USE_FLASH_AREA_GET_SECTORS) */
651
- if (rc != 0 ) {
652
- return rc ;
653
- }
654
- * out_num_sectors = num_sectors ;
655
- return 0 ;
656
- }
657
-
658
707
/**
659
708
* Determines the sector layout of both image slots and the scratch area.
660
709
* This information is necessary for calculating the number of bytes to erase
@@ -2155,28 +2204,6 @@ check_downgrade_prevention(struct boot_loader_state *state)
2155
2204
#endif
2156
2205
}
2157
2206
2158
- #if !defined(__BOOTSIM__ )
2159
- static void boot_get_sector_buffers (struct sector_buffer_t * buffers )
2160
- {
2161
- /* The array of slot sectors are defined here (as opposed to file scope) so
2162
- * that they don't get allocated for non-boot-loader apps. This is
2163
- * necessary because the gcc option "-fdata-sections" doesn't seem to have
2164
- * any effect in older gcc versions (e.g., 4.8.4).
2165
- */
2166
- static boot_sector_t primary_slot_sectors [BOOT_IMAGE_NUMBER ][BOOT_MAX_IMG_SECTORS ];
2167
- static boot_sector_t secondary_slot_sectors [BOOT_IMAGE_NUMBER ][BOOT_MAX_IMG_SECTORS ];
2168
- #if MCUBOOT_SWAP_USING_SCRATCH
2169
- static boot_sector_t scratch_sectors [BOOT_MAX_IMG_SECTORS ];
2170
- #endif
2171
-
2172
- buffers -> primary = (boot_sector_t * )& primary_slot_sectors ;
2173
- buffers -> secondary = (boot_sector_t * )& secondary_slot_sectors ;
2174
- #if MCUBOOT_SWAP_USING_SCRATCH
2175
- buffers -> scratch = (boot_sector_t * )& scratch_sectors ;
2176
- #endif
2177
- }
2178
- #endif
2179
-
2180
2207
fih_ret
2181
2208
context_boot_go (struct boot_loader_state * state , struct boot_rsp * rsp )
2182
2209
{
@@ -3486,7 +3513,7 @@ static void boot_fetch_slot_state_sizes(void)
3486
3513
#endif
3487
3514
3488
3515
/* Determine the sector layout of the image slots and scratch area. */
3489
- rc = boot_read_sectors (& boot_data );
3516
+ rc = boot_read_sectors_recovery (& boot_data );
3490
3517
3491
3518
if (rc == 0 ) {
3492
3519
max_size = app_max_size (& boot_data );
0 commit comments