Skip to content

Commit 7ed7306

Browse files
adsz-nordicjukkar
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) (cherry picked from commit a9e70e4)
1 parent b29a003 commit 7ed7306

File tree

2 files changed

+55
-2
lines changed

2 files changed

+55
-2
lines changed

boot/bootutil/src/loader.c

Lines changed: 38 additions & 2 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)
@@ -761,9 +764,42 @@ boot_image_check(struct boot_loader_state *state, struct image_header *hdr,
761764
}
762765
#endif
763766

764-
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
765-
NULL, 0, NULL);
767+
for (int i = 1; i <= CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT; i++ ) {
768+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
769+
BOOT_LOG_DBG("Image validation attempt %d/%d", i, CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT);
770+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
766771

772+
#if defined(MCUBOOT_SWAP_USING_OFFSET) && defined(MCUBOOT_SERIAL_RECOVERY)
773+
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
774+
NULL, 0, NULL, 0);
775+
#else
776+
FIH_CALL(bootutil_img_validate, fih_rc, state, hdr, fap, tmpbuf, BOOT_TMPBUF_SZ,
777+
NULL, 0, NULL);
778+
#endif
779+
780+
if (FIH_EQ(fih_rc, FIH_SUCCESS)) {
781+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
782+
BOOT_LOG_DBG("Image validation attempt %d/%d success", i, CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT);
783+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
784+
break;
785+
} else {
786+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
787+
BOOT_LOG_WRN("Image validation attempt %d/%d failure: %d",
788+
i,
789+
CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT, fih_rc);
790+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
791+
792+
if (i < CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT) {
793+
#if defined(CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS)
794+
#if CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
795+
BOOT_LOG_DBG("Waiting %d ms before next attempt",
796+
CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS);
797+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1 */
798+
k_busy_wait(CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS * 1000);
799+
#endif /* CONFIG_NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS */
800+
}
801+
}
802+
}
767803
FIH_RET(fih_rc);
768804
}
769805

boot/zephyr/Kconfig

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

1310+
config NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT
1311+
int "Number of image validation attempts"
1312+
default 1
1313+
help
1314+
Number of image validation attempts performed before an image is considered invalid.
1315+
A wait is done between each attempt to allow for recovery from a temporary disruption.
1316+
This can prevent erasing an image when initial validation fails.
1317+
Wait time is controlled by MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS.
1318+
1319+
config NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_WAIT_MS
1320+
int "Time between image validation attempts"
1321+
depends on NRF_MCUBOOT_IMG_VALIDATE_ATTEMPT_COUNT > 1
1322+
default 5000
1323+
help
1324+
Time between image validation attempts, in milliseconds.
1325+
Allows for recovery from transient bit flips or similar situations.
1326+
13101327
source "Kconfig.zephyr"

0 commit comments

Comments
 (0)