Jelajahi Sumber

Merge branch 'bugfix/c3_unit_test_cleanup_v4.3' into 'release/v4.3'

System: C3 shared stack watchpoint & unit test cleanups (v4.3)

See merge request espressif/esp-idf!12418
Angus Gratton 5 tahun lalu
induk
melakukan
8e187e7157

+ 4 - 1
components/freertos/port/riscv/port.c

@@ -81,6 +81,7 @@
 
 #include "sdkconfig.h"
 
+#include "soc/soc_caps.h"
 #include "soc/periph_defs.h"
 #include "soc/system_reg.h"
 #include "hal/systimer_hal.h"
@@ -302,11 +303,13 @@ void vPortYield(void)
 }
 
 #define STACK_WATCH_AREA_SIZE 32
+#define STACK_WATCH_POINT_NUMBER (SOC_CPU_WATCHPOINTS_NUM - 1)
+
 void vPortSetStackWatchpoint(void *pxStackStart)
 {
     uint32_t addr = (uint32_t)pxStackStart;
     addr = (addr + (STACK_WATCH_AREA_SIZE - 1)) & (~(STACK_WATCH_AREA_SIZE - 1));
-    esp_set_watchpoint(7, (char *)addr, STACK_WATCH_AREA_SIZE, ESP_WATCHPOINT_STORE);
+    esp_set_watchpoint(STACK_WATCH_POINT_NUMBER, (char *)addr, STACK_WATCH_AREA_SIZE, ESP_WATCHPOINT_STORE);
 }
 
 uint32_t xPortGetTickRateHz(void) {

+ 4 - 1
components/freertos/port/xtensa/port.c

@@ -416,6 +416,9 @@ void vPortAssertIfInISR(void)
 	configASSERT(xPortInIsrContext());
 }
 
+#define STACK_WATCH_AREA_SIZE 32
+#define STACK_WATCH_POINT_NUMBER (SOC_CPU_WATCHPOINTS_NUM - 1)
+
 void vPortSetStackWatchpoint( void* pxStackStart ) {
 	//Set watchpoint 1 to watch the last 32 bytes of the stack.
 	//Unfortunately, the Xtensa watchpoints can't set a watchpoint on a random [base - base+n] region because
@@ -425,7 +428,7 @@ void vPortSetStackWatchpoint( void* pxStackStart ) {
 	//This way, we make sure we trigger before/when the stack canary is corrupted, not after.
 	int addr=(int)pxStackStart;
 	addr=(addr+31)&(~31);
-	esp_set_watchpoint(1, (char*)addr, 32, ESP_WATCHPOINT_STORE);
+	esp_set_watchpoint(STACK_WATCH_POINT_NUMBER, (char*)addr, 32, ESP_WATCHPOINT_STORE);
 }
 
 uint32_t xPortGetTickRateHz(void) {

+ 0 - 4
components/freertos/test/test_freertos_task_delay_until.c

@@ -24,8 +24,6 @@
 #define TICKS_TO_MS(x)  (((x)*1000)/TICK_RATE)
 #define REF_TO_ROUND_MS(x)    (((x)+500)/1000)
 
-#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S2)
-
 static SemaphoreHandle_t task_delete_semphr;
 
 static void delaying_task(void* arg)
@@ -73,5 +71,3 @@ TEST_CASE("Test vTaskDelayUntil", "[freertos]")
     vSemaphoreDelete(task_delete_semphr);
     ref_clock_deinit();
 }
-
-#endif // CONFIG_IDF_TARGET_ESP32S2

+ 0 - 4
components/newlib/test/test_shared_stack_printf.c

@@ -26,8 +26,6 @@ void another_external_stack_function(void)
     shared_stack_sp = (StackType_t *)get_sp();
 }
 
-#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)
-
 TEST_CASE("test printf using shared buffer stack", "[newlib]")
 {
     portSTACK_TYPE *shared_stack = malloc(SHARED_STACK_SIZE);
@@ -60,5 +58,3 @@ TEST_CASE("test printf using shared buffer stack", "[newlib]")
     vSemaphoreDelete(printf_lock);
     free(shared_stack);
 }
-
-#endif

+ 3 - 8
components/riscv/expression_with_stack_riscv.c

@@ -15,6 +15,8 @@
 #include <esp_expression_with_stack.h>
 #include <riscv/rvruntime-frames.h>
 #include <string.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/portmacro.h"
 
 static portMUX_TYPE shared_stack_spinlock = portMUX_INITIALIZER_UNLOCKED;
 static void *current_task_stack = NULL;
