Skip to content

Commit 7bc60e4

Browse files
committed
[nrf fromlist] loader: Add boot hook for slot selection
Add a bootloader hook to alter the logic of the active slot selection in Direct XIP modes. Upstream PR #: 2402 Signed-off-by: Tomasz Chyrowicz <[email protected]>
1 parent 7810a8c commit 7bc60e4

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

boot/bootutil/include/bootutil/boot_hooks.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@
8282

8383
#endif /* MCUBOOT_BOOT_GO_HOOKS */
8484

85+
#ifdef MCUBOOT_FIND_NEXT_SLOT_HOOKS
86+
87+
#define BOOT_HOOK_FIND_SLOT_CALL(f, ret_default, ...) \
88+
DO_HOOK_CALL(f, ret_default, __VA_ARGS__)
89+
90+
#else
91+
92+
#define BOOT_HOOK_FIND_SLOT_CALL(f, ret_default, ...) \
93+
HOOK_CALL_NOP(f, ret_default, __VA_ARGS__)
94+
95+
#endif /* MCUBOOT_FIND_NEXT_SLOT_HOOKS */
96+
8597
#ifdef MCUBOOT_FLASH_AREA_HOOKS
8698

8799
#define BOOT_HOOK_FLASH_AREA_CALL(f, ret_default, ...) \
@@ -260,4 +272,16 @@ int flash_area_get_device_id_hook(const struct flash_area *fa,
260272
#define BOOT_RESET_REQUEST_HOOK_CHECK_FAILED 3
261273
#define BOOT_RESET_REQUEST_HOOK_INTERNAL_ERROR 4
262274

275+
/**
276+
* Finds the preferred slot containing the image.
277+
*
278+
* @param[in] state Boot loader status information.
279+
* @param[in] image Image, for which the slot should be found.
280+
* @param[out] active_slot Number of the preferred slot.
281+
*
282+
* @return 0 if a slot was requested;
283+
* BOOT_HOOK_REGULAR follow the normal execution path.
284+
*/
285+
int boot_find_next_slot_hook(struct boot_loader_state *state, uint8_t image, uint32_t *active_slot);
286+
263287
#endif /*H_BOOTUTIL_HOOKS*/

boot/bootutil/src/loader.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3605,7 +3605,12 @@ boot_load_and_validate_images(struct boot_loader_state *state)
36053605
break;
36063606
}
36073607

3608-
active_slot = find_slot_with_highest_version(state);
3608+
rc = BOOT_HOOK_FIND_SLOT_CALL(boot_find_next_slot_hook, BOOT_HOOK_REGULAR,
3609+
state, BOOT_CURR_IMG(state), &active_slot);
3610+
if (rc == BOOT_HOOK_REGULAR) {
3611+
active_slot = find_slot_with_highest_version(state);
3612+
}
3613+
36093614
if (active_slot == NO_ACTIVE_SLOT) {
36103615
BOOT_LOG_INF("No slot to load for image %d",
36113616
BOOT_CURR_IMG(state));
@@ -3652,7 +3657,12 @@ boot_load_and_validate_images(struct boot_loader_state *state)
36523657
break;
36533658
}
36543659

3655-
active_slot = find_slot_with_highest_version(state);
3660+
rc = BOOT_HOOK_FIND_SLOT_CALL(boot_find_next_slot_hook, BOOT_HOOK_REGULAR,
3661+
state, BOOT_CURR_IMG(state), &active_slot);
3662+
if (rc == BOOT_HOOK_REGULAR) {
3663+
active_slot = find_slot_with_highest_version(state);
3664+
}
3665+
36563666
if (active_slot == NO_ACTIVE_SLOT) {
36573667
BOOT_LOG_INF("No slot to load for image %d",
36583668
BOOT_CURR_IMG(state));

boot/zephyr/Kconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,14 @@ config MCUBOOT_ACTION_HOOKS
11221122
'mcuboot_status_type_t' is listed in
11231123
boot/bootutil/include/bootutil/mcuboot_status.h
11241124

1125+
config FIND_NEXT_SLOT_HOOKS
1126+
bool "Enable hooks for finding the next active slot"
1127+
help
1128+
This will call a handler when the MCUboot searches for the best slot
1129+
for an image. By default, a slot with the highest version is selected.
1130+
This hook allows to override this logic and provide a custom slot
1131+
selection policy.
1132+
11251133
config BOOT_DISABLE_CACHES
11261134
bool "Disable I/D caches before chain-loading application"
11271135
depends on CPU_HAS_ICACHE || CPU_HAS_DCACHE

boot/zephyr/hooks_sample.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,8 @@ int boot_img_install_stat_hook(int image_index, int slot, int *img_install_stat)
9393
{
9494
return BOOT_HOOK_REGULAR;
9595
}
96+
97+
int boot_find_next_slot_hook(struct boot_loader_state *state, uint8_t image, uint32_t *active_slot)
98+
{
99+
return BOOT_HOOK_REGULAR;
100+
}

boot/zephyr/include/mcuboot_config/mcuboot_config.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@
267267
#define MCUBOOT_FLASH_AREA_HOOKS
268268
#endif
269269

270+
#ifdef CONFIG_FIND_NEXT_SLOT_HOOKS
271+
#define MCUBOOT_FIND_NEXT_SLOT_HOOKS
272+
#endif
273+
270274
#ifdef CONFIG_MCUBOOT_VERIFY_IMG_ADDRESS
271275
#define MCUBOOT_VERIFY_IMG_ADDRESS
272276
#endif

0 commit comments

Comments
 (0)