]> granicus.if.org Git - esp-idf/commit
esp_restart: fix possible race while stalling other CPU, enable WDT early
authorIvan Grokhotkov <ivan@espressif.com>
Thu, 26 Oct 2017 11:11:47 +0000 (19:11 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Thu, 26 Oct 2017 11:53:53 +0000 (19:53 +0800)
commiteb5752c635b1d42a322093dc3717c38b4581d664
tree186ac6a07795d90856fd4095a50d15a4aba655c7
parentf11ad0c904018cd4fa0527a2a6600e67c12be60b
esp_restart: fix possible race while stalling other CPU, enable WDT early

Previously esp_restart would stall the other CPU before enabling RTC_WDT.
If the other CPU was executing an s32c1i instruction, the lock signal
from CPU to the arbiter would still be held after CPU was stalled. If
the CPU running esp_restart would then try to access the same locked
memory pool, it would be stuck, because lock signal would never be
released.

With this change, esp_restart resets the other CPU before stalling it.
Ideally, we would want to reset the CPU and keep it in reset, but the
hardware doesn't have such feature for PRO_CPU (it is possible to hold
APP_CPU in reset using DPORT register). Given that ROM code will not use
s32c1i in the first few hundred cycles, doing reset and then stall seems
to be safe.

In addition to than, RTC_WDT initialization is moved to the beginning of
the function, to prevent possible lock-up if CPU stalling still has any
issue.
components/esp32/system_api.c
components/soc/esp32/cpu_util.c
components/soc/esp32/include/soc/cpu.h