Skip to content

Commit 6c09219

Browse files
committed
[nrf fromtree] loader: Add boot hook for slot selection
Add a bootloader hook to alter the logic of the active slot selection in Direct XIP modes. Signed-off-by: Tomasz Chyrowicz <[email protected]> (cherry picked from commit 7c4ec9a)
1 parent 4e48cbd commit 6c09219

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-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));

0 commit comments

Comments
 (0)