diff --git a/boot/zephyr/Kconfig b/boot/zephyr/Kconfig index b681fb5fb..0cf033762 100644 --- a/boot/zephyr/Kconfig +++ b/boot/zephyr/Kconfig @@ -354,6 +354,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. + # Disable MBEDTLS from being selected if NRF_SECURITY is enabled, and use default NRF_SECURITY # configuration file for MBEDTLS config MBEDTLS diff --git a/boot/zephyr/main.c b/boot/zephyr/main.c index 351ca4c89..7ba8221b3 100644 --- a/boot/zephyr/main.c +++ b/boot/zephyr/main.c @@ -271,7 +271,33 @@ 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" + /* 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)