]> granicus.if.org Git - esp-idf/commitdiff
spi_flash: protect spi_flash_unlock
authorIvan Grokhotkov <ivan@espressif.com>
Wed, 22 Feb 2017 04:51:16 +0000 (12:51 +0800)
committerIvan Grokhotkov <ivan@espressif.com>
Wed, 22 Feb 2017 04:51:16 +0000 (12:51 +0800)
spi_flash_unlock was missing spi_flash_guard_start, which caused cache
to be enabled during unlock operation, causing hard-to-trace crashes
and cache data corruption.

components/spi_flash/flash_ops.c

index 3581b34141744846fdb8c39d11d955dd6e2f80b7..324c02a3d07451abd6f45a2f73acc158adb931a1 100644 (file)
@@ -202,7 +202,9 @@ esp_err_t IRAM_ATTR spi_flash_write(size_t dst, const void *srcv, size_t size)
     size_t mid_size = (size - left_size) & ~3U;
     size_t right_off = left_size + mid_size;
     size_t right_size = size - mid_size - left_size;
+    spi_flash_guard_start();
     rc = spi_flash_unlock();
+    spi_flash_guard_end();
     if (rc != SPI_FLASH_RESULT_OK) {
         goto out;
     }
@@ -289,7 +291,9 @@ esp_err_t IRAM_ATTR spi_flash_write_encrypted(size_t dest_addr, const void *src,
     COUNTER_START();
     spi_flash_disable_interrupts_caches_and_other_cpu();
     SpiFlashOpResult rc;
+    spi_flash_guard_start();
     rc = spi_flash_unlock();
+    spi_flash_guard_end();
     spi_flash_enable_interrupts_caches_and_other_cpu();
 
     if (rc == SPI_FLASH_RESULT_OK) {