@@ -45,6 +45,7 @@ uint8_t *ut_get_endpart(void);
4545
4646static int locked = 0 ;
4747static int ext_locked = 0 ;
48+ static int ext_write_count = 0 ;
4849
4950void hal_init (void )
5051{
@@ -91,6 +92,19 @@ uint8_t *ut_get_endpart(void)
9192 return flash + WOLFBOOT_PARTITION_SIZE ;
9293}
9394
95+ static void reset_flash_state (void )
96+ {
97+ memset (flash , 0xFF , sizeof (flash ));
98+ locked = 0 ;
99+ ext_locked = 0 ;
100+ ext_write_count = 0 ;
101+ }
102+
103+ static uint32_t update_sector_flag_addr (uint32_t pos )
104+ {
105+ return PART_UPDATE_ENDFLAGS - (sizeof (uint32_t ) + 2 + pos );
106+ }
107+
94108/* Mocks for ext_flash_read, ext_flash_write, and ext_flash_erase functions */
95109int ext_flash_read (uintptr_t address , uint8_t * data , int len ) {
96110 printf ("Called ext_flash_read %p %p %d\n" , address , data , len );
@@ -111,6 +125,7 @@ int ext_flash_write(uintptr_t address, const uint8_t *data, int len) {
111125
112126 /* Copy the data from the input buffer to the flash memory */
113127 memcpy (& flash [address ], data , len );
128+ ext_write_count ++ ;
114129
115130 return 0 ;
116131}
@@ -210,7 +225,40 @@ START_TEST(test_partition_flags) {
210225END_TEST
211226
212227START_TEST (test_sector_flags ) {
213-
228+ uint8_t flag = 0 ;
229+ uint32_t flag_addr = update_sector_flag_addr (0 );
230+ int writes_after_change ;
231+
232+ reset_flash_state ();
233+ flash [flag_addr ] = 0xA5 ;
234+ set_partition_magic (PART_UPDATE );
235+ ext_write_count = 0 ;
236+
237+ wolfBoot_set_update_sector_flag (0 , 0x03 );
238+ ck_assert_uint_eq (flash [flag_addr ], 0xA3 );
239+ ck_assert_int_eq (ext_write_count , 1 );
240+ ck_assert_int_eq (wolfBoot_get_update_sector_flag (0 , & flag ), 0 );
241+ ck_assert_uint_eq (flag , 0x03 );
242+ ck_assert_int_eq (wolfBoot_get_update_sector_flag (1 , & flag ), 0 );
243+ ck_assert_uint_eq (flag , 0x0A );
244+
245+ writes_after_change = ext_write_count ;
246+ wolfBoot_set_update_sector_flag (0 , 0x03 );
247+ ck_assert_int_eq (ext_write_count , writes_after_change );
248+ ck_assert_uint_eq (flash [flag_addr ], 0xA3 );
249+
250+ wolfBoot_set_update_sector_flag (1 , 0x0C );
251+ ck_assert_uint_eq (flash [flag_addr ], 0xC3 );
252+ ck_assert_int_eq (ext_write_count , writes_after_change + 1 );
253+ ck_assert_int_eq (wolfBoot_get_update_sector_flag (0 , & flag ), 0 );
254+ ck_assert_uint_eq (flag , 0x03 );
255+ ck_assert_int_eq (wolfBoot_get_update_sector_flag (1 , & flag ), 0 );
256+ ck_assert_uint_eq (flag , 0x0C );
257+
258+ writes_after_change = ext_write_count ;
259+ wolfBoot_set_update_sector_flag (1 , 0x0C );
260+ ck_assert_int_eq (ext_write_count , writes_after_change );
261+ ck_assert_uint_eq (flash [flag_addr ], 0xC3 );
214262}
215263END_TEST
216264
0 commit comments