diff --git a/boot/zephyr/Kconfig b/boot/zephyr/Kconfig index 7ff11ee90..e421d91c8 100644 --- a/boot/zephyr/Kconfig +++ b/boot/zephyr/Kconfig @@ -219,6 +219,12 @@ config MCUBOOT_CLEANUP_ARM_CORE start-up code which can cause a module fault and potentially make the module irrecoverable. +config MCUBOOT_CLEANUP_RAM + bool "Perform RAM cleanup" + depends on CPU_CORTEX_M + help + Sets contents of memory to 0 before jumping to application. + config MBEDTLS_CFG_FILE default "mcuboot-mbedtls-cfg.h" diff --git a/boot/zephyr/main.c b/boot/zephyr/main.c index 30f8447a9..6a97172a3 100644 --- a/boot/zephyr/main.c +++ b/boot/zephyr/main.c @@ -236,7 +236,34 @@ static void do_boot(struct boot_rsp *rsp) __set_CONTROL(0x00); /* application will configures core on its own */ __ISB(); #endif +#if CONFIG_MCUBOOT_CLEANUP_RAM + __asm__ volatile ( + /* rt->reset -> r0 */ + " mov r0, %0\n" + /* base to write -> r1 */ + " mov r1, %1\n" + /* size to write -> r2 */ + " mov r2, %2\n" + /* value to write -> r3 */ + " mov r3, %3\n" + "clear:\n" + " str r3, [r1]\n" + " add r1, r1, %4\n" + " sub r2, r2, %4\n" + " cbz r2, out\n" + " b clear\n" + "out:\n" + " dsb\n" + /* jump to reset vector of an app */ + " bx r0\n" + : + : "r" (vt->reset), "i" (CONFIG_SRAM_BASE_ADDRESS), + "i" (CONFIG_SRAM_SIZE * 1024), "i" (0), "i" (sizeof(uint32_t)) + : "r0", "r1", "r2", "r3", "memory" + ); +#else ((void (*)(void))vt->reset)(); +#endif } #elif defined(CONFIG_XTENSA) || defined(CONFIG_RISCV)