Skip to content

Commit a9e70e4

Browse files
adsz-nordicrlubos
authored andcommitted
[nrf noup] boot: Add retry for image verification
Intended mainly for direct-xip mode. Allows to control: - number of image validation attempts performed before considering the image invalid - time before next attempt is made Signed-off-by: Adam Szczygieł <[email protected]> (cherry picked from commit 2534681)
1 parent 068718a commit a9e70e4

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

boot/bootutil/src/loader.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757

5858
#ifdef __ZEPHYR__
5959
#include <zephyr/sys/reboot.h>
60+
#if defined(CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS)
61+
#include <zephyr/kernel.h>
62+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS */
6063
#endif
6164

6265
#if defined(CONFIG_SOC_NRF5340_CPUAPP) && defined(PM_CPUNET_B0N_ADDRESS) && defined(CONFIG_PCD_APP)
@@ -909,14 +912,42 @@ boot_image_check(struct boot_loader_state *state, struct image_header *hdr,
909912
}
910913
#endif
911914

915+
for (int i = 1; i <= CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT; i++ ) {
916+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
917+
BOOT_LOG_DBG("Image validation attempt %d/%d", i, CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT);
918+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
919+
912920
#if defined(MCUBOOT_SWAP_USING_OFFSET) && defined(MCUBOOT_SERIAL_RECOVERY)
913-
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
914-
NULL, 0, NULL, 0);
921+
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
922+
NULL, 0, NULL, 0);
915923
#else
916-
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
917-
NULL, 0, NULL);
924+
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
925+
NULL, 0, NULL);
918926
#endif
919927

928+
if (FIH_EQ(fih_rc, FIH_SUCCESS)) {
929+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
930+
BOOT_LOG_DBG("Image validation attempt %d/%d success", i, CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT);
931+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
932+
break;
933+
} else {
934+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
935+
BOOT_LOG_WRN("Image validation attempt %d/%d failure: %d",
936+
i,
937+
CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT, fih_rc);
938+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
939+
940+
if (i < CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT) {
941+
#if defined(CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS)
942+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
943+
BOOT_LOG_DBG("Waiting %d ms before next attempt",
944+
CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS);
945+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
946+
k_busy_wait(CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS * 1000);
947+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS */
948+
}
949+
}
950+
}
920951
FIH_RET(fih_rc);
921952
}
922953

boot/zephyr/Kconfig

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,4 +1251,21 @@ config MCUBOOT_VERIFY_IMG_ADDRESS
12511251
also be useful when BOOT_DIRECT_XIP is enabled, to ensure that the image
12521252
linked at the correct address is loaded.
12531253

1254+
config NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT
1255+
int "Number of image validation attempts"
1256+
default 1
1257+
help
1258+
Number of image validation attempts performed before an image is considered invalid.
1259+
A wait is done between each attempt to allow for recovery from a temporary disruption.
1260+
This can prevent erasing an image when initial validation fails.
1261+
Wait time is controlled by MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS.
1262+
1263+
config NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS
1264+
int "Time between image validation attempts"
1265+
depends on NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
1266+
default 5000
1267+
help
1268+
Time between image validation attempts, in milliseconds.
1269+
Allows for recovery from transient bit flips or similar situations.
1270+
12541271
source "Kconfig.zephyr"

0 commit comments

Comments
 (0)