@@ -161,6 +161,14 @@ boot_read_image_headers(struct boot_loader_state *state, bool require_all,
161161 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER && i == 0 ) {
162162 continue ;
163163 }
164+ #elif defined(LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED )
165+ /* Patch needed for NCS. The primary slot of the second image
166+ * (image 1) will not contain a valid image header until an upgrade
167+ * of mcuboot has happened (filling S1 with the new version).
168+ */
169+ if (BOOT_CURR_IMG (state ) == LEGACY_CHILD_PARENT_S0_S1_UPDATE_IMAGE_ID && i == 0 ) {
170+ continue ;
171+ }
164172#endif /* CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 */
165173 if (i > 0 && !require_all ) {
166174 return 0 ;
@@ -1157,10 +1165,13 @@ boot_validate_slot(struct boot_loader_state *state, int slot,
11571165#if defined(MCUBOOT_OVERWRITE_ONLY ) && defined(MCUBOOT_DOWNGRADE_PREVENTION )
11581166 if (slot != BOOT_PRIMARY_SLOT ) {
11591167 /* Check if version of secondary slot is sufficient */
1160-
11611168#if defined(CONFIG_SOC_NRF5340_CPUAPP ) && defined(CONFIG_NRF53_MULTI_IMAGE_UPDATE ) \
11621169 && defined(CONFIG_PCD_APP ) && defined(CONFIG_PCD_READ_NETCORE_APP_VERSION )
1170+ #if CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER != -1
11631171 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER ) {
1172+ #elif defined(LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_ENABLED)
1173+ if (BOOT_CURR_IMG (state ) == LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_IMAGE_ID ) {
1174+ #endif
11641175 rc = pcd_version_cmp_net (fap , boot_img_hdr (state , BOOT_SECONDARY_SLOT ));
11651176 } else {
11661177 rc = boot_version_cmp (
@@ -1243,12 +1254,18 @@ boot_validate_slot(struct boot_loader_state *state, int slot,
12431254 * Its flash_area hasn't got relevant boundaries.
12441255 * Therfore need to override its boundaries for the check.
12451256 */
1257+ #if CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER != -1
12461258 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_NETWORK_CORE_IMAGE_NUMBER ) {
1259+ #elif defined(LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_ENABLED)
1260+ if (BOOT_CURR_IMG (state ) == LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_IMAGE_ID ) {
1261+ #endif
12471262 min_addr = PM_CPUNET_APP_ADDRESS ;
12481263 max_addr = PM_CPUNET_APP_ADDRESS + PM_CPUNET_APP_SIZE ;
12491264 check_addresses = true;
12501265 } else
12511266#endif
1267+ #ifndef LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED
1268+ /* Sysbuild */
12521269#if CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1
12531270 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER ) {
12541271#if (CONFIG_NCS_IS_VARIANT_IMAGE )
@@ -1276,6 +1293,23 @@ boot_validate_slot(struct boot_loader_state *state, int slot,
12761293#endif
12771294 check_addresses = true;
12781295 }
1296+ #else
1297+ /* Legacy child/parent support */
1298+ if (BOOT_CURR_IMG (state ) == LEGACY_CHILD_PARENT_S0_S1_UPDATE_IMAGE_ID ) {
1299+ #if (CONFIG_NCS_IS_VARIANT_IMAGE )
1300+ min_addr = MIN (pri_fa -> fa_off , PM_S0_ADDRESS );
1301+ max_addr = MAX ((pri_fa -> fa_off + pri_fa -> fa_size ), (PM_S0_ADDRESS + PM_S0_SIZE ));
1302+ #else
1303+ min_addr = MIN (pri_fa -> fa_off , PM_S1_ADDRESS );
1304+ max_addr = MAX ((pri_fa -> fa_off + pri_fa -> fa_size ), (PM_S1_ADDRESS + PM_S1_SIZE ));
1305+ #endif
1306+ check_addresses = true;
1307+ } else {
1308+ min_addr = pri_fa -> fa_off ;
1309+ max_addr = pri_fa -> fa_off + pri_fa -> fa_size ;
1310+ check_addresses = true;
1311+ }
1312+ #endif /* !LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED */
12791313
12801314 if (check_addresses == true && (reset_value < min_addr || reset_value > max_addr )) {
12811315 BOOT_LOG_ERR ("Reset address of image in secondary slot is not in the primary slot" );
@@ -1490,13 +1524,18 @@ boot_validated_swap_type(struct boot_loader_state *state,
14901524#else
14911525 if (reset_addr >= PM_S1_ADDRESS && PM_S1_ADDRESS <= (PM_S1_ADDRESS + PM_S1_SIZE )) {
14921526#endif
1527+ #if !defined(LEGACY_CHILD_PARENT_BUILD )
1528+ /* Sysbuild */
14931529 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_APPLICATION_IMAGE_NUMBER ) {
14941530 /* This is not the s0/s1 upgrade image but the application image, pretend
14951531 * there is no image so the NSIB update can be loaded
14961532 */
14971533 return BOOT_SWAP_TYPE_NONE ;
14981534 }
1499- #if 0 && defined(CONFIG_SOC_NRF5340_CPUAPP ) && defined(CONFIG_NRF53_MULTI_IMAGE_UPDATE )
1535+ #else
1536+ #if defined(LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED ) && defined(CONFIG_SOC_NRF5340_CPUAPP ) && \
1537+ defined(CONFIG_NRF53_MULTI_IMAGE_UPDATE )
1538+ /* Legacy parent/child image */
15001539 const struct flash_area * nsib_fa ;
15011540
15021541 /* NSIB upgrade slot */
@@ -1512,6 +1551,7 @@ boot_validated_swap_type(struct boot_loader_state *state,
15121551
15131552 /* Set primary to be NSIB upgrade slot */
15141553 BOOT_IMG_AREA (state , 0 ) = nsib_fa ;
1554+ #endif
15151555#endif
15161556 owner_nsib [BOOT_CURR_IMG (state )] = true;
15171557#if (CONFIG_NCS_IS_VARIANT_IMAGE )
@@ -2068,9 +2108,15 @@ boot_swap_image(struct boot_loader_state *state, struct boot_status *bs)
20682108 flash_area_close (fap );
20692109 }
20702110
2071- #if defined(PM_S1_ADDRESS ) && !MCUBOOT_OVERWRITE_ONLY && CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1
2111+ #if defined(PM_S1_ADDRESS ) && !MCUBOOT_OVERWRITE_ONLY && ( CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 || defined( LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED ))
20722112 if (owner_nsib [BOOT_CURR_IMG (state )]) {
2113+ #ifndef LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED
2114+ /* Sysbuild */
20732115 if (BOOT_CURR_IMG (state ) == CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER ) {
2116+ #else
2117+ /* Legacy child/parent support */
2118+ if (BOOT_CURR_IMG (state ) == LEGACY_CHILD_PARENT_S0_S1_UPDATE_IMAGE_ID ) {
2119+ #endif
20742120 /* For NSIB, move the image instead of swapping it */
20752121 nsib_swap_run (state , bs );
20762122
@@ -2749,6 +2795,15 @@ context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp)
27492795 rc = boot_perform_update (state , & bs );
27502796 }
27512797 assert (rc == 0 );
2798+
2799+ #if defined(LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED ) && defined(PM_S1_ADDRESS ) && \
2800+ defined(CONFIG_REBOOT )
2801+ /* Legacy child/parent support */
2802+ if (owner_nsib [BOOT_CURR_IMG (state )]) {
2803+ sys_reboot (SYS_REBOOT_COLD );
2804+ }
2805+ #endif
2806+
27522807 break ;
27532808
27542809 case BOOT_SWAP_TYPE_FAIL :
@@ -2823,7 +2878,12 @@ context_boot_go(struct boot_loader_state *state, struct boot_rsp *rsp)
28232878 * does not need to also be validated by MCUBoot.
28242879 */
28252880 bool image_validated_by_nsib = BOOT_CURR_IMG (state ) ==
2881+ #ifndef LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED
28262882 CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER ;
2883+ #else
2884+ LEGACY_CHILD_PARENT_S0_S1_UPDATE_IMAGE_ID ;
2885+ #endif
2886+
28272887 if (!image_validated_by_nsib )
28282888#endif
28292889 {
0 commit comments