|
|
@@ -10,51 +10,53 @@
|
|
|
* ESP32S2 MEMORY PROTECTION MODULE TEST
|
|
|
* =====================================
|
|
|
*
|
|
|
- * In order to safely test all the mem_prot features, this test uses a proprietary setting
|
|
|
- * for all splitting addresses, ie it partially overrides production settings.
|
|
|
- * Each operation is tested at [test-splitting-addr - 16B] (low region) and
|
|
|
- * [test-splitting-addr + 16B] (high region). Complete testing scheme
|
|
|
- * is depicted below, the addresses used come from this application binary:
|
|
|
+ * In order to safely test all the mem_prot features configuration, this test uses a combination of
|
|
|
+ * proprietary settings and ESP-IDF defaults.
|
|
|
+ * Each operation is tested at both low region and high region testing address.
|
|
|
+ * Complete testing scheme is depicted below:
|
|
|
*
|
|
|
* ********************************************************************************************
|
|
|
*
|
|
|
* IRAM0 SRAM (320kB) DRAM0
|
|
|
* ===========================
|
|
|
- * (_iram_text_end) | | (_data_start)
|
|
|
- * 0x4002B51C(!) <-------- real splt.addr --------> 0x3FFBB520
|
|
|
* | |
|
|
|
- * 0x4002DA30 <---|-------------------------|--> 0x3FFBDA30
|
|
|
- * | test buffer (64 kB) |
|
|
|
- * | ... |
|
|
|
- * 0x40035A30 <-------- test splt.addr --------> 0x3FFC5A30
|
|
|
+ * |-------------------------|
|
|
|
+ * | iram_test_buffer (1kB) |
|
|
|
+ * <---------- test addr low -------> iram_test_buffer + 0x200
|
|
|
+ * | |
|
|
|
+ * _iram_text_end <======== real splt.addr ========> _data_start (real splt.addr == test splt.addr)
|
|
|
+ * | |
|
|
|
+ * <---|-------------------------|-->
|
|
|
+ * | dram_test_buffer (1kB) |
|
|
|
+ * <--------- test addr high -------> dram_test_buffer + 0x200
|
|
|
* | ... |
|
|
|
* |-------------------------|
|
|
|
* | |
|
|
|
* ===========================
|
|
|
*
|
|
|
* RTC_FAST (8kB)
|
|
|
- * (_rtc_text_end) =========================== (_rtc_dummy_end)
|
|
|
- * 0x40070000 <-------- real splt.addr --------> 0x3FF9E000
|
|
|
- * | |
|
|
|
- * | test buffer (7 kB) |
|
|
|
- * | ... |
|
|
|
- * 0x40070E00 <-------- test splt.addr --------> 0x3FF9EE00
|
|
|
- * | ... |
|
|
|
+ * ===========================
|
|
|
+ * _rtc_text_end <======== real splt.addr ========> _rtc_dummy_end
|
|
|
+ * | rtcfast_dummy_buffer |
|
|
|
+ * | (2kB) |
|
|
|
+ * <---------- test addr low -------> test_buffer - 0x200
|
|
|
+ * <-------- test splt.addr --------> test_buffer = rtcfast_dummy_buffer / 2
|
|
|
+ * <---------- test addr low -------> test_buffer + 0x200
|
|
|
* |-------------------------|
|
|
|
* | |
|
|
|
* ===========================
|
|
|
*
|
|
|
* ********************************************************************************************
|
|
|
*
|
|
|
- * PERIBUS_1 RTC_SLOW (8/768kB) PERIBUS_2_0 PERIBUS_2_1
|
|
|
+ * PERIBUS_1 RTC_SLOW (8/768kB) PERIBUS_2_0 PERIBUS_2_1
|
|
|
* ===========================
|
|
|
- * | |
|
|
|
- * 0x3F421000 <-------- real splt.addr --------> 0x50000000 0x60021000
|
|
|
* | |
|
|
|
- * | test buffer (7 kB) |
|
|
|
- * | ... |
|
|
|
- * 0x3F421E00 <-------- test splt.addr --------> 0x50000E00 0x60021E00
|
|
|
- * | ... |
|
|
|
+ * 0x3F421000 <======== real splt.addr ========> 0x50000000 0x60021000
|
|
|
+ * | rtcslow_dummy_buffer |
|
|
|
+ * | (2kB) |
|
|
|
+ * <---------- test addr low -------> test_buffer - 0x200
|
|
|
+ * <-------- test splt.addr --------> test_buffer = rtcslow_dummy_buffer / 2
|
|
|
+ * <---------- test addr low -------> test_buffer + 0x200
|
|
|
* |-------------------------|
|
|
|
* | |
|
|
|
* ===========================
|
|
|
@@ -90,39 +92,30 @@
|
|
|
*/
|
|
|
static uint8_t fnc_call0_buff[] = {0xf0, 0x22, 0x11, 0x0d, 0xf0, 0x00, 0x00, 0x00};
|
|
|
|
|
|
-#define SRAM_DUMMY_BUFFER_SIZE 64*1024
|
|
|
-#define RTCFAST_DUMMY_BUFFER_SIZE 7*1024
|
|
|
-#define RTCSLOW_DUMMY_BUFFER_SIZE 7*1024
|
|
|
-
|
|
|
volatile bool g_override_illegal_instruction = false;
|
|
|
|
|
|
-static uint8_t sram_dummy_buffer[SRAM_DUMMY_BUFFER_SIZE] = {0};
|
|
|
-static uint8_t RTC_FAST_ATTR rtcfast_dummy_buffer[RTCFAST_DUMMY_BUFFER_SIZE] = {0};
|
|
|
-static uint8_t RTC_SLOW_ATTR rtcslow_dummy_buffer[RTCSLOW_DUMMY_BUFFER_SIZE] = {0};
|
|
|
+#define MAP_DRAM_TO_IRAM(addr) (addr - SOC_DIRAM_DRAM_LOW + SOC_DIRAM_IRAM_LOW)
|
|
|
+#define MAP_IRAM_TO_DRAM(addr) (addr - SOC_DIRAM_IRAM_LOW + SOC_DIRAM_DRAM_LOW)
|
|
|
+
|
|
|
+#define SRAM_TEST_BUFFER_SIZE 0x400
|
|
|
+#define SRAM_TEST_OFFSET 0x200
|
|
|
+
|
|
|
+static uint8_t __attribute__((section(".iram_end_test"))) iram_test_buffer[SRAM_TEST_BUFFER_SIZE] = {0};
|
|
|
+static uint8_t dram_test_buffer[SRAM_TEST_BUFFER_SIZE] = {0};
|
|
|
+static uint8_t RTC_FAST_ATTR rtcfast_dummy_buffer[2 * SRAM_TEST_BUFFER_SIZE] = {0};
|
|
|
+static uint8_t RTC_SLOW_ATTR rtcslow_dummy_buffer[2 * SRAM_TEST_BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
/* ********************************************************************************************
|
|
|
* testing regions and splitting address scheme
|
|
|
*
|
|
|
*/
|
|
|
-static uint32_t *test_memprot_dram0_sram_get_min_split_addr(void)
|
|
|
-{
|
|
|
- return (uint32_t *)(sram_dummy_buffer + sizeof(sram_dummy_buffer) / 2);
|
|
|
-}
|
|
|
|
|
|
static uint32_t *test_memprot_dram0_rtcfast_get_min_split_addr(void)
|
|
|
{
|
|
|
return (uint32_t *)(rtcfast_dummy_buffer + sizeof(rtcfast_dummy_buffer) / 2);
|
|
|
}
|
|
|
|
|
|
-static uint32_t *test_memprot_iram0_sram_get_min_split_addr(void)
|
|
|
-{
|
|
|
- return (uint32_t *)
|
|
|
- ((uint32_t)test_memprot_dram0_sram_get_min_split_addr() +
|
|
|
- + esp_memprot_get_low_limit(MEMPROT_IRAM0_SRAM)
|
|
|
- - esp_memprot_get_low_limit(MEMPROT_DRAM0_SRAM));
|
|
|
-}
|
|
|
-
|
|
|
static uint32_t *test_memprot_iram0_rtcfast_get_min_split_addr(void)
|
|
|
{
|
|
|
return (uint32_t *)
|
|
|
@@ -152,13 +145,58 @@ static uint32_t *test_memprot_peri2_rtcslow_1_get_min_split_addr(void)
|
|
|
- esp_memprot_get_low_limit(MEMPROT_PERI2_RTCSLOW_0));
|
|
|
}
|
|
|
|
|
|
+static uint32_t *test_memprot_addr_low(mem_type_prot_t mem_type)
|
|
|
+{
|
|
|
+ switch ( mem_type ) {
|
|
|
+ case MEMPROT_IRAM0_SRAM:
|
|
|
+ return (uint32_t *)((uint32_t)iram_test_buffer + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_DRAM0_SRAM:
|
|
|
+ return (uint32_t *)MAP_IRAM_TO_DRAM((uint32_t)iram_test_buffer + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_IRAM0_RTCFAST:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_iram0_rtcfast_get_min_split_addr() - SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_DRAM0_RTCFAST:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_dram0_rtcfast_get_min_split_addr() - SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI1_RTCSLOW:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri1_rtcslow_get_min_split_addr() - SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI2_RTCSLOW_0:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri2_rtcslow_0_get_min_split_addr() - SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI2_RTCSLOW_1:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri2_rtcslow_1_get_min_split_addr() - SRAM_TEST_OFFSET);
|
|
|
+ default:
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static uint32_t *test_memprot_addr_high(mem_type_prot_t mem_type)
|
|
|
+{
|
|
|
+ switch ( mem_type ) {
|
|
|
+ case MEMPROT_IRAM0_SRAM:
|
|
|
+ return (uint32_t *)MAP_DRAM_TO_IRAM((uint32_t)dram_test_buffer + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_DRAM0_SRAM:
|
|
|
+ return (uint32_t *)((uint32_t)dram_test_buffer + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_IRAM0_RTCFAST:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_iram0_rtcfast_get_min_split_addr() + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_DRAM0_RTCFAST:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_dram0_rtcfast_get_min_split_addr() + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI1_RTCSLOW:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri1_rtcslow_get_min_split_addr() + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI2_RTCSLOW_0:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri2_rtcslow_0_get_min_split_addr() + SRAM_TEST_OFFSET);
|
|
|
+ case MEMPROT_PERI2_RTCSLOW_1:
|
|
|
+ return (uint32_t *)((uint32_t)test_memprot_peri2_rtcslow_1_get_min_split_addr() + SRAM_TEST_OFFSET);
|
|
|
+ default:
|
|
|
+ abort();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static uint32_t *test_memprot_get_split_addr(mem_type_prot_t mem_type)
|
|
|
{
|
|
|
switch (mem_type) {
|
|
|
case MEMPROT_IRAM0_SRAM:
|
|
|
- return test_memprot_iram0_sram_get_min_split_addr();
|
|
|
+ return esp_memprot_get_split_addr(MEMPROT_IRAM0_SRAM);
|
|
|
case MEMPROT_DRAM0_SRAM:
|
|
|
- return test_memprot_dram0_sram_get_min_split_addr();
|
|
|
+ return esp_memprot_get_split_addr(MEMPROT_DRAM0_SRAM);
|
|
|
case MEMPROT_IRAM0_RTCFAST:
|
|
|
return test_memprot_iram0_rtcfast_get_min_split_addr();
|
|
|
case MEMPROT_DRAM0_RTCFAST:
|
|
|
@@ -218,25 +256,25 @@ static void test_memprot_set_prot(uint32_t *mem_type_mask, bool use_panic_handle
|
|
|
|
|
|
//set permissions
|
|
|
if (required_mem_prot & MEMPROT_IRAM0_SRAM) {
|
|
|
- esp_memprot_set_prot_iram(MEMPROT_IRAM0_SRAM, test_memprot_iram0_sram_get_min_split_addr(), true, true, true, true, true, false);
|
|
|
+ esp_memprot_set_prot_iram(MEMPROT_IRAM0_SRAM, DEF_SPLIT_LINE, WR_LOW_DIS, RD_LOW_ENA, EX_LOW_ENA, WR_HIGH_DIS, RD_HIGH_DIS, EX_HIGH_DIS);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_IRAM0_RTCFAST) {
|
|
|
- esp_memprot_set_prot_iram(MEMPROT_IRAM0_RTCFAST, test_memprot_iram0_rtcfast_get_min_split_addr(), false, true, true, true, true, false);
|
|
|
+ esp_memprot_set_prot_iram(MEMPROT_IRAM0_RTCFAST, test_memprot_iram0_rtcfast_get_min_split_addr(), WR_LOW_DIS, RD_LOW_ENA, EX_LOW_ENA, WR_HIGH_DIS, RD_HIGH_DIS, EX_HIGH_DIS);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_DRAM0_SRAM) {
|
|
|
- esp_memprot_set_prot_dram(MEMPROT_DRAM0_SRAM, test_memprot_dram0_sram_get_min_split_addr(), true, true, true, true);
|
|
|
+ esp_memprot_set_prot_dram(MEMPROT_DRAM0_SRAM, DEF_SPLIT_LINE, WR_LOW_DIS, RD_LOW_ENA, WR_HIGH_ENA, RD_HIGH_ENA);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_DRAM0_RTCFAST) {
|
|
|
- esp_memprot_set_prot_dram(MEMPROT_DRAM0_RTCFAST, test_memprot_dram0_rtcfast_get_min_split_addr(), false, true, true, true);
|
|
|
+ esp_memprot_set_prot_dram(MEMPROT_DRAM0_RTCFAST, test_memprot_dram0_rtcfast_get_min_split_addr(), WR_LOW_DIS, RD_LOW_ENA, WR_HIGH_ENA, RD_HIGH_ENA);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_PERI1_RTCSLOW) {
|
|
|
- esp_memprot_set_prot_peri1(MEMPROT_PERI1_RTCSLOW, test_memprot_peri1_rtcslow_get_min_split_addr(), true, true, true, true);
|
|
|
+ esp_memprot_set_prot_peri1(MEMPROT_PERI1_RTCSLOW, test_memprot_peri1_rtcslow_get_min_split_addr(), WR_LOW_DIS, RD_LOW_DIS, RD_HIGH_DIS, WR_HIGH_DIS);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_PERI2_RTCSLOW_0) {
|
|
|
- esp_memprot_set_prot_peri2(MEMPROT_PERI2_RTCSLOW_0, test_memprot_peri2_rtcslow_0_get_min_split_addr(), true, true, false, true, true, false);
|
|
|
+ esp_memprot_set_prot_peri2(MEMPROT_PERI2_RTCSLOW_0, test_memprot_peri2_rtcslow_0_get_min_split_addr(), WR_LOW_ENA, RD_LOW_ENA, EX_LOW_DIS, WR_HIGH_ENA, RD_HIGH_ENA, EX_HIGH_DIS);
|
|
|
}
|
|
|
if (required_mem_prot & MEMPROT_PERI2_RTCSLOW_1) {
|
|
|
- esp_memprot_set_prot_peri2(MEMPROT_PERI2_RTCSLOW_1, test_memprot_peri2_rtcslow_1_get_min_split_addr(), true, true, false, true, true, false);
|
|
|
+ esp_memprot_set_prot_peri2(MEMPROT_PERI2_RTCSLOW_1, test_memprot_peri2_rtcslow_1_get_min_split_addr(), WR_LOW_DIS, RD_LOW_DIS, EX_LOW_DIS, WR_HIGH_DIS, RD_HIGH_DIS, EX_HIGH_DIS);
|
|
|
}
|
|
|
|
|
|
//reenable protection (bus based)
|
|
|
@@ -304,23 +342,25 @@ static void test_memprot_read(mem_type_prot_t mem_type)
|
|
|
{
|
|
|
//get current READ & WRITE permission settings
|
|
|
bool write_perm_low, write_perm_high, read_perm_low, read_perm_high;
|
|
|
- esp_memprot_get_perm_read(mem_type, &write_perm_low, &write_perm_high);
|
|
|
+ esp_memprot_get_perm_write(mem_type, &write_perm_low, &write_perm_high);
|
|
|
esp_memprot_get_perm_read(mem_type, &read_perm_low, &read_perm_high);
|
|
|
|
|
|
- //get current splitting address
|
|
|
- volatile uint32_t *ptr = test_memprot_get_split_addr(mem_type);
|
|
|
+ volatile uint32_t *ptr_low = test_memprot_addr_low(mem_type);
|
|
|
+ volatile uint32_t *ptr_high = test_memprot_addr_high(mem_type);
|
|
|
|
|
|
//temporarily allow WRITE for setting the test values
|
|
|
- const uint32_t test_val = 100;
|
|
|
esp_memprot_set_write_perm(mem_type, true, true);
|
|
|
- *(ptr - 4) = test_val;
|
|
|
- *(ptr + 4) = test_val + 1;
|
|
|
+
|
|
|
+ const uint32_t test_val = 100;
|
|
|
+ *ptr_low = test_val;
|
|
|
+ *ptr_high = test_val + 1;
|
|
|
+
|
|
|
esp_memprot_set_write_perm(mem_type, write_perm_low, write_perm_high);
|
|
|
|
|
|
//perform READ in low region
|
|
|
esp_rom_printf("%s read low: ", esp_memprot_type_to_str(mem_type));
|
|
|
esp_memprot_clear_intr(mem_type);
|
|
|
- volatile uint32_t val = *(ptr - 4);
|
|
|
+ volatile uint32_t val = *ptr_low;
|
|
|
if ( val != 0 && val != test_val ) {
|
|
|
esp_rom_printf( "UNEXPECTED VALUE 0x%08X -", val );
|
|
|
dump_status_register(mem_type);
|
|
|
@@ -331,7 +371,7 @@ static void test_memprot_read(mem_type_prot_t mem_type)
|
|
|
//perform read in high region
|
|
|
esp_rom_printf("%s read high: ", esp_memprot_type_to_str(mem_type));
|
|
|
esp_memprot_clear_intr(mem_type);
|
|
|
- val = *(ptr + 4);
|
|
|
+ val = *ptr_high;
|
|
|
if ( val != 0 && val != (test_val + 1) ) {
|
|
|
esp_rom_printf( "UNEXPECTED VALUE 0x%08X -", val);
|
|
|
dump_status_register(mem_type);
|
|
|
@@ -344,14 +384,14 @@ static void test_memprot_write(mem_type_prot_t mem_type)
|
|
|
{
|
|
|
//get current READ & WRITE permission settings
|
|
|
bool write_perm_low, write_perm_high, read_perm_low, read_perm_high;
|
|
|
- esp_memprot_get_perm_read(mem_type, &write_perm_low, &write_perm_high);
|
|
|
+ esp_memprot_get_perm_write(mem_type, &write_perm_low, &write_perm_high);
|
|
|
esp_memprot_get_perm_read(mem_type, &read_perm_low, &read_perm_high);
|
|
|
|
|
|
//temporarily allow READ operation
|
|
|
esp_memprot_set_read_perm(mem_type, true, true);
|
|
|
|
|
|
- //get current splitting address
|
|
|
- volatile uint32_t *ptr = test_memprot_get_split_addr(mem_type);
|
|
|
+ volatile uint32_t *ptr_low = test_memprot_addr_low(mem_type);
|
|
|
+ volatile uint32_t *ptr_high = test_memprot_addr_high(mem_type);
|
|
|
|
|
|
//perform WRITE in low region
|
|
|
const uint32_t test_val = 10;
|
|
|
@@ -359,8 +399,8 @@ static void test_memprot_write(mem_type_prot_t mem_type)
|
|
|
esp_memprot_clear_intr(mem_type);
|
|
|
|
|
|
volatile uint32_t val = 0;
|
|
|
- *(ptr - 4) = test_val;
|
|
|
- val = *(ptr - 4);
|
|
|
+ *ptr_low = test_val;
|
|
|
+ val = *ptr_low;
|
|
|
|
|
|
if ( val != test_val && write_perm_low ) {
|
|
|
esp_rom_printf( "UNEXPECTED VALUE 0x%08X -", val);
|
|
|
@@ -373,8 +413,8 @@ static void test_memprot_write(mem_type_prot_t mem_type)
|
|
|
esp_rom_printf("%s write high: ", esp_memprot_type_to_str(mem_type));
|
|
|
esp_memprot_clear_intr(mem_type);
|
|
|
val = 0;
|
|
|
- *(ptr + 4) = test_val + 1;
|
|
|
- val = *(ptr + 4);
|
|
|
+ *ptr_high = test_val + 1;
|
|
|
+ val = *ptr_high;
|
|
|
|
|
|
if ( val != (test_val + 1) && write_perm_high ) {
|
|
|
esp_rom_printf( "UNEXPECTED VALUE 0x%08X -", val);
|
|
|
@@ -382,6 +422,8 @@ static void test_memprot_write(mem_type_prot_t mem_type)
|
|
|
} else {
|
|
|
check_test_result(mem_type, write_perm_high);
|
|
|
}
|
|
|
+
|
|
|
+ esp_memprot_set_read_perm(mem_type, read_perm_low, read_perm_high);
|
|
|
}
|
|
|
|
|
|
static void test_memprot_exec(mem_type_prot_t mem_type)
|
|
|
@@ -394,8 +436,8 @@ static void test_memprot_exec(mem_type_prot_t mem_type)
|
|
|
bool exec_perm_low, exec_perm_high;
|
|
|
esp_memprot_get_perm_exec(mem_type, &exec_perm_low, &exec_perm_high);
|
|
|
|
|
|
- volatile uint32_t *fnc_ptr_low = (uint32_t *)(test_memprot_get_split_addr(mem_type) - 4);
|
|
|
- volatile uint32_t *fnc_ptr_high = (uint32_t *)(test_memprot_get_split_addr(mem_type) + 4);
|
|
|
+ volatile uint32_t *fnc_ptr_low = test_memprot_addr_low(mem_type);
|
|
|
+ volatile uint32_t *fnc_ptr_high = test_memprot_addr_high(mem_type);
|
|
|
|
|
|
//enable WRITE permission for both segments
|
|
|
esp_memprot_set_write_perm(mem_type, true, true);
|
|
|
@@ -423,7 +465,7 @@ static void test_memprot_exec(mem_type_prot_t mem_type)
|
|
|
check_test_result(mem_type, exec_perm_low);
|
|
|
} else {
|
|
|
if ( !exec_perm_low ) {
|
|
|
- check_test_result(mem_type, true);
|
|
|
+ check_test_result(mem_type, false);
|
|
|
} else {
|
|
|
esp_rom_printf(" FAULT [injected code not executed]\n");
|
|
|
}
|
|
|
@@ -442,14 +484,13 @@ static void test_memprot_exec(mem_type_prot_t mem_type)
|
|
|
check_test_result(mem_type, exec_perm_high);
|
|
|
} else {
|
|
|
if ( !exec_perm_high ) {
|
|
|
- check_test_result(mem_type, true);
|
|
|
+ check_test_result(mem_type, false);
|
|
|
} else {
|
|
|
esp_rom_printf(" FAULT [injected code not executed]\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/* ********************************************************************************************
|
|
|
* main test runner
|
|
|
*/
|