]> granicus.if.org Git - esp-idf/commitdiff
bootloader, esp32: add workaround for Tensilica erratum 572
authorIvan Grokhotkov <ivan@espressif.com>
Thu, 1 Nov 2018 03:30:48 +0000 (11:30 +0800)
committerbot <bot@espressif.com>
Mon, 19 Nov 2018 04:39:35 +0000 (04:39 +0000)
If zero-overhead loop buffer is enabled, under certain rare conditions
when executing a zero-overhead loop, the CPU may attempt to execute an invalid instruction. Work around by disabling the buffer.

components/bootloader_support/src/bootloader_init.c
components/esp32/cpu_start.c
components/esp32/include/xtensa/config/core.h
components/soc/esp32/include/soc/cpu.h

index 22636be9494fae65fbd10c8adabd473b5d50f3eb..7263c651665f1582f7f1c45e8f44f2ac85282825 100644 (file)
@@ -72,6 +72,7 @@ static void wdt_reset_check(void);
 esp_err_t bootloader_init()
 {
     cpu_configure_region_protection();
+    cpu_init_memctl();
 
     /* Sanity check that static RAM is after the stack */
 #ifndef NDEBUG
index 8a7155f2e8bfc724005c28e13905d6e5d4585665..34dc885e6bc7e2debdd51e072357fc7c0d99e4d2 100644 (file)
@@ -124,6 +124,7 @@ void IRAM_ATTR call_start_cpu0()
     RESET_REASON rst_reas[2];
 #endif
     cpu_configure_region_protection();
+    cpu_init_memctl();
 
     //Move exception vectors to IRAM
     asm volatile (\
@@ -249,6 +250,7 @@ void IRAM_ATTR call_start_cpu1()
 
     ets_set_appcpu_boot_addr(0);
     cpu_configure_region_protection();
+    cpu_init_memctl();
 
 #if CONFIG_CONSOLE_UART_NONE
     ets_install_putc1(NULL);
index 98f1b1961a8b900de15885493726d2b5c839fd0d..0204757b0557fa7186e36a0aef6e34dbcc6acf6a 100644 (file)
@@ -1401,5 +1401,16 @@ extern const unsigned int  XCJOIN(Xthal_cp_mask_,XCHAL_CP7_IDENT);
 #define XCHAL_ERRATUM_497      0
 #endif
 
+/*
+ * Erratum 572 (releases TBD, but present in ESP32)
+ * Disable zero-overhead loop buffer to prevent rare illegal instruction
+ * exceptions while executing zero-overhead loops.
+ */
+#if ( XCHAL_HAVE_LOOPS && XCHAL_LOOP_BUFFER_SIZE != 0 )
+#define XCHAL_ERRATUM_572   1
+#else
+#define XCHAL_ERRATUM_572   0
+#endif
+
 #endif /*XTENSA_CONFIG_CORE_H*/
 
index 05ec91776b18f0f04efd19b0c4f3e142ad5d7b0c..f28feb59fa26eb958aa0165121d2ac8dda51be1a 100644 (file)
@@ -19,6 +19,7 @@
 #include <stdbool.h>
 #include <stddef.h>
 #include "xtensa/corebits.h"
+#include "xtensa/config/core.h"
 
 /* C macros for xtensa special register read/write/exchange */
 
@@ -51,6 +52,14 @@ static inline void cpu_write_itlb(unsigned vpn, unsigned attr)
     asm volatile ("witlb  %1, %0; isync\n" :: "r" (vpn), "r" (attr));
 }
 
+static inline void cpu_init_memctl()
+{
+#if XCHAL_ERRATUM_572
+    uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
+    WSR(MEMCTL, memctl);
+#endif // XCHAL_ERRATUM_572
+}
+
 /**
  * @brief Configure memory region protection
  *