|
42 | 42 | #ifdef MCUBOOT_ENC_IMAGES
|
43 | 43 | #include "bootutil/enc_key.h"
|
44 | 44 | #endif
|
| 45 | +#if defined(MCUBOOT_SWAP_USING_MOVE) || defined(MCUBOOT_SWAP_USING_OFFSET) || \ |
| 46 | + defined(MCUBOOT_SWAP_USING_SCRATCH) |
| 47 | +#include "swap_priv.h" |
| 48 | +#endif |
45 | 49 |
|
46 | 50 | #if defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO) || defined(MCUBOOT_SWAP_USING_SCRATCH)
|
47 | 51 | #include "swap_priv.h"
|
@@ -240,8 +244,7 @@ int boot_header_scramble_off_sz(const struct flash_area *fa, int slot, size_t *o
|
240 | 244 | * status during the swap of the last sector from primary/secondary (which
|
241 | 245 | * is the first swap operation) and thus only requires space for one swap.
|
242 | 246 | */
|
243 |
| -static uint32_t |
244 |
| -boot_scratch_trailer_sz(uint32_t min_write_sz) |
| 247 | +uint32_t boot_scratch_trailer_sz(uint32_t min_write_sz) |
245 | 248 | {
|
246 | 249 | return boot_status_entry_sz(min_write_sz) + boot_trailer_info_sz();
|
247 | 250 | }
|
@@ -427,106 +430,17 @@ boot_write_enc_key(const struct flash_area *fap, uint8_t slot,
|
427 | 430 | }
|
428 | 431 | #endif
|
429 | 432 |
|
430 |
| -#ifdef MCUBOOT_SWAP_USING_SCRATCH |
431 |
| -size_t |
432 |
| -boot_get_first_trailer_sector(struct boot_loader_state *state, size_t slot, size_t trailer_sz) |
433 |
| -{ |
434 |
| - size_t first_trailer_sector = boot_img_num_sectors(state, slot) - 1; |
435 |
| - size_t sector_sz = boot_img_sector_size(state, slot, first_trailer_sector); |
436 |
| - size_t trailer_sector_sz = sector_sz; |
437 |
| - |
438 |
| - while (trailer_sector_sz < trailer_sz) { |
439 |
| - /* Consider that the image trailer may span across sectors of different sizes */ |
440 |
| - --first_trailer_sector; |
441 |
| - sector_sz = boot_img_sector_size(state, slot, first_trailer_sector); |
442 |
| - |
443 |
| - trailer_sector_sz += sector_sz; |
444 |
| - } |
445 |
| - |
446 |
| - return first_trailer_sector; |
447 |
| -} |
448 |
| - |
449 |
| -/** |
450 |
| - * Returns the offset to the end of the first sector of a given slot that holds image trailer data. |
451 |
| - * |
452 |
| - * @param state Current bootloader's state. |
453 |
| - * @param slot The index of the slot to consider. |
454 |
| - * @param trailer_sz The size of the trailer, in bytes. |
455 |
| - * |
456 |
| - * @return The offset to the end of the first sector of the slot that holds image trailer data. |
457 |
| - */ |
458 |
| -static uint32_t |
459 |
| -get_first_trailer_sector_end_off(struct boot_loader_state *state, size_t slot, size_t trailer_sz) |
460 |
| -{ |
461 |
| - size_t first_trailer_sector = boot_get_first_trailer_sector(state, slot, trailer_sz); |
462 |
| - |
463 |
| - return boot_img_sector_off(state, slot, first_trailer_sector) + |
464 |
| - boot_img_sector_size(state, slot, first_trailer_sector); |
465 |
| -} |
466 |
| -#endif /* MCUBOOT_SWAP_USING_SCRATCH */ |
467 |
| - |
468 | 433 | uint32_t bootutil_max_image_size(struct boot_loader_state *state, const struct flash_area *fap)
|
469 | 434 | {
|
470 | 435 | #if defined(MCUBOOT_SINGLE_APPLICATION_SLOT) || \
|
471 | 436 | defined(MCUBOOT_FIRMWARE_LOADER) || \
|
472 | 437 | defined(MCUBOOT_SINGLE_APPLICATION_SLOT_RAM_LOAD)
|
473 | 438 | (void) state;
|
474 | 439 | return boot_status_off(fap);
|
475 |
| -#elif defined(MCUBOOT_SWAP_USING_SCRATCH) |
476 |
| - size_t slot_trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state)); |
477 |
| - size_t slot_trailer_off = flash_area_get_size(fap) - slot_trailer_sz; |
478 |
| - |
479 |
| - /* If the trailer doesn't fit in the last sector of the primary or secondary slot, some padding |
480 |
| - * might have to be inserted between the end of the firmware image and the beginning of the |
481 |
| - * trailer to ensure there is enough space for the trailer in the scratch area when the last |
482 |
| - * sector of the secondary will be copied to the scratch area. |
483 |
| - * |
484 |
| - * The value of the padding depends on the amount of trailer data that is contained in the first |
485 |
| - * trailer containing part of the trailer in the primary and secondary slot. |
486 |
| - */ |
487 |
| - size_t trailer_sector_primary_end_off = |
488 |
| - get_first_trailer_sector_end_off(state, BOOT_PRIMARY_SLOT, slot_trailer_sz); |
489 |
| - size_t trailer_sector_secondary_end_off = |
490 |
| - get_first_trailer_sector_end_off(state, BOOT_SECONDARY_SLOT, slot_trailer_sz); |
491 |
| - |
492 |
| - size_t trailer_sz_in_first_sector; |
493 |
| - |
494 |
| - if (trailer_sector_primary_end_off > trailer_sector_secondary_end_off) { |
495 |
| - trailer_sz_in_first_sector = trailer_sector_primary_end_off - slot_trailer_off; |
496 |
| - } else { |
497 |
| - trailer_sz_in_first_sector = trailer_sector_secondary_end_off - slot_trailer_off; |
498 |
| - } |
499 |
| - |
500 |
| - size_t trailer_padding = 0; |
501 |
| - size_t scratch_trailer_sz = boot_scratch_trailer_sz(BOOT_WRITE_SZ(state)); |
502 |
| - |
503 |
| - if (scratch_trailer_sz > trailer_sz_in_first_sector) { |
504 |
| - trailer_padding = scratch_trailer_sz - trailer_sz_in_first_sector; |
505 |
| - } |
506 |
| - |
507 |
| - return slot_trailer_off - trailer_padding; |
508 |
| -#elif defined(MCUBOOT_SWAP_USING_MOVE) || defined(MCUBOOT_SWAP_USING_OFFSET) |
| 440 | +#elif defined(MCUBOOT_SWAP_USING_MOVE) || defined(MCUBOOT_SWAP_USING_OFFSET) \ |
| 441 | + || defined(MCUBOOT_SWAP_USING_SCRATCH) |
509 | 442 | (void) fap;
|
510 |
| - |
511 |
| - /* The slot whose size is used to compute the maximum image size must be the one containing the |
512 |
| - * padding required for the swap. */ |
513 |
| -#ifdef MCUBOOT_SWAP_USING_MOVE |
514 |
| - size_t slot = BOOT_PRIMARY_SLOT; |
515 |
| -#else |
516 |
| - size_t slot = BOOT_SECONDARY_SLOT; |
517 |
| -#endif |
518 |
| - |
519 |
| - const struct flash_area *fap_padded_slot = BOOT_IMG_AREA(state, slot); |
520 |
| - assert(fap_padded_slot != NULL); |
521 |
| - |
522 |
| - size_t trailer_sz = boot_trailer_sz(BOOT_WRITE_SZ(state)); |
523 |
| - size_t sector_sz = boot_img_sector_size(state, slot, 0); |
524 |
| - size_t padding_sz = sector_sz; |
525 |
| - |
526 |
| - /* The trailer size needs to be sector-aligned */ |
527 |
| - trailer_sz = ALIGN_UP(trailer_sz, sector_sz); |
528 |
| - |
529 |
| - return flash_area_get_size(fap_padded_slot) - trailer_sz - padding_sz; |
| 443 | + return app_max_size(state); |
530 | 444 | #elif defined(MCUBOOT_OVERWRITE_ONLY)
|
531 | 445 | (void) state;
|
532 | 446 | return boot_swap_info_off(fap);
|
|
0 commit comments