Skip to content

Commit 7223ba7

Browse files
committed
[nrf noup] treewide: Add child/parent support back for image numbers
Adds support for child/parent images into the new dynamic image number system, without supporting any of the new features. This commit is scheduled to be removed from the tree when child/parent support is dropped so is purposely kept separate Signed-off-by: Jamie McCrae <[email protected]>
1 parent 06b2bb6 commit 7223ba7

File tree

3 files changed

+106
-8
lines changed

3 files changed

+106
-8
lines changed

boot/bootutil/src/loader.c

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
{

boot/zephyr/CMakeLists.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,19 @@ zephyr_library_sources(
134134
)
135135
endif()
136136

137+
if(NOT SYSBUILD)
138+
# Check if this is a legacy child/parent image build
139+
cmake_path(GET CMAKE_BINARY_DIR PARENT_PATH parent_build_dir)
140+
string(LENGTH ${parent_build_dir} parent_build_dir_len)
141+
math(EXPR parent_build_dir_len "${parent_build_dir_len} + 1")
142+
string(SUBSTRING ${CMAKE_BINARY_DIR} ${parent_build_dir_len} -1 current_dir_name)
143+
144+
if("${current_dir_name}" STREQUAL "mcuboot" AND EXISTS ${parent_build_dir}/image_preload.cmake)
145+
zephyr_compile_definitions(LEGACY_CHILD_PARENT_BUILD=1)
146+
set(LEGACY_CHILD_PARENT_BUILD y)
147+
endif()
148+
endif()
149+
137150
if(CONFIG_SINGLE_APPLICATION_SLOT)
138151
zephyr_library_sources(
139152
${BOOT_DIR}/zephyr/single_loader.c
@@ -154,6 +167,12 @@ zephyr_library_sources(
154167
)
155168

156169
if(NOT CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER EQUAL "-1" AND NOT CONFIG_BOOT_UPGRADE_ONLY)
170+
# Sysbuild
171+
zephyr_library_sources(
172+
${BOOT_DIR}/bootutil/src/swap_nsib.c
173+
)
174+
elseif(LEGACY_CHILD_PARENT_BUILD AND CONFIG_SOC_NRF5340_CPUAPP AND (CONFIG_UPDATEABLE_IMAGE_NUMBER GREATER "2" OR (CONFIG_UPDATEABLE_IMAGE_NUMBER EQUAL "2" AND NOT CONFIG_PCD_APP)) AND NOT CONFIG_BOOT_UPGRADE_ONLY)
175+
# Legacy child/parent image support
157176
zephyr_library_sources(
158177
${BOOT_DIR}/bootutil/src/swap_nsib.c
159178
)

boot/zephyr/include/sysflash/pm_sysflash.h

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,42 @@
2121
#define FLASH_AREA_IMAGE_2_SLOTS PM_MCUBOOT_PRIMARY_2_ID, PM_MCUBOOT_SECONDARY_2_ID,
2222
#define FLASH_AREA_IMAGE_3_SLOTS PM_MCUBOOT_PRIMARY_3_ID, PM_MCUBOOT_SECONDARY_3_ID,
2323

24+
#ifndef LEGACY_CHILD_PARENT_BUILD
25+
/* Sysbuild */
2426
#if CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1
2527
#ifdef CONFIG_NCS_IS_VARIANT_IMAGE
2628
#define MCUBOOT_S0_S1_SLOTS PM_S0_ID, PM_MCUBOOT_SECONDARY_ID,
2729
#else
2830
#define MCUBOOT_S0_S1_SLOTS PM_S1_ID, PM_MCUBOOT_SECONDARY_ID,
2931
#endif
30-
#define MCUBOOT_IMAGE_NUMBER_WITHOUT_MCUBOOT_S0_S1 (MCUBOOT_IMAGE_NUMBER - 1)
3132
#else
32-
#define MCUBOOT_IMAGE_NUMBER_WITHOUT_MCUBOOT_S0_S1 MCUBOOT_IMAGE_NUMBER
33+
#define MCUBOOT_S0_S1_SLOTS
34+
#endif
35+
#else
36+
/* Legacy child/parent image */
37+
#if defined(PM_B0_ADDRESS)
38+
/* If B0 is present then two bootloaders are present, and we must use
39+
* a single secondary slot for both primary slots.
40+
*/
41+
extern uint32_t _image_1_primary_slot_id[];
42+
#define MCUBOOT_S0_S1_SLOTS (uint32_t)_image_1_primary_slot_id, PM_MCUBOOT_SECONDARY_ID,
43+
#define LEGACY_CHILD_PARENT_S0_S1_UPDATE_ENABLED 1
44+
#define LEGACY_CHILD_PARENT_S0_S1_UPDATE_IMAGE_ID 1
45+
#else
46+
#define MCUBOOT_S0_S1_SLOTS
47+
#endif /* defined(PM_B0_ADDRESS) */
48+
#if defined(PM_CPUNET_APP_ADDRESS)
49+
#define LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_ENABLED 1
50+
#define LEGACY_CHILD_PARENT_NETWORK_CORE_UPDATE_IMAGE_ID 1
51+
#endif /* defined(PM_CPUNET_APP_ADDRESS) */
3352
#endif
3453

35-
#if (MCUBOOT_IMAGE_NUMBER == 1) || (MCUBOOT_IMAGE_NUMBER == 2 && CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1)
54+
#if ((MCUBOOT_IMAGE_NUMBER == 1) || (MCUBOOT_IMAGE_NUMBER == 2 && (CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 || (defined(LEGACY_CHILD_PARENT_BUILD) && defined(PM_B0_ADDRESS)))))
3655
#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS
37-
#elif (MCUBOOT_IMAGE_NUMBER == 2) || (MCUBOOT_IMAGE_NUMBER == 3 && CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1)
56+
#elif ((MCUBOOT_IMAGE_NUMBER == 2) || (MCUBOOT_IMAGE_NUMBER == 3 && (CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 || (defined(LEGACY_CHILD_PARENT_BUILD) && defined(PM_B0_ADDRESS)))))
3857
#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS \
3958
FLASH_AREA_IMAGE_1_SLOTS
40-
#elif (MCUBOOT_IMAGE_NUMBER == 3) || (MCUBOOT_IMAGE_NUMBER == 4 && CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1)
59+
#elif ((MCUBOOT_IMAGE_NUMBER == 3) || (MCUBOOT_IMAGE_NUMBER == 4 && (CONFIG_MCUBOOT_MCUBOOT_IMAGE_NUMBER != -1 || (defined(LEGACY_CHILD_PARENT_BUILD) && defined(PM_B0_ADDRESS)))))
4160
#define ALL_AVAILABLE_SLOTS FLASH_AREA_IMAGE_0_SLOTS \
4261
FLASH_AREA_IMAGE_1_SLOTS \
4362
FLASH_AREA_IMAGE_2_SLOTS

0 commit comments

Comments
 (0)