@@ -52,13 +52,15 @@ BOOT_LOG_MODULE_DECLARE(mcuboot);
5252/* Currently only used by imgmgr */
5353int boot_current_slot ;
5454
55+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
5556#if (!defined(MCUBOOT_DIRECT_XIP ) && !defined(MCUBOOT_RAM_LOAD )) || \
5657defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
5758/* Used for holding static buffers in multiple functions to work around issues
5859 * in older versions of gcc (e.g. 4.8.4)
5960 */
6061static struct boot_sector_buffer sector_buffers ;
6162#endif
63+ #endif /* !defined(MCUBOOT_LOGICAL_SECTOR_SIZE) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0 */
6264
6365/**
6466 * @brief Determine if the data at two memory addresses is equal
@@ -711,6 +713,7 @@ boot_erase_region(const struct flash_area *fa, uint32_t off, uint32_t size, bool
711713
712714#if (!defined(MCUBOOT_DIRECT_XIP ) && !defined(MCUBOOT_RAM_LOAD )) || \
713715defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
716+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
714717int
715718boot_initialize_area (struct boot_loader_state * state , int flash_area )
716719{
@@ -751,6 +754,112 @@ boot_initialize_area(struct boot_loader_state *state, int flash_area)
751754 return 0 ;
752755}
753756
757+ #else /* defined(MCUBOOT_LOGICAL_SECTOR_SIZE) && MCUBOOT_LOGICAL_SECTOR_SIZE != 0 */
758+ #if defined(MCUBOOT_LOGICAL_SECTOR_VALIDATION )
759+ /* Validation can only run once all flash areas are open and pointers to
760+ * flash area objects are stored in state.
761+ */
762+ static int
763+ boot_validate_logical_sectors (const struct boot_loader_state * state , int faid , const struct flash_area * fa )
764+ {
765+ uint32_t num_sectors = BOOT_MAX_IMG_SECTORS ;
766+ size_t slot_size ;
767+ size_t slot_off ;
768+ size_t sect_off = 0 ;
769+ int rc ;
770+ int final_rc = 0 ;
771+
772+ assert (fa != NULL );
773+ assert (faid != 0 );
774+
775+ slot_off = flash_area_get_off (fa );
776+ slot_size = flash_area_get_size (fa );
777+
778+
779+ /* Go till all validations are complete or we face issue that does not allow
780+ * to proceede with further tests.
781+ */
782+ BOOT_LOG_INF ("boot_validate_logical_sectors: validating flash area %p" , fa );
783+ BOOT_LOG_INF ("boot_validate_logical_sectors: MCUBOOT_LOGICAL_SECTOR_SIZE == 0x%x" ,
784+ MCUBOOT_LOGICAL_SECTOR_SIZE );
785+ BOOT_LOG_INF ("boot_validate_logical_sectors: slot offset == 0x%x" , slot_off );
786+ if (slot_size != 0 ) {
787+ BOOT_LOG_INF ("boot_validate_logical_sectors: slot size == 0x%x" , slot_size );
788+ } else {
789+ BOOT_LOG_ERR ("boot_validate_logical_sectors: 0 size slot" );
790+ return BOOT_EFLASH ;
791+ }
792+
793+ BOOT_LOG_INF ("boot_validate_logical_sectors: max %d logical sectors" ,
794+ slot_size / MCUBOOT_LOGICAL_SECTOR_SIZE );
795+
796+ if (slot_off % MCUBOOT_LOGICAL_SECTOR_SIZE ) {
797+ BOOT_LOG_ERR ("boot_validate_logical_sectors: area offset not aligned" );
798+ final_rc = BOOT_EFLASH ;
799+ }
800+
801+ if (slot_size % MCUBOOT_LOGICAL_SECTOR_SIZE ) {
802+ BOOT_LOG_ERR ("boot_validate_logical_sectors: area size not aligned" );
803+ final_rc = BOOT_EFLASH ;
804+ }
805+
806+ /* Check all hardware specific pages against erase pages of a device */
807+ for (size_t i = 0 ; i < num_sectors ; i ++ ) {
808+ struct flash_sector fas ;
809+
810+ MCUBOOT_WATCHDOG_FEED ();
811+
812+ BOOT_LOG_INF ("boot_validate_logical_sectors: page 0x%x:0x%x " , slot_off , sect_off );
813+ rc = flash_area_get_sector (fa , sect_off , & fas );
814+ if (rc < 0 ) {
815+ BOOT_LOG_ERR ("boot_validate_logical_sectors: query err %d" , rc );
816+ final_rc = BOOT_EFLASH ;
817+ continue ;
818+ }
819+
820+
821+ if (flash_sector_get_off (& fas ) % MCUBOOT_LOGICAL_SECTOR_SIZE ) {
822+ BOOT_LOG_ERR ("boot_validate_logical_sectors: misaligned offset" );
823+ final_rc = BOOT_EFLASH ;
824+ }
825+
826+ sect_off += flash_sector_get_size (& fas );
827+ }
828+
829+ BOOT_LOG_INF ("boot_validate_logical_sectors: done %d" , final_rc );
830+
831+ return final_rc ;
832+ }
833+ #endif /* MCUBOOT_LOGICAL_SECTOR_VALIDATION */
834+
835+ static int
836+ boot_initialize_area (struct boot_loader_state * state , int flash_area )
837+ {
838+ size_t area_size ;
839+ uint32_t * out_num_sectors ;
840+
841+ if (flash_area == FLASH_AREA_IMAGE_PRIMARY (BOOT_CURR_IMG (state ))) {
842+ area_size = flash_area_get_size (BOOT_IMG_AREA (state , BOOT_PRIMARY_SLOT ));
843+ out_num_sectors = & BOOT_IMG (state , BOOT_PRIMARY_SLOT ).num_sectors ;
844+ } else if (flash_area == FLASH_AREA_IMAGE_SECONDARY (BOOT_CURR_IMG (state ))) {
845+ area_size = flash_area_get_size (BOOT_IMG_AREA (state , BOOT_SECONDARY_SLOT ));
846+ out_num_sectors = & BOOT_IMG (state , BOOT_SECONDARY_SLOT ).num_sectors ;
847+ #if MCUBOOT_SWAP_USING_SCRATCH
848+ } else if (flash_area == FLASH_AREA_IMAGE_SCRATCH ) {
849+ area_size = flash_area_get_size (state -> scratch .area );
850+ out_num_sectors = & state -> scratch .num_sectors ;
851+ #endif
852+ } else {
853+ return BOOT_EFLASH ;
854+ }
855+
856+ * out_num_sectors = area_size / MCUBOOT_LOGICAL_SECTOR_SIZE ;
857+
858+ return 0 ;
859+ }
860+
861+ #endif /* defined(MCUBOOT_LOGICAL_SECTOR_SIZE) && MCUBOOT_LOGICAL_SECTOR_SIZE != 0 */
862+
754863static uint32_t
755864boot_write_sz (struct boot_loader_state * state )
756865{
@@ -780,12 +889,13 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
780889 uint8_t image_index ;
781890 int rc ;
782891
892+ image_index = BOOT_CURR_IMG (state );
893+
894+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
783895 if (sectors == NULL ) {
784896 sectors = & sector_buffers ;
785897 }
786898
787- image_index = BOOT_CURR_IMG (state );
788-
789899 BOOT_IMG (state , BOOT_PRIMARY_SLOT ).sectors =
790900 sectors -> primary [image_index ];
791901#if BOOT_NUM_SLOTS > 1
@@ -795,6 +905,9 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
795905 state -> scratch .sectors = sectors -> scratch ;
796906#endif
797907#endif
908+ #else
909+ (void )sectors ;
910+ #endif /* !defined(MCUBOOT_LOGICAL_SECTOR_SIZE) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0 */
798911
799912 rc = boot_initialize_area (state , FLASH_AREA_IMAGE_PRIMARY (image_index ));
800913 if (rc != 0 ) {
@@ -818,6 +931,29 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
818931
819932 BOOT_WRITE_SZ (state ) = boot_write_sz (state );
820933
934+ #if defined(MCUBOOT_LOGICAL_SECTOR_VALIDATION )
935+ BOOT_LOG_INF ("boot_read_sectors: validate image %d slots" , image_index );
936+ BOOT_LOG_INF ("boot_read_sectors: BOOT_PRIMARY_SLOT" );
937+ if (boot_validate_logical_sectors (state , FLASH_AREA_IMAGE_PRIMARY (image_index ),
938+ BOOT_IMG_AREA (state , BOOT_PRIMARY_SLOT )) != 0 ) {
939+ rc = BOOT_EFLASH ;
940+ }
941+
942+ BOOT_LOG_INF ("boot_read_sectors: BOOT_SECONDARY_SLOT" );
943+ if (boot_validate_logical_sectors (state , FLASH_AREA_IMAGE_SECONDARY (image_index ),
944+ BOOT_IMG_AREA (state , BOOT_SECONDARY_SLOT )) != 0 ) {
945+ rc = BOOT_EFLASH_SEC ;
946+ }
947+
948+ #if MCUBOOT_SWAP_USING_SCRATCH
949+ BOOT_LOG_INF ("boot_read_sectors: SCRATCH" );
950+ if (boot_validate_logical_sectors (state , FLASH_AREA_IMAGE_SCRATCH ,
951+ state -> scratch .area ) != 0 ) {
952+ rc = BOOT_EFLASH ;
953+ }
954+ #endif /* MCUBOOT_SWAP_USING_SCRATCH */
955+ #endif /* defined(MCUBOOT_LOGICAL_SECTOR_VALIDATION) */
956+
821957 return 0 ;
822958}
823959#endif
0 commit comments