From b61b33d4196fda0a673926fa7c9ccb7389e7feab Mon Sep 17 00:00:00 2001 From: 461911662 <461911662@qq.com> Date: Thu, 19 Mar 2026 18:18:11 +0800 Subject: [PATCH] arch/xtensa/esp32s3: Fix ROM strdup heap issue in USER_HEAP mode In ESP32-S3 flat build with USER_HEAP mode, ROM strdup internally calls malloc which may be mapped to a different heap than lib_free, causing cross-heap allocation issues and system crashes. This commit adds a new Kconfig option ESP32S3_DONT_USE_ROM_LIBC to allow using NuttX libc instead of ROM newlib functions. When USER_HEAP mode is selected, this option is automatically enabled. Fixes: 60ca804b56 ("esp32s3: Fix bug related to the PSRAM-allocated task stack") Signed-off-by: 461911662 <461911662@qq.com> Reviewed-by: Tiago Medicci Serrano Reviewed-by: Almir Okato Reviewed-by: Eren Terzioglu --- arch/xtensa/src/esp32s3/Kconfig | 11 +++++++++++ arch/xtensa/src/esp32s3/hal.mk | 6 +++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/arch/xtensa/src/esp32s3/Kconfig b/arch/xtensa/src/esp32s3/Kconfig index e70abbe56ff57..08e0428bff6db 100644 --- a/arch/xtensa/src/esp32s3/Kconfig +++ b/arch/xtensa/src/esp32s3/Kconfig @@ -1102,6 +1102,7 @@ config ESP32S3_SPIRAM_USER_HEAP depends on SCHED_LPWORK select ESP32S3_SPI_FLASH_SUPPORT_PSRAM_STACK if ESP32S3_SPIFLASH select MM_KERNEL_HEAP + select ESP32S3_DONT_USE_ROM_LIBC endchoice # ESP32S3_SPIRAM_HEAP @@ -1110,6 +1111,16 @@ config ESP32S3_RTC_HEAP select ARCH_HAVE_EXTRA_HEAPS default n +config ESP32S3_DONT_USE_ROM_LIBC + bool "Don't use ROM libc functions" + default n + ---help--- + If enabled, NuttX libc will be used instead of ROM newlib + functions (strdup, strndup, atoi, etc.). + + This is required when using flat build with USER_HEAP mode + to avoid heap allocation issues with ROM strdup. + config ESP32S3_SPIRAM_MAP bool "Remap the size and offset of SPIRAM virtual address" depends on ESP32S3_SPIRAM diff --git a/arch/xtensa/src/esp32s3/hal.mk b/arch/xtensa/src/esp32s3/hal.mk index f728d2e4bd159..c41263a169616 100644 --- a/arch/xtensa/src/esp32s3/hal.mk +++ b/arch/xtensa/src/esp32s3/hal.mk @@ -94,7 +94,11 @@ ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM) ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.ld ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.libc.ld ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.libgcc.ld -ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.newlib.ld +ifeq ($(CONFIG_ESP32S3_DONT_USE_ROM_LIBC),y) + # Use NuttX libc instead of ROM newlib functions +else + ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.newlib.ld +endif ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.version.ld ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)esp_rom$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).rom.wdt.ld ARCHSCRIPT += $(ARCH_SRCDIR)$(DELIM)chip$(DELIM)$(ESP_HAL_3RDPARTY_REPO)$(DELIM)components$(DELIM)soc$(DELIM)$(CHIP_SERIES)$(DELIM)ld$(DELIM)$(CHIP_SERIES).peripherals.ld