@@ -23,11 +25,6 @@ extern void esp_shared_stack_invoke_function(shared_stack_function function, voi
 
 static StackType_t *esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
 {
-#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
-    // TODO ESP32-C3 IDF-2207
-    // esp_clear_watchpoint(1);
-    // uint32_t watchpoint_place = ((uint32_t)stack + 32) & ~0x1f ;
-#endif
     //We need also to tweak current task stackpointer to avoid erroneous
     //stack overflow indication, so fills the stack with freertos known pattern:
     memset(stack, 0xa5U, stack_size * sizeof(StackType_t));
@@ -45,10 +42,8 @@ static StackType_t *esp_switch_stack_setup(StackType_t *stack, size_t stack_size
     adjusted_top_of_stack--;
 
 #if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
-    // TODO ESP32-C3 IDF-2207
-    //esp_set_watchpoint(1, (uint8_t *)watchpoint_place, 32, ESP_WATCHPOINT_STORE);
+    vPortSetStackWatchpoint(stack);
 #endif
-
     return ((StackType_t *)adjusted_top_of_stack);
 }
 

+ 6 - 3
components/spi_flash/test/test_mmap.c

@@ -153,8 +153,11 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
     TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
 }
 
-#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)
-// TODO ESP32C3 IDF-2458
+#if !DISABLED_FOR_TARGETS(ESP32C3)
+/* On C3 the cache is programmatically split between Icache and dcache and with the default setup we dont leave a lot pages
+   available for additional mmaps into instruction space. Disabling this test for now since any hypothetical use case for this
+   is no longer supported "out of the box"
+*/
 
 TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
 {
@@ -212,7 +215,7 @@ TEST_CASE("Can mmap into instruction address space", "[spi_flash][mmap]")
 
 }
 
-#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)
+#endif //!DISABLED_FOR_TARGETS(ESP32C3)
 
 
 TEST_CASE("Can mmap unordered pages into contiguous memory", "[spi_flash][mmap]")

+ 0 - 6
components/vfs/test/test_vfs_select.c

@@ -206,9 +206,6 @@ TEST_CASE("UART can do select()", "[vfs]")
     deinit(uart_fd, socket_fd);
 }
 
-#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)
-// TODO ESP32C3 IDF-2457
-
 TEST_CASE("UART can do poll()", "[vfs]")
 {
     int uart_fd;
@@ -270,9 +267,6 @@ TEST_CASE("UART can do poll()", "[vfs]")
     deinit(uart_fd, socket_fd);
 }
 
-#endif //!TEMPORARY_DISABLED_FOR_TARGETS(ESP32C3)
-
-
 TEST_CASE("socket can do select()", "[vfs]")
 {
     int uart_fd;

+ 3 - 5
components/xtensa/expression_with_stack_xtensa.c

@@ -17,6 +17,8 @@
 #include <freertos/xtensa_context.h>
 #include <setjmp.h>
 #include <string.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/portmacro.h"
 
 StackType_t *xtensa_shared_stack;
 shared_stack_function xtensa_shared_stack_callback;
@@ -29,10 +31,6 @@ extern void esp_shared_stack_invoke_function(void);
 
 static void esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
 {
-#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
-    esp_clear_watchpoint(1);
-    uint32_t watchpoint_place = ((uint32_t)stack + 32) & ~0x1f ;
-#endif
     //We need also to tweak current task stackpointer to avoid erroneous
     //stack overflow indication, so fills the stack with freertos known pattern:
     memset(stack, 0xa5U, stack_size * sizeof(StackType_t));
@@ -48,7 +46,7 @@ static void esp_switch_stack_setup(StackType_t *stack, size_t stack_size)
     top_of_stack =  (StackType_t *)(((UBaseType_t)(top_of_stack - 16) & ~0xf));
 
 #if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK
-    esp_set_watchpoint(1, (uint8_t *)watchpoint_place, 32, ESP_WATCHPOINT_STORE);
+    vPortSetStackWatchpoint(stack);
 #endif
 
     xtensa_shared_stack = top_of_stack;

+ 1 - 1
tools/ci/config/target-test.yml

@@ -581,7 +581,7 @@ UT_046:
 
 UT_C3:
   extends: .unit_test_c3_template
-  parallel: 28
+  parallel: 29
   tags:
     - ESP32C3_IDF
     - UT_T1_1