@@ -52,13 +52,15 @@ BOOT_LOG_MODULE_DECLARE(mcuboot);
52
52
/* Currently only used by imgmgr */
53
53
int boot_current_slot ;
54
54
55
+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
55
56
#if (!defined(MCUBOOT_DIRECT_XIP ) && !defined(MCUBOOT_RAM_LOAD )) || \
56
57
defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
57
58
/* Used for holding static buffers in multiple functions to work around issues
58
59
* in older versions of gcc (e.g. 4.8.4)
59
60
*/
60
61
static struct boot_sector_buffer sector_buffers ;
61
62
#endif
63
+ #endif /* !defined(MCUBOOT_LOGICAL_SECTOR_SIZE) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0 */
62
64
63
65
/**
64
66
* @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
711
713
712
714
#if (!defined(MCUBOOT_DIRECT_XIP ) && !defined(MCUBOOT_RAM_LOAD )) || \
713
715
defined(MCUBOOT_SERIAL_IMG_GRP_SLOT_INFO )
716
+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
714
717
int
715
718
boot_initialize_area (struct boot_loader_state * state , int flash_area )
716
719
{
@@ -751,6 +754,112 @@ boot_initialize_area(struct boot_loader_state *state, int flash_area)
751
754
return 0 ;
752
755
}
753
756
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
+
754
863
static uint32_t
755
864
boot_write_sz (struct boot_loader_state * state )
756
865
{
@@ -780,12 +889,13 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
780
889
uint8_t image_index ;
781
890
int rc ;
782
891
892
+ image_index = BOOT_CURR_IMG (state );
893
+
894
+ #if !defined(MCUBOOT_LOGICAL_SECTOR_SIZE ) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0
783
895
if (sectors == NULL ) {
784
896
sectors = & sector_buffers ;
785
897
}
786
898
787
- image_index = BOOT_CURR_IMG (state );
788
-
789
899
BOOT_IMG (state , BOOT_PRIMARY_SLOT ).sectors =
790
900
sectors -> primary [image_index ];
791
901
#if BOOT_NUM_SLOTS > 1
@@ -795,6 +905,9 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
795
905
state -> scratch .sectors = sectors -> scratch ;
796
906
#endif
797
907
#endif
908
+ #else
909
+ (void )sectors ;
910
+ #endif /* !defined(MCUBOOT_LOGICAL_SECTOR_SIZE) || MCUBOOT_LOGICAL_SECTOR_SIZE == 0 */
798
911
799
912
rc = boot_initialize_area (state , FLASH_AREA_IMAGE_PRIMARY (image_index ));
800
913
if (rc != 0 ) {
@@ -818,6 +931,29 @@ boot_read_sectors(struct boot_loader_state *state, struct boot_sector_buffer *se
818
931
819
932
BOOT_WRITE_SZ (state ) = boot_write_sz (state );
820
933
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
+
821
957
return 0 ;
822
958
}
823
959
#endif
0 commit comments