feat(newlib): add test for newlib_nano with esp32-psram

This commit is contained in:
Alexey Lapshin
2025-08-11 14:38:34 +07:00
parent 4dc6cb3fa1
commit 8f97220a48
9 changed files with 157 additions and 8 deletions

View File

@@ -33,10 +33,13 @@
/* void longjmp (jmp_buf env, int val) */ /* void longjmp (jmp_buf env, int val) */
.align 4
.literal_position .literal_position
#if CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM
.section .iram1,"ax"
#endif
.global __wrap_longjmp .global __wrap_longjmp
.type __wrap_longjmp, @function .type __wrap_longjmp, @function
.align 4
__wrap_longjmp: __wrap_longjmp:
entry sp, 16 entry sp, 16
@@ -63,7 +66,7 @@ __wrap_longjmp:
/* /*
If not on S3, replacement of only the first instructions, If not on S3, replacement of only the first instructions,
then jump back to original longjmp implementation. then jump back to original longjmp implementation.
The jump target is the instrucion The jump target is the instruction
l32i a0, a2, 64 l32i a0, a2, 64
of the original code. Hence, the original code's entry instruction and windowstart modification are left of the original code. Hence, the original code's entry instruction and windowstart modification are left
out. out.

View File

@@ -74,6 +74,7 @@ list(APPEND ldfragments "src/newlib.lf" "src/system_libs.lf")
if(CONFIG_LIBC_NEWLIB) if(CONFIG_LIBC_NEWLIB)
list(APPEND ldfragments src/libc.lf) list(APPEND ldfragments src/libc.lf)
list(APPEND ldfragments src/libm.lf)
else() else()
list(APPEND ldfragments src/picolibc/libc.lf) list(APPEND ldfragments src/picolibc/libc.lf)
endif() endif()

View File

@@ -35,8 +35,8 @@ entries:
libc_a-labs (noflash) libc_a-labs (noflash)
libc_a-ldiv (noflash) libc_a-ldiv (noflash)
libc_a-quorem (noflash) libc_a-quorem (noflash)
libc_a-s_fpclassify (noflash) libm_a-s_fpclassify (noflash)
libc_a-sf_nan (noflash) libm_a-sf_nan (noflash)
if SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM = y: if SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM = y:
libc_a-utoa (noflash) libc_a-utoa (noflash)
@@ -47,6 +47,7 @@ entries:
if SPIRAM_CACHE_LIBIO_IN_IRAM = y: if SPIRAM_CACHE_LIBIO_IN_IRAM = y:
libc_a-wcrtomb (noflash) libc_a-wcrtomb (noflash)
libc_a-fwrite (noflash)
libc_a-fvwrite (noflash) libc_a-fvwrite (noflash)
libc_a-wbuf (noflash) libc_a-wbuf (noflash)
libc_a-wsetup (noflash) libc_a-wsetup (noflash)
@@ -144,9 +145,9 @@ entries:
libc_a-getenv_r (noflash) libc_a-getenv_r (noflash)
if SPIRAM_CACHE_LIBFILE_IN_IRAM = y: if SPIRAM_CACHE_LIBFILE_IN_IRAM = y:
lock (noflash) libc_a-lock (noflash)
isatty (noflash) libc_a-isatty (noflash)
creat (noflash) libc_a-creat (noflash)
libc_a-fclose (noflash) libc_a-fclose (noflash)
libc_a-open (noflash) libc_a-open (noflash)
libc_a-close (noflash) libc_a-close (noflash)

View File

@@ -0,0 +1,10 @@
[mapping:libm]
archive:
if LIBC_NEWLIB_NANO_FORMAT = y:
libm_nano.a
else:
libm.a
entries:
if SPIRAM_CACHE_LIBMATH_IN_IRAM = y:
libm_a-s_fpclassify (noflash)
libm_a-sf_nan (noflash)

View File

@@ -11,6 +11,7 @@
#include <errno.h> #include <errno.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "esp_attr.h"
#if CONFIG_IDF_TOOLCHAIN_GCC #if CONFIG_IDF_TOOLCHAIN_GCC
#include <sys/statvfs.h> #include <sys/statvfs.h>
@@ -121,11 +122,17 @@ int fstat(int fd, struct stat *st)
return _fstat_r(__getreent(), fd, st); return _fstat_r(__getreent(), fd, st);
} }
#if CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM
IRAM_ATTR
#endif
int raise(int sig) int raise(int sig)
{ {
return _raise_r(__getreent(), sig); return _raise_r(__getreent(), sig);
} }
#if CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM
IRAM_ATTR
#endif
int system(const char* str) int system(const char* str)
{ {
return _system_r(__getreent(), str); return _system_r(__getreent(), str);

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Unlicense OR CC0-1.0 * SPDX-License-Identifier: Unlicense OR CC0-1.0
*/ */
@@ -12,6 +12,9 @@
#include <time.h> #include <time.h>
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
#include <wchar.h>
#include <unistd.h>
#include <fcntl.h>
#include "unity.h" #include "unity.h"
#include "sdkconfig.h" #include "sdkconfig.h"
#include "soc/soc.h" #include "soc/soc.h"
@@ -194,6 +197,112 @@ TEST_CASE("test 64bit int formats", "[newlib]")
TEST_ASSERT_EQUAL(val, sval); TEST_ASSERT_EQUAL(val, sval);
} }
#else // CONFIG_NEWLIB_NANO_FORMAT #else // CONFIG_NEWLIB_NANO_FORMAT
#if CONFIG_SPIRAM_CACHE_WORKAROUND
static bool fn_in_iram(void *fn)
{
const uintptr_t fnaddr = (int)fn;
return (fnaddr >= SOC_IRAM_LOW && fnaddr < SOC_IRAM_HIGH);
}
TEST_CASE("Libc_nano in IRAM", "[newlib_nano]")
{
TEST_ASSERT_TRUE(fn_in_iram(itoa));
TEST_ASSERT_TRUE(fn_in_iram(memcmp));
TEST_ASSERT_TRUE(fn_in_iram(memcpy));
TEST_ASSERT_TRUE(fn_in_iram(memset));
TEST_ASSERT_TRUE(fn_in_iram(strcat));
TEST_ASSERT_TRUE(fn_in_iram(strcmp));
TEST_ASSERT_TRUE(fn_in_iram(strlen));
TEST_ASSERT_TRUE(fn_in_iram(longjmp));
TEST_ASSERT_TRUE(fn_in_iram(abs));
TEST_ASSERT_TRUE(fn_in_iram(div));
TEST_ASSERT_TRUE(fn_in_iram(labs));
TEST_ASSERT_TRUE(fn_in_iram(ldiv));
TEST_ASSERT_TRUE(fn_in_iram(__fpclassifyd));
TEST_ASSERT_TRUE(fn_in_iram(nanf));
TEST_ASSERT_TRUE(fn_in_iram(utoa));
TEST_ASSERT_TRUE(fn_in_iram(atoi));
TEST_ASSERT_TRUE(fn_in_iram(atol));
TEST_ASSERT_TRUE(fn_in_iram(strtol));
TEST_ASSERT_TRUE(fn_in_iram(strtoul));
TEST_ASSERT_TRUE(fn_in_iram(wcrtomb));
TEST_ASSERT_TRUE(fn_in_iram(_fwrite_r));
TEST_ASSERT_TRUE(fn_in_iram(__swbuf_r));
TEST_ASSERT_TRUE(fn_in_iram(fputwc));
TEST_ASSERT_TRUE(fn_in_iram(_wctomb_r));
TEST_ASSERT_TRUE(fn_in_iram(ungetc));
TEST_ASSERT_TRUE(fn_in_iram(fflush));
TEST_ASSERT_TRUE(fn_in_iram(asctime));
TEST_ASSERT_TRUE(fn_in_iram(asctime_r));
TEST_ASSERT_TRUE(fn_in_iram(ctime));
TEST_ASSERT_TRUE(fn_in_iram(ctime_r));
TEST_ASSERT_TRUE(fn_in_iram(localtime));
TEST_ASSERT_TRUE(fn_in_iram(gmtime));
TEST_ASSERT_TRUE(fn_in_iram(gmtime_r));
TEST_ASSERT_TRUE(fn_in_iram(strftime));
TEST_ASSERT_TRUE(fn_in_iram(mktime));
TEST_ASSERT_TRUE(fn_in_iram(_tzset_r));
TEST_ASSERT_TRUE(fn_in_iram(time));
TEST_ASSERT_TRUE(fn_in_iram(strptime));
TEST_ASSERT_TRUE(fn_in_iram(toupper));
TEST_ASSERT_TRUE(fn_in_iram(tolower));
TEST_ASSERT_TRUE(fn_in_iram(toascii));
TEST_ASSERT_TRUE(fn_in_iram(strupr));
TEST_ASSERT_TRUE(fn_in_iram(bzero));
TEST_ASSERT_TRUE(fn_in_iram(isalnum));
TEST_ASSERT_TRUE(fn_in_iram(isalpha));
TEST_ASSERT_TRUE(fn_in_iram(isascii));
TEST_ASSERT_TRUE(fn_in_iram(isblank));
TEST_ASSERT_TRUE(fn_in_iram(iscntrl));
TEST_ASSERT_TRUE(fn_in_iram(isdigit));
TEST_ASSERT_TRUE(fn_in_iram(isgraph));
TEST_ASSERT_TRUE(fn_in_iram(islower));
TEST_ASSERT_TRUE(fn_in_iram(isprint));
TEST_ASSERT_TRUE(fn_in_iram(ispunct));
TEST_ASSERT_TRUE(fn_in_iram(isspace));
TEST_ASSERT_TRUE(fn_in_iram(isupper));
TEST_ASSERT_TRUE(fn_in_iram(memccpy));
TEST_ASSERT_TRUE(fn_in_iram(memchr));
TEST_ASSERT_TRUE(fn_in_iram(memmove));
TEST_ASSERT_TRUE(fn_in_iram(memrchr));
TEST_ASSERT_TRUE(fn_in_iram(strcasecmp));
TEST_ASSERT_TRUE(fn_in_iram(strcasestr));
TEST_ASSERT_TRUE(fn_in_iram(strchr));
TEST_ASSERT_TRUE(fn_in_iram(strcoll));
TEST_ASSERT_TRUE(fn_in_iram(strcpy));
TEST_ASSERT_TRUE(fn_in_iram(strcspn));
TEST_ASSERT_TRUE(fn_in_iram(strdup));
TEST_ASSERT_TRUE(fn_in_iram(_strdup_r));
TEST_ASSERT_TRUE(fn_in_iram(strlcat));
TEST_ASSERT_TRUE(fn_in_iram(strlcpy));
TEST_ASSERT_TRUE(fn_in_iram(strlwr));
TEST_ASSERT_TRUE(fn_in_iram(strncasecmp));
TEST_ASSERT_TRUE(fn_in_iram(strncat));
TEST_ASSERT_TRUE(fn_in_iram(strncmp));
TEST_ASSERT_TRUE(fn_in_iram(strncpy));
TEST_ASSERT_TRUE(fn_in_iram(strndup));
TEST_ASSERT_TRUE(fn_in_iram(_strndup_r));
TEST_ASSERT_TRUE(fn_in_iram(strnlen));
TEST_ASSERT_TRUE(fn_in_iram(strrchr));
TEST_ASSERT_TRUE(fn_in_iram(strsep));
TEST_ASSERT_TRUE(fn_in_iram(strspn));
TEST_ASSERT_TRUE(fn_in_iram(strstr));
TEST_ASSERT_TRUE(fn_in_iram(strtok_r));
TEST_ASSERT_TRUE(fn_in_iram(strupr));
TEST_ASSERT_TRUE(fn_in_iram(srand));
TEST_ASSERT_TRUE(fn_in_iram(rand));
TEST_ASSERT_TRUE(fn_in_iram(rand_r));
TEST_ASSERT_TRUE(fn_in_iram(_getenv_r));
TEST_ASSERT_TRUE(fn_in_iram(isatty));
TEST_ASSERT_TRUE(fn_in_iram(fclose));
TEST_ASSERT_TRUE(fn_in_iram(creat));
TEST_ASSERT_TRUE(fn_in_iram(_fwalk_sglue));
TEST_ASSERT_TRUE(fn_in_iram(__sinit));
TEST_ASSERT_TRUE(fn_in_iram(raise));
TEST_ASSERT_TRUE(fn_in_iram(system));
}
#endif // SPIRAM_CACHE_WORKAROUND
TEST_CASE("test 64bit int formats", "[newlib]") TEST_CASE("test 64bit int formats", "[newlib]")
{ {
char* res = NULL; char* res = NULL;

View File

@@ -0,0 +1,16 @@
CONFIG_IDF_TARGET="esp32"
CONFIG_LIBC_NEWLIB_NANO_FORMAT=y
CONFIG_SPIRAM=y
CONFIG_SPIRAM_CACHE_WORKAROUND=y
CONFIG_SPIRAM_CACHE_LIBJMP_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMATH_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBIO_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBTIME_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBCHAR_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMEM_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBSTR_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBRAND_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBENV_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBFILE_IN_IRAM=y
CONFIG_SPIRAM_CACHE_LIBMISC_IN_IRAM=y

View File

@@ -445,6 +445,7 @@ components/esp_rom/include/esp_rom_crc.h
components/esp_rom/linux/esp_rom_crc.c components/esp_rom/linux/esp_rom_crc.c
components/esp_rom/linux/esp_rom_md5.c components/esp_rom/linux/esp_rom_md5.c
components/esp_rom/patches/esp_rom_crc.c components/esp_rom/patches/esp_rom_crc.c
components/esp_rom/patches/esp_rom_longjmp.S
components/esp_system/ubsan.c components/esp_system/ubsan.c
components/esp_wifi/src/mesh_event.c components/esp_wifi/src/mesh_event.c
components/fatfs/diskio/diskio.c components/fatfs/diskio/diskio.c

View File

@@ -1,4 +1,5 @@
libc libc
libm
sha256_coredump sha256_coredump
gcc gcc
clang_rt_builtins clang_rt_builtins