feat(newlib): add picolibc support

This commit is contained in:
Alexey Lapshin 2024-09-26 13:13:20 +07:00
parent 22a38779fb
commit 888b5f7e8d
171 changed files with 8438 additions and 1016 deletions

View File

@ -1,4 +1,4 @@
[codespell] [codespell]
skip = build,*.yuv,components/fatfs/src/*,alice.txt,*.rgb,components/wpa_supplicant/*,components/esp_wifi/*,*.pem skip = build,*.yuv,components/fatfs/src/*,alice.txt,*.rgb,components/wpa_supplicant/*,components/esp_wifi/*,*.pem,components/newlib/COPYING.*
ignore-words-list = ser,dout,rsource,fram,inout,shs,ans,aci,unstall,unstalling,hart,wheight,wel,ot,fane,assertIn,registr,oen,parms ignore-words-list = ser,dout,rsource,fram,inout,shs,ans,aci,unstall,unstalling,hart,wheight,wel,ot,fane,assertIn,registr,oen,parms
write-changes = true write-changes = true

View File

@ -14,6 +14,7 @@ repos:
# 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always) # 2 - any file matching *test*/*expected* (for host tests, if possible use this naming pattern always)
# 3 - any directory named 'testdata' # 3 - any directory named 'testdata'
# 4 - protobuf auto-generated files # 4 - protobuf auto-generated files
# 5 - COPYING files
exclude: &whitespace_excludes | exclude: &whitespace_excludes |
(?x)^( (?x)^(
.+\.(md|rst|map|bin)| .+\.(md|rst|map|bin)|
@ -23,7 +24,8 @@ repos:
.*.pb-c.h| .*.pb-c.h|
.*.pb-c.c| .*.pb-c.c|
.*.yuv| .*.yuv|
.*.rgb .*.rgb|
.*COPYING.*
)$ )$
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: *whitespace_excludes exclude: *whitespace_excludes

View File

@ -696,3 +696,4 @@ mainmenu "Espressif IoT Development Framework Configuration"
- CONFIG_ESP_WIFI_ENABLE_ROAMING_APP - CONFIG_ESP_WIFI_ENABLE_ROAMING_APP
- CONFIG_USB_HOST_EXT_PORT_SUPPORT_LS - CONFIG_USB_HOST_EXT_PORT_SUPPORT_LS
- CONFIG_USB_HOST_EXT_PORT_RESET_ATTEMPTS - CONFIG_USB_HOST_EXT_PORT_RESET_ATTEMPTS
- CONFIG_LIBC_PICOLIBC

View File

@ -134,8 +134,10 @@ static int selected_boot_partition(const bootloader_state_t *bs)
return boot_index; return boot_index;
} }
#if CONFIG_LIBC_NEWLIB
// Return global reent struct if any newlib functions are linked to bootloader // Return global reent struct if any newlib functions are linked to bootloader
struct _reent *__getreent(void) struct _reent *__getreent(void)
{ {
return _GLOBAL_REENT; return _GLOBAL_REENT;
} }
#endif

View File

@ -20,6 +20,7 @@
#define _HASH_MAP_H_ #define _HASH_MAP_H_
#include <stdbool.h> #include <stdbool.h>
#include <stddef.h>
#include <stdint.h> #include <stdint.h>
struct hash_map_t; struct hash_map_t;

View File

@ -112,7 +112,8 @@
// On Linux, we don't need __fbufsize (see comments below), and // On Linux, we don't need __fbufsize (see comments below), and
// __fbufsize not available on MacOS (which is also considered "Linux" target) // __fbufsize not available on MacOS (which is also considered "Linux" target)
#include <stdio_ext.h> // for __fbufsize #include <stdio_ext.h> // for __fbufsize
#endif #endif // !CONFIG_IDF_TARGET_LINUX
#include <stddef.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@ -226,10 +227,15 @@ static void flushWrite(void) {
// Performance on Linux is not considered as critical as on chip targets. Additionally, // Performance on Linux is not considered as critical as on chip targets. Additionally,
// MacOS does not have __fbufsize. // MacOS does not have __fbufsize.
#if !CONFIG_IDF_TARGET_LINUX #if !CONFIG_IDF_TARGET_LINUX
if (__fbufsize(stdout) > 0) { #if CONFIG_LIBC_PICOLIBC
if (((struct __file_bufio *)(stdout))->len > 0)
#else // CONFIG_LIBC_PICOLIBC
if (__fbufsize(stdout) > 0)
#endif // CONFIG_LIBC_PICOLIBC
{
fflush(stdout); fflush(stdout);
} }
#endif #endif // !CONFIG_IDF_TARGET_LINUX
fsync(fileno(stdout)); fsync(fileno(stdout));
} }

View File

@ -5,6 +5,7 @@
*/ */
#include "sdkconfig.h" #include "sdkconfig.h"
#include <sys/lock.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "esp_log.h" #include "esp_log.h"

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in the TWAI driver, the threshold is left for that case // Some resources are lazy allocated in the TWAI driver, the threshold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (200) #define TEST_MEMORY_LEAK_THRESHOLD (200)

View File

@ -17,6 +17,7 @@
#else #else
#include "sha/sha_block.h" #include "sha/sha_block.h"
#endif #endif
#include "esp_newlib.h"
#if SOC_SHA_SUPPORT_SHA512 #if SOC_SHA_SUPPORT_SHA512
#define SHA_TYPE SHA2_512 #define SHA_TYPE SHA2_512

View File

@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <sys/lock.h>
#include <sys/param.h> #include <sys/param.h>
#include "hal/gpio_ll.h" #include "hal/gpio_ll.h"
#include "hal/cam_ll.h" #include "hal/cam_ll.h"

View File

@ -8,6 +8,7 @@
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in gpio/rtcio driver, the threshold is left for that case // Some resources are lazy allocated in gpio/rtcio driver, the threshold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (100) #define TEST_MEMORY_LEAK_THRESHOLD (100)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in the driver, the threshold is left for that case // Some resources are lazy allocated in the driver, the threshold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (300) #define TEST_MEMORY_LEAK_THRESHOLD (300)

View File

@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <sys/lock.h>
#include "esp_check.h" #include "esp_check.h"
#include "esp_clk_tree.h" #include "esp_clk_tree.h"
#include "esp_private/esp_clk_tree_common.h" #include "esp_private/esp_clk_tree_common.h"

View File

@ -3,6 +3,7 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <sys/lock.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include "sdkconfig.h" #include "sdkconfig.h"

View File

@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
#include <string.h> #include <string.h>
#include <sys/lock.h>
#include <sys/param.h> #include <sys/param.h>
#include "esp_types.h" #include "esp_types.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in LEDC driver, the threshold is left for that case // Some resources are lazy allocated in LEDC driver, the threshold is left for that case
// This leak is large since LEDC driver does not provide channel delete mechanism // This leak is large since LEDC driver does not provide channel delete mechanism

View File

@ -8,6 +8,7 @@
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in pulse_cnt driver, the threshold is left for that case // Some resources are lazy allocated in pulse_cnt driver, the threshold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (400) #define TEST_MEMORY_LEAK_THRESHOLD (400)

View File

@ -8,6 +8,7 @@
#include <stdint.h> #include <stdint.h>
#include <sys/queue.h> #include <sys/queue.h>
#include <sys/lock.h>
#include "sdkconfig.h" #include "sdkconfig.h"
#include "driver/ppa.h" #include "driver/ppa.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
// Some resources are lazy allocated in the driver, the threshold is left for that case // Some resources are lazy allocated in the driver, the threshold is left for that case

View File

@ -8,6 +8,7 @@
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated in RMT driver, so we reserved this threadhold when checking memory leak // Some resources are lazy allocated in RMT driver, so we reserved this threadhold when checking memory leak
// A better way to check a potential memory leak is running a same case by twice, for the second time, the memory usage delta should be zero // A better way to check a potential memory leak is running a same case by twice, for the second time, the memory usage delta should be zero

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#include "sdkconfig.h" #include "sdkconfig.h"
#define TEST_MEMORY_LEAK_THRESHOLD (300) #define TEST_MEMORY_LEAK_THRESHOLD (300)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// iterator to load partition tables in `test spi bus lock, with flash` will lead memory not free // iterator to load partition tables in `test spi bus lock, with flash` will lead memory not free
#define TEST_MEMORY_LEAK_THRESHOLD (350) #define TEST_MEMORY_LEAK_THRESHOLD (350)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#define TEST_MEMORY_LEAK_THRESHOLD (200) #define TEST_MEMORY_LEAK_THRESHOLD (200)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#define TEST_MEMORY_LEAK_THRESHOLD (200) #define TEST_MEMORY_LEAK_THRESHOLD (200)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#define TEST_MEMORY_LEAK_THRESHOLD (200) #define TEST_MEMORY_LEAK_THRESHOLD (200)

View File

@ -27,17 +27,17 @@
// Token signifying that no character is available // Token signifying that no character is available
#define NONE -1 #define NONE -1
#if CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF #if CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CRLF # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CRLF
#elif CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR #elif CONFIG_LIBC_STDOUT_LINE_ENDING_CR
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CR # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CR
#else #else
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_LF # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_LF
#endif #endif
#if CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF #if CONFIG_LIBC_STDIN_LINE_ENDING_CRLF
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CRLF # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CRLF
#elif CONFIG_NEWLIB_STDIN_LINE_ENDING_CR #elif CONFIG_LIBC_STDIN_LINE_ENDING_CR
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CR # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CR
#else #else
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_LF # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_LF
@ -226,6 +226,8 @@ static int uart_rx_char_via_driver(int fd)
static ssize_t uart_write(int fd, const void * data, size_t size) static ssize_t uart_write(int fd, const void * data, size_t size)
{ {
assert(fd >= 0 && fd < 3); assert(fd >= 0 && fd < 3);
tx_func_t tx_func = s_ctx[fd]->tx_func;
esp_line_endings_t tx_mode = s_ctx[fd]->tx_mode;
const char *data_c = (const char *)data; const char *data_c = (const char *)data;
/* Even though newlib does stream locking on each individual stream, we need /* Even though newlib does stream locking on each individual stream, we need
* a dedicated UART lock if two streams (stdout and stderr) point to the * a dedicated UART lock if two streams (stdout and stderr) point to the
@ -234,13 +236,13 @@ static ssize_t uart_write(int fd, const void * data, size_t size)
_lock_acquire_recursive(&s_ctx[fd]->write_lock); _lock_acquire_recursive(&s_ctx[fd]->write_lock);
for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) {
int c = data_c[i]; int c = data_c[i];
if (c == '\n' && s_ctx[fd]->tx_mode != ESP_LINE_ENDINGS_LF) { if (c == '\n' && tx_mode != ESP_LINE_ENDINGS_LF) {
s_ctx[fd]->tx_func(fd, '\r'); tx_func(fd, '\r');
if (s_ctx[fd]->tx_mode == ESP_LINE_ENDINGS_CR) { if (tx_mode == ESP_LINE_ENDINGS_CR) {
continue; continue;
} }
} }
s_ctx[fd]->tx_func(fd, c); tx_func(fd, c);
} }
_lock_release_recursive(&s_ctx[fd]->write_lock); _lock_release_recursive(&s_ctx[fd]->write_lock);
return size; return size;

View File

@ -8,6 +8,7 @@
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#define TEST_MEMORY_LEAK_THRESHOLD (200) #define TEST_MEMORY_LEAK_THRESHOLD (200)

View File

@ -8,6 +8,7 @@
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#define TEST_MEMORY_LEAK_THRESHOLD (212) #define TEST_MEMORY_LEAK_THRESHOLD (212)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated, the threadhold is left for that case // Some resources are lazy allocated, the threadhold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (500) #define TEST_MEMORY_LEAK_THRESHOLD (500)

View File

@ -35,17 +35,17 @@
// Token signifying that no character is available // Token signifying that no character is available
#define NONE -1 #define NONE -1
#if CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF #if CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CRLF # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CRLF
#elif CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR #elif CONFIG_LIBC_STDOUT_LINE_ENDING_CR
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CR # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_CR
#else #else
# define DEFAULT_TX_MODE ESP_LINE_ENDINGS_LF # define DEFAULT_TX_MODE ESP_LINE_ENDINGS_LF
#endif #endif
#if CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF #if CONFIG_LIBC_STDIN_LINE_ENDING_CRLF
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CRLF # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CRLF
#elif CONFIG_NEWLIB_STDIN_LINE_ENDING_CR #elif CONFIG_LIBC_STDIN_LINE_ENDING_CR
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CR # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_CR
#else #else
# define DEFAULT_RX_MODE ESP_LINE_ENDINGS_LF # define DEFAULT_RX_MODE ESP_LINE_ENDINGS_LF

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// Some resources are lazy allocated, the threadhold is left for that case // Some resources are lazy allocated, the threadhold is left for that case
#define TEST_MEMORY_LEAK_THRESHOLD (500) #define TEST_MEMORY_LEAK_THRESHOLD (500)

View File

@ -5,6 +5,7 @@
*/ */
#include <string.h> #include <string.h>
#include "sys/reent.h"
#include "esp_gdbstub.h" #include "esp_gdbstub.h"
#include "esp_gdbstub_common.h" #include "esp_gdbstub_common.h"
#include "esp_gdbstub_memory_regions.h" #include "esp_gdbstub_memory_regions.h"
@ -21,6 +22,7 @@
#include "hal/wdt_hal.h" #include "hal/wdt_hal.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "sdkconfig.h"
#ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS #ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS
static inline int gdb_tid_to_task_index(int tid); static inline int gdb_tid_to_task_index(int tid);
@ -41,7 +43,6 @@ static bool command_name_matches(const char *pattern, const unsigned char *ucmd,
#endif // (CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME || CONFIG_ESP_GDBSTUB_SUPPORT_TASKS) #endif // (CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME || CONFIG_ESP_GDBSTUB_SUPPORT_TASKS)
static void send_reason(void); static void send_reason(void);
static char gdb_packet(char *dest_buff, char *src_buff, int len);
esp_gdbstub_scratch_t s_scratch; esp_gdbstub_scratch_t s_scratch;
esp_gdbstub_gdb_regfile_t *gdb_local_regfile = &s_scratch.regfile; esp_gdbstub_gdb_regfile_t *gdb_local_regfile = &s_scratch.regfile;
@ -237,8 +238,12 @@ void gdbstub_handle_uart_int(esp_gdbstub_frame_t *regs_frame)
if (doDebug) { if (doDebug) {
process_gdb_kill = false; process_gdb_kill = false;
/* To enable console output in GDB, we replace the default stdout->_write function */ /* To enable console output in GDB, we replace the default stdout->_write function */
#if CONFIG_LIBC_NEWLIB
stdout->_write = gdbstub__swrite; stdout->_write = gdbstub__swrite;
stderr->_write = gdbstub__swrite; stderr->_write = gdbstub__swrite;
#else
// TODO IDF-11287
#endif
/* Stall other core until GDB exit */ /* Stall other core until GDB exit */
esp_gdbstub_stall_other_cpus_start(); esp_gdbstub_stall_other_cpus_start();
#ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS #ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS
@ -753,8 +758,12 @@ int esp_gdbstub_handle_command(unsigned char *cmd, int len)
} else if (cmd[0] == 'k') { } else if (cmd[0] == 'k') {
/* Kill GDB and continue without */ /* Kill GDB and continue without */
/* By exit from GDB we have to replcae stdout->_write back */ /* By exit from GDB we have to replcae stdout->_write back */
#if CONFIG_LIBC_NEWLIB
stdout->_write = __swrite; stdout->_write = __swrite;
stderr->_write = __swrite; stderr->_write = __swrite;
#else
// TODO IDF-11287
#endif
process_gdb_kill = true; process_gdb_kill = true;
return GDBSTUB_ST_CONT; return GDBSTUB_ST_CONT;
} else if (cmd[0] == 's') { } else if (cmd[0] == 's') {
@ -784,6 +793,35 @@ int esp_gdbstub_handle_command(unsigned char *cmd, int len)
} }
return GDBSTUB_ST_OK; return GDBSTUB_ST_OK;
} }
#if CONFIG_LIBC_NEWLIB
/** @brief Convert to ASCI
* Function convert byte value to two ASCI carecters
*/
void gdb_get_asci_char(unsigned char data, char *buff)
{
const char *hex_chars = "0123456789abcdef";
buff[0] = hex_chars[(data >> 4) & 0x0f];
buff[1] = hex_chars[(data) & 0x0f];
}
/** @brief Prepare GDB packet
* Function build GDB asci packet and return checksum
*
* Return checksum
*/
char gdb_packet(char *dest_buff, char *src_buff, int len)
{
char s_chsum = 0;
for (size_t i = 0; i < len; i++) {
gdb_get_asci_char(src_buff[i], &dest_buff[i * 2 + 0]);
}
for (size_t i = 0; i < len * 2; i++) {
s_chsum += dest_buff[i];
}
return s_chsum;
}
/** /**
* Replace standard __swrite function for GDB * Replace standard __swrite function for GDB
*/ */
@ -813,38 +851,12 @@ int gdbstub__swrite(struct _reent *data1, void *data2, const char *buff, int len
} }
return len; return len;
} }
#else
// TODO IDF-11287
/** @brief Convert to ASCI #endif // CONFIG_LIBC_NEWLIB
* Function convert byte value to two ASCI carecters
*/
void gdb_get_asci_char(unsigned char data, char *buff)
{
const char *hex_chars = "0123456789abcdef";
buff[0] = hex_chars[(data >> 4) & 0x0f];
buff[1] = hex_chars[(data) & 0x0f];
}
/* Everything below is related to the support for listing FreeRTOS tasks as threads in GDB */ /* Everything below is related to the support for listing FreeRTOS tasks as threads in GDB */
/** @brief Prepare GDB packet
* Function build GDB asci packet and return checksum
*
* Return checksum
*/
char gdb_packet(char *dest_buff, char *src_buff, int len)
{
char s_chsum = 0;
for (size_t i = 0; i < len; i++) {
gdb_get_asci_char(src_buff[i], &dest_buff[i * 2 + 0]);
}
for (size_t i = 0; i < len * 2; i++) {
s_chsum += dest_buff[i];
}
return s_chsum;
}
#if (CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME || CONFIG_ESP_GDBSTUB_SUPPORT_TASKS) #if (CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME || CONFIG_ESP_GDBSTUB_SUPPORT_TASKS)
static bool command_name_matches(const char *pattern, const unsigned char *ucmd, int len) static bool command_name_matches(const char *pattern, const unsigned char *ucmd, int len)
{ {

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_runner.h" #include "unity_test_runner.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
// Some resources are lazy allocated in the driver, the threshold is left for that case // Some resources are lazy allocated in the driver, the threshold is left for that case

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// load partition table in tests will use memory // load partition table in tests will use memory
#define TEST_MEMORY_LEAK_THRESHOLD (450) #define TEST_MEMORY_LEAK_THRESHOLD (450)

View File

@ -7,6 +7,7 @@
#include "unity.h" #include "unity.h"
#include "unity_test_utils.h" #include "unity_test_utils.h"
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_newlib.h"
// load partition table in tests will use memory // load partition table in tests will use memory
#define TEST_MEMORY_LEAK_THRESHOLD (450) #define TEST_MEMORY_LEAK_THRESHOLD (450)

View File

@ -6,6 +6,7 @@
#pragma once #pragma once
#include <sys/time.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
@ -101,7 +102,7 @@ void esp_netif_sntp_deinit(void);
/** /**
* @brief Wait for time sync event * @brief Wait for time sync event
* @param tout Specified timeout in RTOS ticks * @param tout Specified timeout in RTOS ticks
* @return ESP_TIMEOUT if sync event didn't came withing the timeout * @return ESP_TIMEOUT if sync event didn't came within the timeout
* ESP_ERR_NOT_FINISHED if the sync event came, but we're in smooth update mode and still in progress (SNTP_SYNC_STATUS_IN_PROGRESS) * ESP_ERR_NOT_FINISHED if the sync event came, but we're in smooth update mode and still in progress (SNTP_SYNC_STATUS_IN_PROGRESS)
* ESP_OK if time sync'ed * ESP_OK if time sync'ed
*/ */

View File

@ -5,6 +5,7 @@
*/ */
#pragma once #pragma once
#include <sys/lock.h>
#include "esp_phy_init.h" #include "esp_phy_init.h"
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -5,6 +5,7 @@
*/ */
#include <stdint.h> #include <stdint.h>
#include "sys/lock.h"
#include "esp_check.h" #include "esp_check.h"
#include "esp_log.h" #include "esp_log.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"

View File

@ -8,6 +8,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
#include <sys/lock.h>
#include <sys/param.h> #include <sys/param.h>
#include "sdkconfig.h" #include "sdkconfig.h"

View File

@ -147,22 +147,30 @@ if(BOOTLOADER_BUILD)
if(CONFIG_ESP_ROM_HAS_NEWLIB) if(CONFIG_ESP_ROM_HAS_NEWLIB)
if(target STREQUAL "esp32" OR target STREQUAL "esp32s2") if(target STREQUAL "esp32" OR target STREQUAL "esp32s2")
rom_linker_script("newlib-funcs") rom_linker_script("libc-funcs")
else() else()
rom_linker_script("newlib") rom_linker_script("libc")
if(CONFIG_LIBC_NEWLIB)
rom_linker_script("newlib")
endif()
endif() endif()
endif() endif()
else() # Regular app build else() # Regular app build
if(target STREQUAL "esp32") if(target STREQUAL "esp32")
rom_linker_script("newlib-data") if(CONFIG_LIBC_NEWLIB)
rom_linker_script("syscalls") rom_linker_script("newlib-data")
rom_linker_script("syscalls")
endif()
if(NOT CONFIG_SPIRAM_CACHE_WORKAROUND) if(NOT CONFIG_SPIRAM_CACHE_WORKAROUND)
# ESP32 only: these ROM functions may only be used if PSRAM cache workaround is disabled. # ESP32 only: these ROM functions may only be used if PSRAM cache workaround is disabled.
# Otherwise we need to link to a multilib version of libc compiled with PSRAM workaround. # Otherwise we need to link to a multilib version of libc compiled with PSRAM workaround.
rom_linker_script("newlib-funcs") rom_linker_script("libc-funcs")
if(CONFIG_LIBC_NEWLIB)
rom_linker_script("newlib-reent-funcs")
endif()
endif() endif()
if(NOT CONFIG_SPI_FLASH_ROM_DRIVER_PATCH) if(NOT CONFIG_SPI_FLASH_ROM_DRIVER_PATCH)
@ -175,8 +183,11 @@ else() # Regular app build
endif() endif()
elseif(target STREQUAL "esp32s2") elseif(target STREQUAL "esp32s2")
rom_linker_script("newlib-funcs") rom_linker_script("libc-funcs")
rom_linker_script("newlib-data") if(CONFIG_LIBC_NEWLIB)
rom_linker_script("newlib-reent-funcs")
rom_linker_script("newlib-data")
endif()
# For ESP32S2, inclusion of ROM driver do not depend on CONFIG_SPI_FLASH_ROM_IMPL # For ESP32S2, inclusion of ROM driver do not depend on CONFIG_SPI_FLASH_ROM_IMPL
rom_linker_script("spiflash_legacy") rom_linker_script("spiflash_legacy")
@ -282,9 +293,12 @@ else() # Regular app build
if(CONFIG_ESP_ROM_HAS_NEWLIB AND NOT target STREQUAL "esp32" AND NOT target STREQUAL "esp32s2") if(CONFIG_ESP_ROM_HAS_NEWLIB AND NOT target STREQUAL "esp32" AND NOT target STREQUAL "esp32s2")
# ESP32 and S2 are a bit different, keep them as special cases in the target specific include section # ESP32 and S2 are a bit different, keep them as special cases in the target specific include section
rom_linker_script("newlib") rom_linker_script("libc")
if(CONFIG_LIBC_NEWLIB)
rom_linker_script("newlib")
endif()
if(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT AND CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT AND CONFIG_LIBC_NEWLIB AND CONFIG_NEWLIB_NANO_FORMAT)
if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME AND NOT CONFIG_ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG) if(NOT CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME AND NOT CONFIG_ESP_ROM_HAS_NEWLIB_NANO_PRINTF_FLOAT_BUG)
# Newlib-nano functions contains time_t related functions # Newlib-nano functions contains time_t related functions
# and cannot be used if they were compiled with 32 bit time_t # and cannot be used if they were compiled with 32 bit time_t
@ -292,7 +306,7 @@ else() # Regular app build
endif() endif()
endif() endif()
if(CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT AND NOT CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_ESP_ROM_HAS_NEWLIB_NORMAL_FORMAT AND CONFIG_LIBC_NEWLIB AND NOT CONFIG_NEWLIB_NANO_FORMAT)
rom_linker_script("newlib-normal") rom_linker_script("newlib-normal")
endif() endif()
endif() endif()

View File

@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
/* These are the newlib functions present in ESP32 ROM. /* These are the newlib functions present in ESP32 ROM.
They should not be used when compiling with PSRAM cache workaround enabled. They should not be used when compiling with PSRAM cache workaround enabled.
See also esp32.rom.newlib-data.ld for the list of .data/.bss symbols See also esp32.rom.newlib-data.ld for the list of .data/.bss symbols
@ -13,33 +18,10 @@
*/ */
abs = 0x40056340; abs = 0x40056340;
__ascii_wctomb = 0x40058ef0;
atoi = 0x400566c4;
_atoi_r = 0x400566d4;
atol = 0x400566ec;
_atol_r = 0x400566fc;
bzero = 0x4000c1f4; bzero = 0x4000c1f4;
_cleanup = 0x40001df8;
_cleanup_r = 0x40001d48;
creat = 0x40000e8c;
div = 0x40056348; div = 0x40056348;
__dummy_lock = 0x4000c728; __dummy_lock = 0x4000c728;
__dummy_lock_try = 0x4000c730; __dummy_lock_try = 0x4000c730;
__env_lock = 0x40001fd4;
__env_unlock = 0x40001fe0;
fclose = 0x400020ac;
_fclose_r = 0x40001fec;
fflush = 0x40059394;
_fflush_r = 0x40059320;
_findenv_r = 0x40001f44;
__fp_lock_all = 0x40001f1c;
__fp_unlock_all = 0x40001f30;
__fputwc = 0x40058da0;
fputwc = 0x40058ea8;
_fputwc_r = 0x40058e4c;
_fwalk = 0x4000c738;
_fwalk_reent = 0x4000c770;
_getenv_r = 0x40001fbc;
isalnum = 0x40000f04; isalnum = 0x40000f04;
isalpha = 0x40000f18; isalpha = 0x40000f18;
isascii = 0x4000c20c; isascii = 0x4000c20c;
@ -65,23 +47,8 @@ memmove = 0x4000c3c0;
memrchr = 0x4000c400; memrchr = 0x4000c400;
memset = 0x4000c44c; memset = 0x4000c44c;
qsort = 0x40056424; qsort = 0x40056424;
rand = 0x40001058;
rand_r = 0x400010d4;
__sccl = 0x4000c498; __sccl = 0x4000c498;
__sclose = 0x400011b8;
__seofread = 0x40001148;
setjmp = 0x40056268; setjmp = 0x40056268;
__sflush_r = 0x400591e0;
__sfmoreglue = 0x40001dc8;
__sfp = 0x40001e90;
__sfp_lock_acquire = 0x40001e08;
__sfp_lock_release = 0x40001e14;
__sinit = 0x40001e38;
__sinit_lock_acquire = 0x40001e20;
__sinit_lock_release = 0x40001e2c;
srand = 0x40001004;
__sread = 0x40001118;
__sseek = 0x40001184;
strcasecmp = 0x400011cc; strcasecmp = 0x400011cc;
strcasestr = 0x40001210; strcasestr = 0x40001210;
strcat = 0x4000c518; strcat = 0x4000c518;
@ -90,8 +57,6 @@ strcmp = 0x40001274;
strcoll = 0x40001398; strcoll = 0x40001398;
strcpy = 0x400013ac; strcpy = 0x400013ac;
strcspn = 0x4000c558; strcspn = 0x4000c558;
strdup = 0x4000143c;
_strdup_r = 0x40001450;
strlcat = 0x40001470; strlcat = 0x40001470;
strlcpy = 0x4000c584; strlcpy = 0x4000c584;
strlen = 0x400014c0; strlen = 0x400014c0;
@ -100,31 +65,15 @@ strncasecmp = 0x40001550;
strncat = 0x4000c5c4; strncat = 0x4000c5c4;
strncmp = 0x4000c5f4; strncmp = 0x4000c5f4;
strncpy = 0x400015d4; strncpy = 0x400015d4;
strndup = 0x400016b0;
_strndup_r = 0x400016c4;
strnlen = 0x4000c628; strnlen = 0x4000c628;
strrchr = 0x40001708; strrchr = 0x40001708;
strsep = 0x40001734; strsep = 0x40001734;
strspn = 0x4000c648; strspn = 0x4000c648;
strstr = 0x4000c674; strstr = 0x4000c674;
__strtok_r = 0x4000c6a8;
strtok_r = 0x4000c70c;
strtol = 0x4005681c;
_strtol_r = 0x40056714;
strtoul = 0x4005692c;
_strtoul_r = 0x40056834;
strupr = 0x4000174c; strupr = 0x4000174c;
__submore = 0x40058f3c; __submore = 0x40058f3c;
__swbuf = 0x40058cb4;
__swbuf_r = 0x40058bec;
__swrite = 0x40001150;
toascii = 0x4000c720; toascii = 0x4000c720;
tolower = 0x40001868; tolower = 0x40001868;
toupper = 0x40001884; toupper = 0x40001884;
ungetc = 0x400590f4;
_ungetc_r = 0x40058fa0;
__utoa = 0x400561f0; __utoa = 0x400561f0;
utoa = 0x40056258; utoa = 0x40056258;
wcrtomb = 0x40058920;
_wcrtomb_r = 0x400588d8;
_wctomb_r = 0x40058f14;

View File

@ -0,0 +1,61 @@
/*
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
_cleanup = 0x40001df8;
_cleanup_r = 0x40001d48;
creat = 0x40000e8c;
fclose = 0x400020ac;
_fclose_r = 0x40001fec;
fflush = 0x40059394;
_fflush_r = 0x40059320;
_findenv_r = 0x40001f44;
__fp_lock_all = 0x40001f1c;
__fp_unlock_all = 0x40001f30;
__fputwc = 0x40058da0;
fputwc = 0x40058ea8;
_fputwc_r = 0x40058e4c;
_fwalk = 0x4000c738;
_fwalk_reent = 0x4000c770;
__swbuf = 0x40058cb4;
__swbuf_r = 0x40058bec;
__swrite = 0x40001150;
__sread = 0x40001118;
__sseek = 0x40001184;
ungetc = 0x400590f4;
_ungetc_r = 0x40058fa0;
srand = 0x40001004;
rand_r = 0x400010d4;
rand = 0x40001058;
atoi = 0x400566c4;
_atoi_r = 0x400566d4;
atol = 0x400566ec;
_atol_r = 0x400566fc;
strdup = 0x4000143c;
_strdup_r = 0x40001450;
strndup = 0x400016b0;
_strndup_r = 0x400016c4;
__strtok_r = 0x4000c6a8;
strtok_r = 0x4000c70c;
strtol = 0x4005681c;
_strtol_r = 0x40056714;
strtoul = 0x4005692c;
_strtoul_r = 0x40056834;
__ascii_wctomb = 0x40058ef0;
__sclose = 0x400011b8;
__seofread = 0x40001148;
wcrtomb = 0x40058920;
_wcrtomb_r = 0x400588d8;
_wctomb_r = 0x40058f14;
__sflush_r = 0x400591e0;
__sfmoreglue = 0x40001dc8;
__sfp = 0x40001e90;
__sfp_lock_acquire = 0x40001e08;
__sfp_lock_release = 0x40001e14;
__sinit = 0x40001e38;
__sinit_lock_acquire = 0x40001e20;
__sinit_lock_release = 0x40001e2c;
__env_lock = 0x40001fd4;
__env_unlock = 0x40001fe0;
_getenv_r = 0x40001fbc;

View File

@ -0,0 +1,90 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x40000484;
memset = 0x40000488;
memcpy = 0x4000048c;
memmove = 0x40000490;
memcmp = 0x40000494;
strcpy = 0x40000498;
strncpy = 0x4000049c;
strcmp = 0x400004a0;
strncmp = 0x400004a4;
strlen = 0x400004a8;
strstr = 0x400004ac;
bzero = 0x400004b0;
sbrk = 0x400004b8;
isalnum = 0x400004bc;
isalpha = 0x400004c0;
isascii = 0x400004c4;
isblank = 0x400004c8;
iscntrl = 0x400004cc;
isdigit = 0x400004d0;
islower = 0x400004d4;
isgraph = 0x400004d8;
isprint = 0x400004dc;
ispunct = 0x400004e0;
isspace = 0x400004e4;
isupper = 0x400004e8;
toupper = 0x400004ec;
tolower = 0x400004f0;
toascii = 0x400004f4;
memccpy = 0x400004f8;
memchr = 0x400004fc;
memrchr = 0x40000500;
strcasecmp = 0x40000504;
strcasestr = 0x40000508;
strcat = 0x4000050c;
strchr = 0x40000514;
strcspn = 0x40000518;
strcoll = 0x4000051c;
strlcat = 0x40000520;
strlcpy = 0x40000524;
strlwr = 0x40000528;
strncasecmp = 0x4000052c;
strncat = 0x40000530;
strnlen = 0x40000538;
strrchr = 0x4000053c;
strsep = 0x40000540;
strspn = 0x40000544;
strtok_r = 0x40000548;
strupr = 0x4000054c;
longjmp = 0x40000550;
setjmp = 0x40000554;
abs = 0x40000558;
div = 0x4000055c;
labs = 0x40000560;
ldiv = 0x40000564;
qsort = 0x40000568;
utoa = 0x40000578;
itoa = 0x4000057c;
__match = 0x400005dc;
__hexnan = 0x400005e0;
__hexdig_fun = 0x400005e4;
__gethex = 0x400005e8;
_Balloc = 0x400005ec;
_Bfree = 0x400005f0;
__multadd = 0x400005f4;
__s2b = 0x400005f8;
__hi0bits = 0x400005fc;
__lo0bits = 0x40000600;
__i2b = 0x40000604;
__multiply = 0x40000608;
__pow5mult = 0x4000060c;
__lshift = 0x40000610;
__mcmp = 0x40000614;
__mdiff = 0x40000618;
__ulp = 0x4000061c;
__b2d = 0x40000620;
__d2b = 0x40000624;
__ratio = 0x40000628;
_mprec_log10 = 0x4000062c;
__copybits = 0x40000630;
__any_on = 0x40000634;
nan = 0x40000668;
nanf = 0x4000066c;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fcdffd8;
_global_impure_ptr = 0x3fcdffd4;

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -10,77 +10,23 @@
* *
* Compatible with ROM where ECO version equal or greater to 1. * Compatible with ROM where ECO version equal or greater to 1.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
Group newlib Group newlib
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x40000484;
memset = 0x40000488;
memcpy = 0x4000048c;
memmove = 0x40000490;
memcmp = 0x40000494;
strcpy = 0x40000498;
strncpy = 0x4000049c;
strcmp = 0x400004a0;
strncmp = 0x400004a4;
strlen = 0x400004a8;
strstr = 0x400004ac;
bzero = 0x400004b0;
_isatty_r = 0x400004b4; _isatty_r = 0x400004b4;
sbrk = 0x400004b8;
isalnum = 0x400004bc;
isalpha = 0x400004c0;
isascii = 0x400004c4;
isblank = 0x400004c8;
iscntrl = 0x400004cc;
isdigit = 0x400004d0;
islower = 0x400004d4;
isgraph = 0x400004d8;
isprint = 0x400004dc;
ispunct = 0x400004e0;
isspace = 0x400004e4;
isupper = 0x400004e8;
toupper = 0x400004ec;
tolower = 0x400004f0;
toascii = 0x400004f4;
memccpy = 0x400004f8;
memchr = 0x400004fc;
memrchr = 0x40000500;
strcasecmp = 0x40000504;
strcasestr = 0x40000508;
strcat = 0x4000050c;
strdup = 0x40000510; strdup = 0x40000510;
strchr = 0x40000514;
strcspn = 0x40000518;
strcoll = 0x4000051c;
strlcat = 0x40000520;
strlcpy = 0x40000524;
strlwr = 0x40000528;
strncasecmp = 0x4000052c;
strncat = 0x40000530;
strndup = 0x40000534; strndup = 0x40000534;
strnlen = 0x40000538;
strrchr = 0x4000053c;
strsep = 0x40000540;
strspn = 0x40000544;
strtok_r = 0x40000548;
strupr = 0x4000054c;
longjmp = 0x40000550;
setjmp = 0x40000554;
abs = 0x40000558;
div = 0x4000055c;
labs = 0x40000560;
ldiv = 0x40000564;
qsort = 0x40000568;
rand_r = 0x4000056c; rand_r = 0x4000056c;
rand = 0x40000570; rand = 0x40000570;
srand = 0x40000574; srand = 0x40000574;
utoa = 0x40000578;
itoa = 0x4000057c;
atoi = 0x40000580; atoi = 0x40000580;
atol = 0x40000584; atol = 0x40000584;
strtol = 0x40000588; strtol = 0x40000588;
@ -104,29 +50,6 @@ _strtol_r = 0x400005cc;
strtol_l = 0x400005d0; strtol_l = 0x400005d0;
_strtoul_r = 0x400005d4; _strtoul_r = 0x400005d4;
strtoul_l = 0x400005d8; strtoul_l = 0x400005d8;
__match = 0x400005dc;
__hexnan = 0x400005e0;
__hexdig_fun = 0x400005e4;
__gethex = 0x400005e8;
_Balloc = 0x400005ec;
_Bfree = 0x400005f0;
__multadd = 0x400005f4;
__s2b = 0x400005f8;
__hi0bits = 0x400005fc;
__lo0bits = 0x40000600;
__i2b = 0x40000604;
__multiply = 0x40000608;
__pow5mult = 0x4000060c;
__lshift = 0x40000610;
__mcmp = 0x40000614;
__mdiff = 0x40000618;
__ulp = 0x4000061c;
__b2d = 0x40000620;
__d2b = 0x40000624;
__ratio = 0x40000628;
_mprec_log10 = 0x4000062c;
__copybits = 0x40000630;
__any_on = 0x40000634;
asctime = 0x40000638; asctime = 0x40000638;
asctime_r = 0x4000063c; asctime_r = 0x4000063c;
atof = 0x40000640; atof = 0x40000640;
@ -139,9 +62,4 @@ __ascii_mbtowc = 0x40000658;
puts = 0x4000065c; puts = 0x4000065c;
putc = 0x40000660; putc = 0x40000660;
putchar = 0x40000664; putchar = 0x40000664;
nan = 0x40000668;
nanf = 0x4000066c;
__errno = 0x40000670; __errno = 0x40000670;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fcdffd8;
_global_impure_ptr = 0x3fcdffd4;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x40000350;
memset = 0x40000354;
memcpy = 0x40000358;
memmove = 0x4000035c;
memcmp = 0x40000360;
strcpy = 0x40000364;
strncpy = 0x40000368;
strcmp = 0x4000036c;
strncmp = 0x40000370;
strlen = 0x40000374;
strstr = 0x40000378;
bzero = 0x4000037c;
sbrk = 0x40000384;
isalnum = 0x40000388;
isalpha = 0x4000038c;
isascii = 0x40000390;
isblank = 0x40000394;
iscntrl = 0x40000398;
isdigit = 0x4000039c;
islower = 0x400003a0;
isgraph = 0x400003a4;
isprint = 0x400003a8;
ispunct = 0x400003ac;
isspace = 0x400003b0;
isupper = 0x400003b4;
toupper = 0x400003b8;
tolower = 0x400003bc;
toascii = 0x400003c0;
memccpy = 0x400003c4;
memchr = 0x400003c8;
memrchr = 0x400003cc;
strcasecmp = 0x400003d0;
strcasestr = 0x400003d4;
strcat = 0x400003d8;
strchr = 0x400003e0;
strcspn = 0x400003e4;
strcoll = 0x400003e8;
strlcat = 0x400003ec;
strlcpy = 0x400003f0;
strlwr = 0x400003f4;
strncasecmp = 0x400003f8;
strncat = 0x400003fc;
strnlen = 0x40000404;
strrchr = 0x40000408;
strsep = 0x4000040c;
strspn = 0x40000410;
strtok_r = 0x40000414;
strupr = 0x40000418;
longjmp = 0x4000041c;
setjmp = 0x40000420;
abs = 0x40000424;
div = 0x40000428;
labs = 0x4000042c;
ldiv = 0x40000430;
qsort = 0x40000434;
utoa = 0x40000444;
itoa = 0x40000448;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fcdffe0;
_global_impure_ptr = 0x3fcdffdc;

View File

@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
/* ROM function interface esp32c3.rom.newlib.ld for esp32c3 /* ROM function interface esp32c3.rom.newlib.ld for esp32c3
* *
* *
@ -5,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -13,68 +20,11 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x40000350;
memset = 0x40000354;
memcpy = 0x40000358;
memmove = 0x4000035c;
memcmp = 0x40000360;
strcpy = 0x40000364;
strncpy = 0x40000368;
strcmp = 0x4000036c;
strncmp = 0x40000370;
strlen = 0x40000374;
strstr = 0x40000378;
bzero = 0x4000037c;
sbrk = 0x40000384;
isalnum = 0x40000388;
isalpha = 0x4000038c;
isascii = 0x40000390;
isblank = 0x40000394;
iscntrl = 0x40000398;
isdigit = 0x4000039c;
islower = 0x400003a0;
isgraph = 0x400003a4;
isprint = 0x400003a8;
ispunct = 0x400003ac;
isspace = 0x400003b0;
isupper = 0x400003b4;
toupper = 0x400003b8;
tolower = 0x400003bc;
toascii = 0x400003c0;
memccpy = 0x400003c4;
memchr = 0x400003c8;
memrchr = 0x400003cc;
strcasecmp = 0x400003d0;
strcasestr = 0x400003d4;
strcat = 0x400003d8;
strdup = 0x400003dc; strdup = 0x400003dc;
strchr = 0x400003e0;
strcspn = 0x400003e4;
strcoll = 0x400003e8;
strlcat = 0x400003ec;
strlcpy = 0x400003f0;
strlwr = 0x400003f4;
strncasecmp = 0x400003f8;
strncat = 0x400003fc;
strndup = 0x40000400; strndup = 0x40000400;
strnlen = 0x40000404;
strrchr = 0x40000408;
strsep = 0x4000040c;
strspn = 0x40000410;
strtok_r = 0x40000414;
strupr = 0x40000418;
longjmp = 0x4000041c;
setjmp = 0x40000420;
abs = 0x40000424;
div = 0x40000428;
labs = 0x4000042c;
ldiv = 0x40000430;
qsort = 0x40000434;
rand_r = 0x40000438; rand_r = 0x40000438;
rand = 0x4000043c; rand = 0x4000043c;
srand = 0x40000440; srand = 0x40000440;
utoa = 0x40000444;
itoa = 0x40000448;
atoi = 0x4000044c; atoi = 0x4000044c;
atol = 0x40000450; atol = 0x40000450;
strtol = 0x40000454; strtol = 0x40000454;
@ -85,6 +35,3 @@ PROVIDE( _fwalk = 0x40000464 );
PROVIDE( _fwalk_reent = 0x40000468 ); PROVIDE( _fwalk_reent = 0x40000468 );
PROVIDE( __swbuf_r = 0x40000474 ); PROVIDE( __swbuf_r = 0x40000474 );
__swbuf = 0x40000478; __swbuf = 0x40000478;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fcdffe0;
_global_impure_ptr = 0x3fcdffdc;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x400004b4;
memset = 0x400004b8;
memcpy = 0x400004bc;
memmove = 0x400004c0;
memcmp = 0x400004c4;
strcpy = 0x400004c8;
strncpy = 0x400004cc;
strcmp = 0x400004d0;
strncmp = 0x400004d4;
strlen = 0x400004d8;
strstr = 0x400004dc;
bzero = 0x400004e0;
sbrk = 0x400004e8;
isalnum = 0x400004ec;
isalpha = 0x400004f0;
isascii = 0x400004f4;
isblank = 0x400004f8;
iscntrl = 0x400004fc;
isdigit = 0x40000500;
islower = 0x40000504;
isgraph = 0x40000508;
isprint = 0x4000050c;
ispunct = 0x40000510;
isspace = 0x40000514;
isupper = 0x40000518;
toupper = 0x4000051c;
tolower = 0x40000520;
toascii = 0x40000524;
memccpy = 0x40000528;
memchr = 0x4000052c;
memrchr = 0x40000530;
strcasecmp = 0x40000534;
strcasestr = 0x40000538;
strcat = 0x4000053c;
strchr = 0x40000544;
strcspn = 0x40000548;
strcoll = 0x4000054c;
strlcat = 0x40000550;
strlcpy = 0x40000554;
strlwr = 0x40000558;
strncasecmp = 0x4000055c;
strncat = 0x40000560;
strnlen = 0x40000568;
strrchr = 0x4000056c;
strsep = 0x40000570;
strspn = 0x40000574;
strtok_r = 0x40000578;
strupr = 0x4000057c;
longjmp = 0x40000580;
setjmp = 0x40000584;
abs = 0x40000588;
div = 0x4000058c;
labs = 0x40000590;
ldiv = 0x40000594;
qsort = 0x40000598;
utoa = 0x400005a8;
itoa = 0x400005ac;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4085ffd4;
_global_impure_ptr = 0x4085ffd0;

View File

@ -10,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -18,69 +20,12 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x400004b4;
memset = 0x400004b8;
memcpy = 0x400004bc;
memmove = 0x400004c0;
memcmp = 0x400004c4;
strcpy = 0x400004c8;
strncpy = 0x400004cc;
strcmp = 0x400004d0;
strncmp = 0x400004d4;
strlen = 0x400004d8;
strstr = 0x400004dc;
bzero = 0x400004e0;
_isatty_r = 0x400004e4; _isatty_r = 0x400004e4;
sbrk = 0x400004e8;
isalnum = 0x400004ec;
isalpha = 0x400004f0;
isascii = 0x400004f4;
isblank = 0x400004f8;
iscntrl = 0x400004fc;
isdigit = 0x40000500;
islower = 0x40000504;
isgraph = 0x40000508;
isprint = 0x4000050c;
ispunct = 0x40000510;
isspace = 0x40000514;
isupper = 0x40000518;
toupper = 0x4000051c;
tolower = 0x40000520;
toascii = 0x40000524;
memccpy = 0x40000528;
memchr = 0x4000052c;
memrchr = 0x40000530;
strcasecmp = 0x40000534;
strcasestr = 0x40000538;
strcat = 0x4000053c;
strdup = 0x40000540; strdup = 0x40000540;
strchr = 0x40000544;
strcspn = 0x40000548;
strcoll = 0x4000054c;
strlcat = 0x40000550;
strlcpy = 0x40000554;
strlwr = 0x40000558;
strncasecmp = 0x4000055c;
strncat = 0x40000560;
strndup = 0x40000564; strndup = 0x40000564;
strnlen = 0x40000568;
strrchr = 0x4000056c;
strsep = 0x40000570;
strspn = 0x40000574;
strtok_r = 0x40000578;
strupr = 0x4000057c;
longjmp = 0x40000580;
setjmp = 0x40000584;
abs = 0x40000588;
div = 0x4000058c;
labs = 0x40000590;
ldiv = 0x40000594;
qsort = 0x40000598;
rand_r = 0x4000059c; rand_r = 0x4000059c;
rand = 0x400005a0; rand = 0x400005a0;
srand = 0x400005a4; srand = 0x400005a4;
utoa = 0x400005a8;
itoa = 0x400005ac;
atoi = 0x400005b0; atoi = 0x400005b0;
atol = 0x400005b4; atol = 0x400005b4;
strtol = 0x400005b8; strtol = 0x400005b8;
@ -94,6 +39,3 @@ __swhatbuf_r = 0x400005d4;
__swbuf_r = 0x400005d8; __swbuf_r = 0x400005d8;
__swbuf = 0x400005dc; __swbuf = 0x400005dc;
__swsetup_r = 0x400005e0; __swsetup_r = 0x400005e0;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4085ffd4;
_global_impure_ptr = 0x4085ffd0;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x400004a4;
memset = 0x400004a8;
memcpy = 0x400004ac;
memmove = 0x400004b0;
memcmp = 0x400004b4;
strcpy = 0x400004b8;
strncpy = 0x400004bc;
strcmp = 0x400004c0;
strncmp = 0x400004c4;
strlen = 0x400004c8;
strstr = 0x400004cc;
bzero = 0x400004d0;
sbrk = 0x400004d8;
isalnum = 0x400004dc;
isalpha = 0x400004e0;
isascii = 0x400004e4;
isblank = 0x400004e8;
iscntrl = 0x400004ec;
isdigit = 0x400004f0;
islower = 0x400004f4;
isgraph = 0x400004f8;
isprint = 0x400004fc;
ispunct = 0x40000500;
isspace = 0x40000504;
isupper = 0x40000508;
toupper = 0x4000050c;
tolower = 0x40000510;
toascii = 0x40000514;
memccpy = 0x40000518;
memchr = 0x4000051c;
memrchr = 0x40000520;
strcasecmp = 0x40000524;
strcasestr = 0x40000528;
strcat = 0x4000052c;
strchr = 0x40000534;
strcspn = 0x40000538;
strcoll = 0x4000053c;
strlcat = 0x40000540;
strlcpy = 0x40000544;
strlwr = 0x40000548;
strncasecmp = 0x4000054c;
strncat = 0x40000550;
strnlen = 0x40000558;
strrchr = 0x4000055c;
strsep = 0x40000560;
strspn = 0x40000564;
strtok_r = 0x40000568;
strupr = 0x4000056c;
longjmp = 0x40000570;
setjmp = 0x40000574;
abs = 0x40000578;
div = 0x4000057c;
labs = 0x40000580;
ldiv = 0x40000584;
qsort = 0x40000588;
utoa = 0x40000598;
itoa = 0x4000059c;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4087ffd4;
_global_impure_ptr = 0x4087ffd0;

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -10,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -18,69 +20,12 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x400004a4;
memset = 0x400004a8;
memcpy = 0x400004ac;
memmove = 0x400004b0;
memcmp = 0x400004b4;
strcpy = 0x400004b8;
strncpy = 0x400004bc;
strcmp = 0x400004c0;
strncmp = 0x400004c4;
strlen = 0x400004c8;
strstr = 0x400004cc;
bzero = 0x400004d0;
_isatty_r = 0x400004d4; _isatty_r = 0x400004d4;
sbrk = 0x400004d8;
isalnum = 0x400004dc;
isalpha = 0x400004e0;
isascii = 0x400004e4;
isblank = 0x400004e8;
iscntrl = 0x400004ec;
isdigit = 0x400004f0;
islower = 0x400004f4;
isgraph = 0x400004f8;
isprint = 0x400004fc;
ispunct = 0x40000500;
isspace = 0x40000504;
isupper = 0x40000508;
toupper = 0x4000050c;
tolower = 0x40000510;
toascii = 0x40000514;
memccpy = 0x40000518;
memchr = 0x4000051c;
memrchr = 0x40000520;
strcasecmp = 0x40000524;
strcasestr = 0x40000528;
strcat = 0x4000052c;
strdup = 0x40000530; strdup = 0x40000530;
strchr = 0x40000534;
strcspn = 0x40000538;
strcoll = 0x4000053c;
strlcat = 0x40000540;
strlcpy = 0x40000544;
strlwr = 0x40000548;
strncasecmp = 0x4000054c;
strncat = 0x40000550;
strndup = 0x40000554; strndup = 0x40000554;
strnlen = 0x40000558;
strrchr = 0x4000055c;
strsep = 0x40000560;
strspn = 0x40000564;
strtok_r = 0x40000568;
strupr = 0x4000056c;
longjmp = 0x40000570;
setjmp = 0x40000574;
abs = 0x40000578;
div = 0x4000057c;
labs = 0x40000580;
ldiv = 0x40000584;
qsort = 0x40000588;
rand_r = 0x4000058c; rand_r = 0x4000058c;
rand = 0x40000590; rand = 0x40000590;
srand = 0x40000594; srand = 0x40000594;
utoa = 0x40000598;
itoa = 0x4000059c;
atoi = 0x400005a0; atoi = 0x400005a0;
atol = 0x400005a4; atol = 0x400005a4;
strtol = 0x400005a8; strtol = 0x400005a8;
@ -94,6 +39,3 @@ __swhatbuf_r = 0x400005c4;
__swbuf_r = 0x400005c8; __swbuf_r = 0x400005c8;
__swbuf = 0x400005cc; __swbuf = 0x400005cc;
__swsetup_r = 0x400005d0; __swsetup_r = 0x400005d0;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4087ffd4;
_global_impure_ptr = 0x4087ffd0;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x400004b4;
memset = 0x400004b8;
memcpy = 0x400004bc;
memmove = 0x400004c0;
memcmp = 0x400004c4;
strcpy = 0x400004c8;
strncpy = 0x400004cc;
strcmp = 0x400004d0;
strncmp = 0x400004d4;
strlen = 0x400004d8;
strstr = 0x400004dc;
bzero = 0x400004e0;
sbrk = 0x400004e8;
isalnum = 0x400004ec;
isalpha = 0x400004f0;
isascii = 0x400004f4;
isblank = 0x400004f8;
iscntrl = 0x400004fc;
isdigit = 0x40000500;
islower = 0x40000504;
isgraph = 0x40000508;
isprint = 0x4000050c;
ispunct = 0x40000510;
isspace = 0x40000514;
isupper = 0x40000518;
toupper = 0x4000051c;
tolower = 0x40000520;
toascii = 0x40000524;
memccpy = 0x40000528;
memchr = 0x4000052c;
memrchr = 0x40000530;
strcasecmp = 0x40000534;
strcasestr = 0x40000538;
strcat = 0x4000053c;
strchr = 0x40000544;
strcspn = 0x40000548;
strcoll = 0x4000054c;
strlcat = 0x40000550;
strlcpy = 0x40000554;
strlwr = 0x40000558;
strncasecmp = 0x4000055c;
strncat = 0x40000560;
strnlen = 0x40000568;
strrchr = 0x4000056c;
strsep = 0x40000570;
strspn = 0x40000574;
strtok_r = 0x40000578;
strupr = 0x4000057c;
longjmp = 0x40000580;
setjmp = 0x40000584;
abs = 0x40000588;
div = 0x4000058c;
labs = 0x40000590;
ldiv = 0x40000594;
qsort = 0x40000598;
utoa = 0x400005a8;
itoa = 0x400005ac;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4084ffd4;
_global_impure_ptr = 0x4084ffd0;

View File

@ -10,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -18,69 +20,12 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x400004b4;
memset = 0x400004b8;
memcpy = 0x400004bc;
memmove = 0x400004c0;
memcmp = 0x400004c4;
strcpy = 0x400004c8;
strncpy = 0x400004cc;
strcmp = 0x400004d0;
strncmp = 0x400004d4;
strlen = 0x400004d8;
strstr = 0x400004dc;
bzero = 0x400004e0;
_isatty_r = 0x400004e4; _isatty_r = 0x400004e4;
sbrk = 0x400004e8;
isalnum = 0x400004ec;
isalpha = 0x400004f0;
isascii = 0x400004f4;
isblank = 0x400004f8;
iscntrl = 0x400004fc;
isdigit = 0x40000500;
islower = 0x40000504;
isgraph = 0x40000508;
isprint = 0x4000050c;
ispunct = 0x40000510;
isspace = 0x40000514;
isupper = 0x40000518;
toupper = 0x4000051c;
tolower = 0x40000520;
toascii = 0x40000524;
memccpy = 0x40000528;
memchr = 0x4000052c;
memrchr = 0x40000530;
strcasecmp = 0x40000534;
strcasestr = 0x40000538;
strcat = 0x4000053c;
strdup = 0x40000540; strdup = 0x40000540;
strchr = 0x40000544;
strcspn = 0x40000548;
strcoll = 0x4000054c;
strlcat = 0x40000550;
strlcpy = 0x40000554;
strlwr = 0x40000558;
strncasecmp = 0x4000055c;
strncat = 0x40000560;
strndup = 0x40000564; strndup = 0x40000564;
strnlen = 0x40000568;
strrchr = 0x4000056c;
strsep = 0x40000570;
strspn = 0x40000574;
strtok_r = 0x40000578;
strupr = 0x4000057c;
longjmp = 0x40000580;
setjmp = 0x40000584;
abs = 0x40000588;
div = 0x4000058c;
labs = 0x40000590;
ldiv = 0x40000594;
qsort = 0x40000598;
rand_r = 0x4000059c; rand_r = 0x4000059c;
rand = 0x400005a0; rand = 0x400005a0;
srand = 0x400005a4; srand = 0x400005a4;
utoa = 0x400005a8;
itoa = 0x400005ac;
atoi = 0x400005b0; atoi = 0x400005b0;
atol = 0x400005b4; atol = 0x400005b4;
strtol = 0x400005b8; strtol = 0x400005b8;
@ -94,6 +39,3 @@ __swhatbuf_r = 0x400005d4;
__swbuf_r = 0x400005d8; __swbuf_r = 0x400005d8;
__swbuf = 0x400005dc; __swbuf = 0x400005dc;
__swsetup_r = 0x400005e0; __swsetup_r = 0x400005e0;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4084ffd4;
_global_impure_ptr = 0x4084ffd0;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x4000049c;
memset = 0x400004a0;
memcpy = 0x400004a4;
memmove = 0x400004a8;
memcmp = 0x400004ac;
strcpy = 0x400004b0;
strncpy = 0x400004b4;
strcmp = 0x400004b8;
strncmp = 0x400004bc;
strlen = 0x400004c0;
strstr = 0x400004c4;
bzero = 0x400004c8;
sbrk = 0x400004d0;
isalnum = 0x400004d4;
isalpha = 0x400004d8;
isascii = 0x400004dc;
isblank = 0x400004e0;
iscntrl = 0x400004e4;
isdigit = 0x400004e8;
islower = 0x400004ec;
isgraph = 0x400004f0;
isprint = 0x400004f4;
ispunct = 0x400004f8;
isspace = 0x400004fc;
isupper = 0x40000500;
toupper = 0x40000504;
tolower = 0x40000508;
toascii = 0x4000050c;
memccpy = 0x40000510;
memchr = 0x40000514;
memrchr = 0x40000518;
strcasecmp = 0x4000051c;
strcasestr = 0x40000520;
strcat = 0x40000524;
strchr = 0x4000052c;
strcspn = 0x40000530;
strcoll = 0x40000534;
strlcat = 0x40000538;
strlcpy = 0x4000053c;
strlwr = 0x40000540;
strncasecmp = 0x40000544;
strncat = 0x40000548;
strnlen = 0x40000550;
strrchr = 0x40000554;
strsep = 0x40000558;
strspn = 0x4000055c;
strtok_r = 0x40000560;
strupr = 0x40000564;
longjmp = 0x40000568;
setjmp = 0x4000056c;
abs = 0x40000570;
div = 0x40000574;
labs = 0x40000578;
ldiv = 0x4000057c;
qsort = 0x40000580;
utoa = 0x40000590;
itoa = 0x40000594;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4084ffd4;
_global_impure_ptr = 0x4084ffd0;

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -10,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -18,69 +20,12 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x4000049c;
memset = 0x400004a0;
memcpy = 0x400004a4;
memmove = 0x400004a8;
memcmp = 0x400004ac;
strcpy = 0x400004b0;
strncpy = 0x400004b4;
strcmp = 0x400004b8;
strncmp = 0x400004bc;
strlen = 0x400004c0;
strstr = 0x400004c4;
bzero = 0x400004c8;
_isatty_r = 0x400004cc; _isatty_r = 0x400004cc;
sbrk = 0x400004d0;
isalnum = 0x400004d4;
isalpha = 0x400004d8;
isascii = 0x400004dc;
isblank = 0x400004e0;
iscntrl = 0x400004e4;
isdigit = 0x400004e8;
islower = 0x400004ec;
isgraph = 0x400004f0;
isprint = 0x400004f4;
ispunct = 0x400004f8;
isspace = 0x400004fc;
isupper = 0x40000500;
toupper = 0x40000504;
tolower = 0x40000508;
toascii = 0x4000050c;
memccpy = 0x40000510;
memchr = 0x40000514;
memrchr = 0x40000518;
strcasecmp = 0x4000051c;
strcasestr = 0x40000520;
strcat = 0x40000524;
strdup = 0x40000528; strdup = 0x40000528;
strchr = 0x4000052c;
strcspn = 0x40000530;
strcoll = 0x40000534;
strlcat = 0x40000538;
strlcpy = 0x4000053c;
strlwr = 0x40000540;
strncasecmp = 0x40000544;
strncat = 0x40000548;
strndup = 0x4000054c; strndup = 0x4000054c;
strnlen = 0x40000550;
strrchr = 0x40000554;
strsep = 0x40000558;
strspn = 0x4000055c;
strtok_r = 0x40000560;
strupr = 0x40000564;
longjmp = 0x40000568;
setjmp = 0x4000056c;
abs = 0x40000570;
div = 0x40000574;
labs = 0x40000578;
ldiv = 0x4000057c;
qsort = 0x40000580;
rand_r = 0x40000584; rand_r = 0x40000584;
rand = 0x40000588; rand = 0x40000588;
srand = 0x4000058c; srand = 0x4000058c;
utoa = 0x40000590;
itoa = 0x40000594;
atoi = 0x40000598; atoi = 0x40000598;
atol = 0x4000059c; atol = 0x4000059c;
strtol = 0x400005a0; strtol = 0x400005a0;
@ -94,6 +39,3 @@ __swhatbuf_r = 0x400005bc;
__swbuf_r = 0x400005c0; __swbuf_r = 0x400005c0;
__swbuf = 0x400005c4; __swbuf = 0x400005c4;
__swsetup_r = 0x400005c8; __swsetup_r = 0x400005c8;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4084ffd4;
_global_impure_ptr = 0x4084ffd0;

View File

@ -0,0 +1,65 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x4fc00264;
memset = 0x4fc00268;
memcpy = 0x4fc0026c;
memmove = 0x4fc00270;
memcmp = 0x4fc00274;
strcpy = 0x4fc00278;
strncpy = 0x4fc0027c;
strcmp = 0x4fc00280;
strncmp = 0x4fc00284;
strlen = 0x4fc00288;
strstr = 0x4fc0028c;
bzero = 0x4fc00290;
sbrk = 0x4fc00298;
isalnum = 0x4fc0029c;
isalpha = 0x4fc002a0;
isascii = 0x4fc002a4;
isblank = 0x4fc002a8;
iscntrl = 0x4fc002ac;
isdigit = 0x4fc002b0;
islower = 0x4fc002b4;
isgraph = 0x4fc002b8;
isprint = 0x4fc002bc;
ispunct = 0x4fc002c0;
isspace = 0x4fc002c4;
isupper = 0x4fc002c8;
toupper = 0x4fc002cc;
tolower = 0x4fc002d0;
toascii = 0x4fc002d4;
memccpy = 0x4fc002d8;
memchr = 0x4fc002dc;
memrchr = 0x4fc002e0;
strcasecmp = 0x4fc002e4;
strcasestr = 0x4fc002e8;
strcat = 0x4fc002ec;
strchr = 0x4fc002f4;
strcspn = 0x4fc002f8;
strcoll = 0x4fc002fc;
strlcat = 0x4fc00300;
strlcpy = 0x4fc00304;
strlwr = 0x4fc00308;
strncasecmp = 0x4fc0030c;
strncat = 0x4fc00310;
strnlen = 0x4fc00318;
strrchr = 0x4fc0031c;
strsep = 0x4fc00320;
strspn = 0x4fc00324;
strtok_r = 0x4fc00328;
strupr = 0x4fc0032c;
longjmp = 0x4fc00330;
setjmp = 0x4fc00334;
abs = 0x4fc00338;
div = 0x4fc0033c;
labs = 0x4fc00340;
ldiv = 0x4fc00344;
qsort = 0x4fc00348;
utoa = 0x4fc00358;
itoa = 0x4fc0035c;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4ff3ffe4;
_global_impure_ptr = 0x4ff3ffe0;

View File

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@ -10,7 +10,9 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/*************************************** /***************************************
@ -18,69 +20,12 @@
***************************************/ ***************************************/
/* Functions */ /* Functions */
esp_rom_newlib_init_common_mutexes = 0x4fc00264;
memset = 0x4fc00268;
memcpy = 0x4fc0026c;
memmove = 0x4fc00270;
memcmp = 0x4fc00274;
strcpy = 0x4fc00278;
strncpy = 0x4fc0027c;
strcmp = 0x4fc00280;
strncmp = 0x4fc00284;
strlen = 0x4fc00288;
strstr = 0x4fc0028c;
bzero = 0x4fc00290;
_isatty_r = 0x4fc00294; _isatty_r = 0x4fc00294;
sbrk = 0x4fc00298;
isalnum = 0x4fc0029c;
isalpha = 0x4fc002a0;
isascii = 0x4fc002a4;
isblank = 0x4fc002a8;
iscntrl = 0x4fc002ac;
isdigit = 0x4fc002b0;
islower = 0x4fc002b4;
isgraph = 0x4fc002b8;
isprint = 0x4fc002bc;
ispunct = 0x4fc002c0;
isspace = 0x4fc002c4;
isupper = 0x4fc002c8;
toupper = 0x4fc002cc;
tolower = 0x4fc002d0;
toascii = 0x4fc002d4;
memccpy = 0x4fc002d8;
memchr = 0x4fc002dc;
memrchr = 0x4fc002e0;
strcasecmp = 0x4fc002e4;
strcasestr = 0x4fc002e8;
strcat = 0x4fc002ec;
strdup = 0x4fc002f0; strdup = 0x4fc002f0;
strchr = 0x4fc002f4;
strcspn = 0x4fc002f8;
strcoll = 0x4fc002fc;
strlcat = 0x4fc00300;
strlcpy = 0x4fc00304;
strlwr = 0x4fc00308;
strncasecmp = 0x4fc0030c;
strncat = 0x4fc00310;
strndup = 0x4fc00314; strndup = 0x4fc00314;
strnlen = 0x4fc00318;
strrchr = 0x4fc0031c;
strsep = 0x4fc00320;
strspn = 0x4fc00324;
strtok_r = 0x4fc00328;
strupr = 0x4fc0032c;
longjmp = 0x4fc00330;
setjmp = 0x4fc00334;
abs = 0x4fc00338;
div = 0x4fc0033c;
labs = 0x4fc00340;
ldiv = 0x4fc00344;
qsort = 0x4fc00348;
rand_r = 0x4fc0034c; rand_r = 0x4fc0034c;
rand = 0x4fc00350; rand = 0x4fc00350;
srand = 0x4fc00354; srand = 0x4fc00354;
utoa = 0x4fc00358;
itoa = 0x4fc0035c;
atoi = 0x4fc00360; atoi = 0x4fc00360;
atol = 0x4fc00364; atol = 0x4fc00364;
strtol = 0x4fc00368; strtol = 0x4fc00368;
@ -94,6 +39,3 @@ __swhatbuf_r = 0x4fc00384;
__swbuf_r = 0x4fc00388; __swbuf_r = 0x4fc00388;
__swbuf = 0x4fc0038c; __swbuf = 0x4fc0038c;
__swsetup_r = 0x4fc00390; __swsetup_r = 0x4fc00390;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x4ff3ffe4;
_global_impure_ptr = 0x4ff3ffe0;

View File

@ -11,6 +11,7 @@
extern "C" { extern "C" {
#endif #endif
#include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h> #include <stdbool.h>

View File

@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
/** /**
* These are the newlib functions present in ESP32-S2 ROM. * These are the newlib functions present in ESP32-S2 ROM.
* See also esp32s2.rom.newlib-data.ld for the list of .data/.bss symbols used by these functions. * See also esp32s2.rom.newlib-data.ld for the list of .data/.bss symbols used by these functions.
@ -8,24 +13,10 @@
*/ */
abs = 0x40000618; abs = 0x40000618;
__ascii_mbtowc = 0x40007a04;
__ascii_wctomb = 0x400018d0;
PROVIDE ( __assert = 0x4001a430 ); PROVIDE ( __assert = 0x4001a430 );
PROVIDE ( __assert_func = 0x4001a408 ); PROVIDE ( __assert_func = 0x4001a408 );
bzero = 0x400078c8; bzero = 0x400078c8;
_cleanup_r = 0x4001a480;
creat = 0x4000788c;
div = 0x40000620; div = 0x40000620;
fclose = 0x4001a804;
_fclose_r = 0x4001a714;
fflush = 0x40001bb8;
_fflush_r = 0x40001b30;
__fp_unlock_all = 0x4001a64c;
__fputwc = 0x40001770;
fputwc = 0x40001864;
_fputwc_r = 0x400017f8;
_fwalk = 0x4001bcec;
_fwalk_reent = 0x4001bd24;
isalnum = 0x400078d8; isalnum = 0x400078d8;
isalpha = 0x400078e8; isalpha = 0x400078e8;
isascii = 0x4001aaec; isascii = 0x4001aaec;
@ -40,11 +31,7 @@ isspace = 0x400079ac;
isupper = 0x400079c4; isupper = 0x400079c4;
labs = 0x40000648; labs = 0x40000648;
ldiv = 0x40000650; ldiv = 0x40000650;
__locale_ctype_ptr = 0x40001c2c;
__locale_ctype_ptr_l = 0x40001c24;
__locale_mb_cur_max = 0x40001c0c;
longjmp = 0x400005a4; longjmp = 0x400005a4;
_mbtowc_r = 0x400079e0;
memccpy = 0x4001ab00; memccpy = 0x4001ab00;
memchr = 0x4001ab24; memchr = 0x4001ab24;
memcmp = 0x4001ab40; memcmp = 0x4001ab40;
@ -52,35 +39,14 @@ memcpy = 0x4001aba8;
memmove = 0x4001acb0; memmove = 0x4001acb0;
memrchr = 0x4001acec; memrchr = 0x4001acec;
memset = 0x4001ad3c; memset = 0x4001ad3c;
open = 0x400080c4;
qsort = 0x400006f4; qsort = 0x400006f4;
rand_r = 0x40007af4;
__sclose = 0x4001a700;
__seofread = 0x4001a690;
setjmp = 0x40000540; setjmp = 0x40000540;
setlocale = 0x40001c44;
_setlocale_r = 0x40001bdc;
__sflush_r = 0x400019dc;
__sfmoreglue = 0x4001a4c8;
__sfp = 0x4001a590;
__sfp_lock_acquire = 0x4001a508;
__sfp_lock_release = 0x4001a514;
__sinit = 0x4001a538;
__sinit_lock_acquire = 0x4001a520;
__sinit_lock_release = 0x4001a52c;
srand = 0x40007a24;
__sread = 0x4001a660;
__sseek = 0x4001a6cc;
strcasecmp = 0x40007b38;
strcasestr = 0x40007b7c;
strcat = 0x4001ad90; strcat = 0x4001ad90;
strchr = 0x4001adb0; strchr = 0x4001adb0;
strcmp = 0x40007be4; strcmp = 0x40007be4;
strcoll = 0x40007ce8; strcoll = 0x40007ce8;
strcpy = 0x40007cfc; strcpy = 0x40007cfc;
strcspn = 0x4001adcc; strcspn = 0x4001adcc;
strdup = 0x40007d84;
_strdup_r = 0x40007d98;
strlcat = 0x40007db8; strlcat = 0x40007db8;
strlcpy = 0x4001adf8; strlcpy = 0x4001adf8;
strlen = 0x40007e08; strlen = 0x40007e08;
@ -89,8 +55,6 @@ strncasecmp = 0x40007e94;
strncat = 0x4001ae34; strncat = 0x4001ae34;
strncmp = 0x4001ae64; strncmp = 0x4001ae64;
strncpy = 0x40007f20; strncpy = 0x40007f20;
strndup = 0x40007fe8;
_strndup_r = 0x40007ffc;
strnlen = 0x4001ae9c; strnlen = 0x4001ae9c;
strrchr = 0x40008040; strrchr = 0x40008040;
strsep = 0x4000806c; strsep = 0x4000806c;
@ -99,12 +63,6 @@ strstr = 0x4001aee8;
__strtok_r = 0x4001af18; __strtok_r = 0x4001af18;
strtok_r = 0x4001af7c; strtok_r = 0x4001af7c;
strupr = 0x40008084; strupr = 0x40008084;
__swbuf = 0x4000167c;
__swbuf_r = 0x400015bc;
__swrite = 0x4001a698;
toascii = 0x4001af90; toascii = 0x4001af90;
tolower = 0x40008158; tolower = 0x40008158;
toupper = 0x40008174; toupper = 0x40008174;
wcrtomb = 0x400012f4;
_wcrtomb_r = 0x400012a0;
_wctomb_r = 0x400018ac;

View File

@ -0,0 +1,52 @@
/*
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
_cleanup_r = 0x4001a480;
creat = 0x4000788c;
open = 0x400080c4;
fclose = 0x4001a804;
_fclose_r = 0x4001a714;
fflush = 0x40001bb8;
_fflush_r = 0x40001b30;
__fp_unlock_all = 0x4001a64c;
__fputwc = 0x40001770;
fputwc = 0x40001864;
_fputwc_r = 0x400017f8;
_fwalk = 0x4001bcec;
_fwalk_reent = 0x4001bd24;
__sflush_r = 0x400019dc;
__swbuf = 0x4000167c;
__swbuf_r = 0x400015bc;
__swrite = 0x4001a698;
__sread = 0x4001a660;
__sseek = 0x4001a6cc;
srand = 0x40007a24;
__ascii_mbtowc = 0x40007a04;
__ascii_wctomb = 0x400018d0;
_mbtowc_r = 0x400079e0;
rand_r = 0x40007af4;
__sclose = 0x4001a700;
__seofread = 0x4001a690;
setlocale = 0x40001c44;
_setlocale_r = 0x40001bdc;
__sfmoreglue = 0x4001a4c8;
__sfp = 0x4001a590;
__sfp_lock_acquire = 0x4001a508;
__sfp_lock_release = 0x4001a514;
__sinit = 0x4001a538;
__sinit_lock_acquire = 0x4001a520;
__sinit_lock_release = 0x4001a52c;
strndup = 0x40007fe8;
_strndup_r = 0x40007ffc;
wcrtomb = 0x400012f4;
_wcrtomb_r = 0x400012a0;
_wctomb_r = 0x400018ac;
strdup = 0x40007d84;
_strdup_r = 0x40007d98;
__locale_ctype_ptr = 0x40001c2c;
__locale_ctype_ptr_l = 0x40001c24;
__locale_mb_cur_max = 0x40001c0c;
strcasecmp = 0x40007b38;
strcasestr = 0x40007b7c;

View File

@ -0,0 +1,66 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
esp_rom_newlib_init_common_mutexes = 0x400011dc;
memset = 0x400011e8;
memcpy = 0x400011f4;
memmove = 0x40001200;
memcmp = 0x4000120c;
strcpy = 0x40001218;
strncpy = 0x40001224;
strcmp = 0x40001230;
strncmp = 0x4000123c;
strlen = 0x40001248;
strstr = 0x40001254;
bzero = 0x40001260;
sbrk = 0x40001278;
isalnum = 0x40001284;
isalpha = 0x40001290;
isascii = 0x4000129c;
isblank = 0x400012a8;
iscntrl = 0x400012b4;
isdigit = 0x400012c0;
islower = 0x400012cc;
isgraph = 0x400012d8;
isprint = 0x400012e4;
ispunct = 0x400012f0;
isspace = 0x400012fc;
isupper = 0x40001308;
toupper = 0x40001314;
tolower = 0x40001320;
toascii = 0x4000132c;
memccpy = 0x40001338;
memchr = 0x40001344;
memrchr = 0x40001350;
strcasecmp = 0x4000135c;
strcasestr = 0x40001368;
strcat = 0x40001374;
strchr = 0x4000138c;
strcspn = 0x40001398;
strcoll = 0x400013a4;
strlcat = 0x400013b0;
strlcpy = 0x400013bc;
strlwr = 0x400013c8;
strncasecmp = 0x400013d4;
strncat = 0x400013e0;
strnlen = 0x400013f8;
strrchr = 0x40001404;
strsep = 0x40001410;
strspn = 0x4000141c;
strtok_r = 0x40001428;
strupr = 0x40001434;
longjmp = 0x40001440;
setjmp = 0x4000144c;
abs = 0x40001458;
div = 0x40001464;
labs = 0x40001470;
ldiv = 0x4000147c;
qsort = 0x40001488;
rand_r = 0x40001494;
utoa = 0x400014b8;
itoa = 0x400014c4;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fceffd4;
_global_impure_ptr = 0x3fceffd0;

View File

@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
/* ROM function interface esp32s3.rom.newlib.ld for esp32s3 /* ROM function interface esp32s3.rom.newlib.ld for esp32s3
* *
* *
@ -5,76 +10,15 @@
* *
* Compatible with ROM where ECO version equal or greater to 0. * Compatible with ROM where ECO version equal or greater to 0.
* *
* THIS FILE WAS AUTOMATICALLY GENERATED. DO NOT EDIT. * THIS FILE WAS AUTOMATICALLY GENERATED. !!! BUT EDITED !!!
* The file was originally generated for use with newlib, but it was split into
* multiple files to make it compatible with picolibc.
*/ */
/***************************************
Group newlib
***************************************/
/* Functions */
esp_rom_newlib_init_common_mutexes = 0x400011dc;
memset = 0x400011e8;
memcpy = 0x400011f4;
memmove = 0x40001200;
memcmp = 0x4000120c;
strcpy = 0x40001218;
strncpy = 0x40001224;
strcmp = 0x40001230;
strncmp = 0x4000123c;
strlen = 0x40001248;
strstr = 0x40001254;
bzero = 0x40001260;
sbrk = 0x40001278;
isalnum = 0x40001284;
isalpha = 0x40001290;
isascii = 0x4000129c;
isblank = 0x400012a8;
iscntrl = 0x400012b4;
isdigit = 0x400012c0;
islower = 0x400012cc;
isgraph = 0x400012d8;
isprint = 0x400012e4;
ispunct = 0x400012f0;
isspace = 0x400012fc;
isupper = 0x40001308;
toupper = 0x40001314;
tolower = 0x40001320;
toascii = 0x4000132c;
memccpy = 0x40001338;
memchr = 0x40001344;
memrchr = 0x40001350;
strcasecmp = 0x4000135c;
strcasestr = 0x40001368;
strcat = 0x40001374;
strdup = 0x40001380; strdup = 0x40001380;
strchr = 0x4000138c;
strcspn = 0x40001398;
strcoll = 0x400013a4;
strlcat = 0x400013b0;
strlcpy = 0x400013bc;
strlwr = 0x400013c8;
strncasecmp = 0x400013d4;
strncat = 0x400013e0;
strndup = 0x400013ec; strndup = 0x400013ec;
strnlen = 0x400013f8;
strrchr = 0x40001404;
strsep = 0x40001410;
strspn = 0x4000141c;
strtok_r = 0x40001428;
strupr = 0x40001434;
longjmp = 0x40001440;
setjmp = 0x4000144c;
abs = 0x40001458;
div = 0x40001464;
labs = 0x40001470;
ldiv = 0x4000147c;
qsort = 0x40001488;
rand_r = 0x40001494;
rand = 0x400014a0; rand = 0x400014a0;
srand = 0x400014ac; srand = 0x400014ac;
utoa = 0x400014b8;
itoa = 0x400014c4;
atoi = 0x400014d0; atoi = 0x400014d0;
atol = 0x400014dc; atol = 0x400014dc;
strtol = 0x400014e8; strtol = 0x400014e8;
@ -85,6 +29,3 @@ PROVIDE( _fwalk = 0x40001518 );
PROVIDE( _fwalk_reent = 0x40001524 ); PROVIDE( _fwalk_reent = 0x40001524 );
PROVIDE( __swbuf_r = 0x40001548 ); PROVIDE( __swbuf_r = 0x40001548 );
__swbuf = 0x40001554; __swbuf = 0x40001554;
/* Data (.data, .bss, .rodata) */
syscall_table_ptr = 0x3fceffd4;
_global_impure_ptr = 0x3fceffd0;

View File

@ -12,6 +12,7 @@
#include <stddef.h> #include <stddef.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <assert.h>
#include "esp_rom_multi_heap.h" #include "esp_rom_multi_heap.h"

View File

@ -16,6 +16,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h>
#include "esp_rom_caps.h" #include "esp_rom_caps.h"
#include "esp_rom_tlsf.h" #include "esp_rom_tlsf.h"

View File

@ -15,6 +15,9 @@
#include "esp_log.h" #include "esp_log.h"
#include "spi_flash_mmap.h" #include "spi_flash_mmap.h"
#include "esp_flash_internal.h" #include "esp_flash_internal.h"
#if CONFIG_NEWLIB_ENABLED
#include "esp_newlib.h"
#endif
#include "esp_newlib.h" #include "esp_newlib.h"
#include "esp_xt_wdt.h" #include "esp_xt_wdt.h"
#include "esp_cpu.h" #include "esp_cpu.h"
@ -86,7 +89,7 @@ ESP_SYSTEM_INIT_FN(init_brownout, CORE, BIT(0), 104)
ESP_SYSTEM_INIT_FN(init_newlib_time, CORE, BIT(0), 105) ESP_SYSTEM_INIT_FN(init_newlib_time, CORE, BIT(0), 105)
{ {
esp_newlib_time_init(); esp_libc_time_init();
return ESP_OK; return ESP_OK;
} }

View File

@ -40,7 +40,7 @@ CORE: 100: init_heap in components/heap/heap_caps_init.c on BIT(0)
# esp_timer early initialization is required for esp_timer_get_time to work. # esp_timer early initialization is required for esp_timer_get_time to work.
CORE: 101: esp_timer_init_nonos in components/esp_timer/src/esp_timer_init.c on BIT(0) CORE: 101: esp_timer_init_nonos in components/esp_timer/src/esp_timer_init.c on BIT(0)
CORE: 102: init_newlib in components/newlib/newlib_init.c on BIT(0) CORE: 102: init_libc in components/newlib/src/init.c on BIT(0)
# Add the psram to heap, psram vaddr region is reserved when initialising the heap, after # Add the psram to heap, psram vaddr region is reserved when initialising the heap, after
# psram is initialised (and necessary reservation for psram usage), the rest of the psram # psram is initialised (and necessary reservation for psram usage), the rest of the psram
@ -57,7 +57,7 @@ CORE: 111: init_vfs_usj in components/esp_driver_usb_serial_jtag/src/usb_serial_
CORE: 112: init_vfs_usj_sec in components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c on BIT(0) CORE: 112: init_vfs_usj_sec in components/esp_driver_usb_serial_jtag/src/usb_serial_jtag_vfs.c on BIT(0)
CORE: 113: init_vfs_nullfs in components/vfs/nullfs.c on BIT(0) CORE: 113: init_vfs_nullfs in components/vfs/nullfs.c on BIT(0)
CORE: 114: init_vfs_console in components/esp_vfs_console/vfs_console.c on BIT(0) CORE: 114: init_vfs_console in components/esp_vfs_console/vfs_console.c on BIT(0)
CORE: 115: init_newlib_stdio in components/newlib/newlib_init.c on BIT(0) CORE: 115: init_libc_stdio in components/newlib/src/init.c on BIT(0)
CORE: 130: init_flash in components/esp_system/startup_funcs.c on BIT(0) CORE: 130: init_flash in components/esp_system/startup_funcs.c on BIT(0)
CORE: 140: init_efuse in components/efuse/src/esp_efuse_startup.c on BIT(0) CORE: 140: init_efuse in components/efuse/src/esp_efuse_startup.c on BIT(0)

View File

@ -24,9 +24,9 @@
// Newline conversion mode when transmitting // Newline conversion mode when transmitting
static esp_line_endings_t s_tx_mode = static esp_line_endings_t s_tx_mode =
#if CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF #if CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF
ESP_LINE_ENDINGS_CRLF; ESP_LINE_ENDINGS_CRLF;
#elif CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR #elif CONFIG_LIBC_STDOUT_LINE_ENDING_CR
ESP_LINE_ENDINGS_CR; ESP_LINE_ENDINGS_CR;
#else #else
ESP_LINE_ENDINGS_LF; ESP_LINE_ENDINGS_LF;
@ -34,9 +34,9 @@ static esp_line_endings_t s_tx_mode =
// Newline conversion mode when receiving // Newline conversion mode when receiving
static esp_line_endings_t s_rx_mode = static esp_line_endings_t s_rx_mode =
#if CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF #if CONFIG_LIBC_STDIN_LINE_ENDING_CRLF
ESP_LINE_ENDINGS_CRLF; ESP_LINE_ENDINGS_CRLF;
#elif CONFIG_NEWLIB_STDIN_LINE_ENDING_CR #elif CONFIG_LIBC_STDIN_LINE_ENDING_CR
ESP_LINE_ENDINGS_CR; ESP_LINE_ENDINGS_CR;
#else #else
ESP_LINE_ENDINGS_LF; ESP_LINE_ENDINGS_LF;

View File

@ -29,6 +29,10 @@ struct cached_data{
#endif #endif
FILINFO fileinfo; FILINFO fileinfo;
}; };
#endif // CONFIG_VFS_SUPPORT_DIR
#if !defined(FILENAME_MAX)
#define FILENAME_MAX 255
#endif #endif
typedef struct { typedef struct {

View File

@ -35,7 +35,11 @@
/* ----------------------- System -------------------------- */ /* ----------------------- System -------------------------- */
#if CONFIG_LIBC_NEWLIB
#define configUSE_NEWLIB_REENTRANT 1 #define configUSE_NEWLIB_REENTRANT 1
#else
#define configUSE_NEWLIB_REENTRANT 0
#endif
/* - FreeRTOS provides default for configTLS_BLOCK_TYPE. /* - FreeRTOS provides default for configTLS_BLOCK_TYPE.
* - We simply provide our own INIT and DEINIT functions * - We simply provide our own INIT and DEINIT functions

View File

@ -62,7 +62,11 @@
/* ----------------------- System -------------------------- */ /* ----------------------- System -------------------------- */
#if CONFIG_LIBC_NEWLIB
#define configUSE_NEWLIB_REENTRANT 1 #define configUSE_NEWLIB_REENTRANT 1
#else
#define configUSE_NEWLIB_REENTRANT 0
#endif
/* - FreeRTOS provides default for configTLS_BLOCK_TYPE. /* - FreeRTOS provides default for configTLS_BLOCK_TYPE.
* - We simply provide our own INIT and DEINIT functions * - We simply provide our own INIT and DEINIT functions

View File

@ -9,6 +9,7 @@
#include "mbedtls/aes.h" #include "mbedtls/aes.h"
#include "memory_checks.h" #include "memory_checks.h"
#include "soc/soc_caps.h" #include "soc/soc_caps.h"
#include "esp_newlib.h"
/* setUp runs before every test */ /* setUp runs before every test */
void setUp(void) void setUp(void)

View File

@ -6,6 +6,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <assert.h>
#include "test_mbedtls_utils.h" #include "test_mbedtls_utils.h"
static inline char to_hex_digit(unsigned val) static inline char to_hex_digit(unsigned val)

View File

@ -14,38 +14,53 @@ if(non_os_build)
endif() endif()
set(srcs set(srcs
"abort.c" "src/init.c"
"assert.c" "src/abort.c"
"heap.c" "src/assert.c"
"flockfile.c" "src/heap.c"
"locks.c" "src/locks.c"
"poll.c" "src/poll.c"
"pthread.c" "src/pthread.c"
"random.c" "src/random.c"
"getentropy.c" "src/getentropy.c"
"reent_init.c" "src/termios.c"
"newlib_init.c" "src/stdatomic.c"
"syscalls.c" "src/time.c"
"termios.c" "src/sysconf.c"
"stdatomic.c" "src/realpath.c"
"time.c" "src/scandir.c"
"sysconf.c" "src/syscalls.c"
"realpath.c" "src/reent_syscalls.c"
"scandir.c" "src/port/esp_time_impl.c")
)
if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND) if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND)
list(APPEND srcs "port/xtensa/stdatomic_s32c1i.c") list(APPEND srcs "src/port/xtensa/stdatomic_s32c1i.c")
endif() endif()
if(CONFIG_LIBC_NEWLIB)
list(APPEND srcs
"src/flockfile.c"
"src/reent_init.c"
"src/newlib_init.c")
else()
list(APPEND srcs
"src/picolibc/picolibc_init.c"
"src/picolibc/rand.c"
"src/picolibc/open_memstream.c")
endif()
list(APPEND ldfragments "src/newlib.lf" "src/system_libs.lf")
if(CONFIG_SPIRAM_CACHE_WORKAROUND) if(CONFIG_SPIRAM_CACHE_WORKAROUND)
set(ldfragments "esp32-spiram-rom-functions-c.lf") if(CONFIG_LIBC_NEWLIB)
list(APPEND ldfragments src/esp32-spiram-rom-functions-c.lf)
else()
list(APPEND ldfragments src/picolibc/esp32-spiram-rom-functions-c.lf)
endif()
endif() endif()
list(APPEND ldfragments "newlib.lf" "system_libs.lf")
idf_component_register(SRCS "${srcs}" idf_component_register(SRCS "${srcs}"
INCLUDE_DIRS "${include_dirs}" INCLUDE_DIRS platform_include
PRIV_INCLUDE_DIRS priv_include PRIV_INCLUDE_DIRS priv_include
PRIV_REQUIRES soc spi_flash PRIV_REQUIRES soc spi_flash
LDFRAGMENTS "${ldfragments}") LDFRAGMENTS "${ldfragments}")
@ -57,22 +72,22 @@ target_link_libraries(${COMPONENT_LIB} INTERFACE c m ${CONFIG_COMPILER_RT_LIB_NA
set_source_files_properties(heap.c PROPERTIES COMPILE_FLAGS -fno-builtin) set_source_files_properties(heap.c PROPERTIES COMPILE_FLAGS -fno-builtin)
if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND) if(CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND)
set_source_files_properties("port/xtensa/stdatomic_s32c1i.c" set_source_files_properties("src/port/xtensa/stdatomic_s32c1i.c"
PROPERTIES COMPILE_FLAGS "-mno-disable-hardware-atomics") PROPERTIES COMPILE_FLAGS "-mno-disable-hardware-atomics")
endif() endif()
# Forces the linker to include heap, syscall, pthread, assert, and retargetable locks from this component, # Forces the linker to include heap, syscall, pthread, assert, and retargetable locks from this component,
# instead of the implementations provided by newlib. # instead of the implementations provided by newlib.
list(APPEND EXTRA_LINK_FLAGS "-u newlib_include_heap_impl") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_heap_impl")
list(APPEND EXTRA_LINK_FLAGS "-u newlib_include_syscalls_impl") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_reent_syscalls_impl")
list(APPEND EXTRA_LINK_FLAGS "-u newlib_include_pthread_impl") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_syscalls_impl")
list(APPEND EXTRA_LINK_FLAGS "-u newlib_include_assert_impl") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_pthread_impl")
list(APPEND EXTRA_LINK_FLAGS "-u newlib_include_getentropy_impl") list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_assert_impl")
list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_getentropy_impl")
list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_include_init_funcs")
list(APPEND EXTRA_LINK_FLAGS "-u esp_libc_init_funcs")
target_link_libraries(${COMPONENT_LIB} INTERFACE "${EXTRA_LINK_FLAGS}") target_link_libraries(${COMPONENT_LIB} INTERFACE "${EXTRA_LINK_FLAGS}")
# Forces the linker to include newlib_init.c
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u newlib_include_init_funcs")
if(CONFIG_NEWLIB_NANO_FORMAT) if(CONFIG_NEWLIB_NANO_FORMAT)
if(CMAKE_C_COMPILER_ID MATCHES "Clang") if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set(libc_dir_cmd ${CMAKE_C_COMPILER}) set(libc_dir_cmd ${CMAKE_C_COMPILER})
@ -89,7 +104,7 @@ if(CONFIG_NEWLIB_NANO_FORMAT)
endif() endif()
endif() endif()
add_subdirectory(port) add_subdirectory(src/port)
# if lwip is included in the build, add it as a public requirement so that # if lwip is included in the build, add it as a public requirement so that
# #include <sys/socket.h> works without any special provisions. # #include <sys/socket.h> works without any special provisions.

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,19 @@
menu "Newlib" menu "LibC"
choice NEWLIB_STDOUT_LINE_ENDING choice LIBC
prompt "LibC to build application with"
default LIBC_NEWLIB
config LIBC_NEWLIB
bool "NewLib"
config LIBC_PICOLIBC
bool "Picolibc (EXPERIMENTAL)"
depends on !IDF_TOOLCHAIN_CLANG && IDF_EXPERIMENTAL_FEATURES
endchoice
choice LIBC_STDOUT_LINE_ENDING
prompt "Line ending for console output" prompt "Line ending for console output"
default NEWLIB_STDOUT_LINE_ENDING_CRLF default LIBC_STDOUT_LINE_ENDING_CRLF
depends on VFS_SUPPORT_IO depends on VFS_SUPPORT_IO
help help
This option allows configuring the desired line endings sent to console This option allows configuring the desired line endings sent to console
@ -17,17 +28,17 @@ menu "Newlib"
This option doesn't affect behavior of the UART driver (drivers/uart.h). This option doesn't affect behavior of the UART driver (drivers/uart.h).
config NEWLIB_STDOUT_LINE_ENDING_CRLF config LIBC_STDOUT_LINE_ENDING_CRLF
bool "CRLF" bool "CRLF"
config NEWLIB_STDOUT_LINE_ENDING_LF config LIBC_STDOUT_LINE_ENDING_LF
bool "LF" bool "LF"
config NEWLIB_STDOUT_LINE_ENDING_CR config LIBC_STDOUT_LINE_ENDING_CR
bool "CR" bool "CR"
endchoice endchoice
choice NEWLIB_STDIN_LINE_ENDING choice LIBC_STDIN_LINE_ENDING
prompt "Line ending for console input" prompt "Line ending for console input"
default NEWLIB_STDIN_LINE_ENDING_CR default LIBC_STDIN_LINE_ENDING_CR
depends on VFS_SUPPORT_IO depends on VFS_SUPPORT_IO
help help
This option allows configuring which input sequence on console produces This option allows configuring which input sequence on console produces
@ -42,17 +53,18 @@ menu "Newlib"
This option doesn't affect behavior of the UART driver (drivers/uart.h). This option doesn't affect behavior of the UART driver (drivers/uart.h).
config NEWLIB_STDIN_LINE_ENDING_CRLF config LIBC_STDIN_LINE_ENDING_CRLF
bool "CRLF" bool "CRLF"
config NEWLIB_STDIN_LINE_ENDING_LF config LIBC_STDIN_LINE_ENDING_LF
bool "LF" bool "LF"
config NEWLIB_STDIN_LINE_ENDING_CR config LIBC_STDIN_LINE_ENDING_CR
bool "CR" bool "CR"
endchoice endchoice
config NEWLIB_NANO_FORMAT config LIBC_NEWLIB_NANO_FORMAT
bool "Enable 'nano' formatting options for printf/scanf family" bool "Enable 'nano' formatting options for printf/scanf family"
default y if IDF_TARGET_ESP32C2 default y if IDF_TARGET_ESP32C2
depends on LIBC_NEWLIB
help help
In most chips the ROM contains parts of newlib C library, including printf/scanf family In most chips the ROM contains parts of newlib C library, including printf/scanf family
of functions. These functions have been compiled with so-called "nano" of functions. These functions have been compiled with so-called "nano"
@ -76,9 +88,9 @@ menu "Newlib"
If you need 64-bit integer formatting support or C99 features, keep this If you need 64-bit integer formatting support or C99 features, keep this
option disabled. option disabled.
choice NEWLIB_TIME_SYSCALL choice LIBC_TIME_SYSCALL
prompt "Timers used for gettimeofday function" prompt "Timers used for gettimeofday function"
default NEWLIB_TIME_SYSCALL_USE_RTC_HRT default LIBC_TIME_SYSCALL_USE_RTC_HRT
help help
This setting defines which hardware timers are used to This setting defines which hardware timers are used to
implement 'gettimeofday' and 'time' functions in C library. implement 'gettimeofday' and 'time' functions in C library.
@ -104,22 +116,22 @@ menu "Newlib"
- When RTC is used for timekeeping, two RTC_STORE registers are - When RTC is used for timekeeping, two RTC_STORE registers are
used to keep time in deep sleep mode. used to keep time in deep sleep mode.
config NEWLIB_TIME_SYSCALL_USE_RTC_HRT config LIBC_TIME_SYSCALL_USE_RTC_HRT
bool "RTC and high-resolution timer" bool "RTC and high-resolution timer"
select ESP_TIME_FUNCS_USE_RTC_TIMER select ESP_TIME_FUNCS_USE_RTC_TIMER
select ESP_TIME_FUNCS_USE_ESP_TIMER select ESP_TIME_FUNCS_USE_ESP_TIMER
config NEWLIB_TIME_SYSCALL_USE_RTC config LIBC_TIME_SYSCALL_USE_RTC
bool "RTC" bool "RTC"
select ESP_TIME_FUNCS_USE_RTC_TIMER select ESP_TIME_FUNCS_USE_RTC_TIMER
config NEWLIB_TIME_SYSCALL_USE_HRT config LIBC_TIME_SYSCALL_USE_HRT
bool "High-resolution timer" bool "High-resolution timer"
select ESP_TIME_FUNCS_USE_ESP_TIMER select ESP_TIME_FUNCS_USE_ESP_TIMER
config NEWLIB_TIME_SYSCALL_USE_NONE config LIBC_TIME_SYSCALL_USE_NONE
bool "None" bool "None"
select ESP_TIME_FUNCS_USE_NONE select ESP_TIME_FUNCS_USE_NONE
endchoice endchoice
endmenu # Newlib endmenu # LibC
config STDATOMIC_S32C1I_SPIRAM_WORKAROUND config STDATOMIC_S32C1I_SPIRAM_WORKAROUND
bool bool

View File

@ -41,6 +41,7 @@
#pragma once #pragma once
#include <sdkconfig.h>
#include <stdint.h> #include <stdint.h>
/* /*
@ -65,6 +66,7 @@ extern "C" {
* Host to big endian, host to little endian, big endian to host, and little * Host to big endian, host to little endian, big endian to host, and little
* endian to host byte order functions as detailed in byteorder(9). * endian to host byte order functions as detailed in byteorder(9).
*/ */
#if CONFIG_LIBC_NEWLIB
#if _BYTE_ORDER == _LITTLE_ENDIAN #if _BYTE_ORDER == _LITTLE_ENDIAN
#define htobe16(x) bswap16((x)) #define htobe16(x) bswap16((x))
#define htobe32(x) bswap32((x)) #define htobe32(x) bswap32((x))
@ -94,6 +96,7 @@ extern "C" {
#define le32toh(x) bswap32((x)) #define le32toh(x) bswap32((x))
#define le64toh(x) bswap64((x)) #define le64toh(x) bswap64((x))
#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
#endif /* CONFIG_LIBC_NEWLIB */
/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */

View File

@ -3,7 +3,7 @@
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
/* TODO IDF-11226 rename this file to esp_libc.h */
#pragma once #pragma once
#include <sys/reent.h> #include <sys/reent.h>
@ -12,18 +12,17 @@
extern "C" { extern "C" {
#endif #endif
/*
* Initialize newlib time functions
*/
void esp_newlib_time_init(void);
/** /**
* Replacement for newlib's _REENT_INIT_PTR and __sinit. * Function which sets up newlib in ROM for use with ESP-IDF
* *
* Called from startup code and FreeRTOS, not intended to be called from * Includes defining the syscall table, setting up any common locks, etc.
* application code. *
* Called from the startup code, not intended to be called from application
* code.
*/ */
void esp_reent_init(struct _reent* r); void esp_libc_init(void);
void esp_setup_syscall_table(void) __attribute__((deprecated("Please call esp_libc_init() in newer code")));
/** /**
* Postponed _GLOBAL_REENT stdio FPs initialization. * Postponed _GLOBAL_REENT stdio FPs initialization.
@ -34,25 +33,29 @@ void esp_reent_init(struct _reent* r);
* application code. * application code.
* *
*/ */
void esp_newlib_init_global_stdio(const char* stdio_dev); #if CONFIG_VFS_SUPPORT_IO
void esp_libc_init_global_stdio(const char *stdio_dev);
#else
void esp_libc_init_global_stdio(void);
#endif
void esp_libc_time_init(void);
#if CONFIG_LIBC_NEWLIB
/**
* Replacement for newlib's _REENT_INIT_PTR and __sinit.
*
* Called from startup code and FreeRTOS, not intended to be called from
* application code.
*/
void esp_reent_init(struct _reent* r);
#endif
/** /**
* Clean up some of lazily allocated buffers in REENT structures. * Clean up some of lazily allocated buffers in REENT structures.
*/ */
void esp_reent_cleanup(void); void esp_reent_cleanup(void);
/**
* Function which sets up newlib in ROM for use with ESP-IDF
*
* Includes defining the syscall table, setting up any common locks, etc.
*
* Called from the startup code, not intended to be called from application
* code.
*/
void esp_newlib_init(void);
void esp_setup_syscall_table(void) __attribute__((deprecated("Please call esp_newlib_init() in newer code")));
/** /**
* Update current microsecond time from RTC * Update current microsecond time from RTC
*/ */
@ -67,9 +70,14 @@ void esp_sync_timekeeping_timers(void);
#define esp_sync_counters_rtc_and_frc esp_sync_timekeeping_timers #define esp_sync_counters_rtc_and_frc esp_sync_timekeeping_timers
/** /**
* Initialize newlib static locks * Initialize libc static locks
*/ */
void esp_newlib_locks_init(void); void esp_libc_locks_init(void);
/* TODO IDF-11226 */
void esp_newlib_time_init(void) __attribute__((deprecated("Please use esp_libc_time_init instead")));
void esp_newlib_init(void) __attribute__((deprecated("Please use esp_libc_init instead")));
void esp_newlib_locks_init(void) __attribute__((deprecated("Please use esp_libc_locks_init instead")));
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "sdkconfig.h"
#include_next <stdio.h>
#if CONFIG_LIBC_PICOLIBC
FILE *open_memstream(char **, size_t *);
#endif

View File

@ -0,0 +1,14 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "sdkconfig.h"
#if CONFIG_LIBC_NEWLIB
#include_next <stdio_ext.h>
#else
#include <stdio-bufio.h>
#endif

View File

@ -7,7 +7,8 @@
#ifndef _ESP_PLATFORM_ERRNO_H_ #ifndef _ESP_PLATFORM_ERRNO_H_
#define _ESP_PLATFORM_ERRNO_H_ #define _ESP_PLATFORM_ERRNO_H_
#include_next "errno.h" #include_next "sys/errno.h"
#include "sdkconfig.h"
// //
// Possibly define some missing errors // Possibly define some missing errors
@ -28,4 +29,9 @@
#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ #define EAI_BADFLAGS 3 /* invalid value for ai_flags */
#endif #endif
#if CONFIG_LIBC_PICOLIBC
#undef __errno_r
#define __errno_r(r) errno
#endif
#endif // _ESP_PLATFORM_ERRNO_H_ #endif // _ESP_PLATFORM_ERRNO_H_

View File

@ -8,6 +8,10 @@
#include_next <sys/lock.h> #include_next <sys/lock.h>
#include "sdkconfig.h" #include "sdkconfig.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _RETARGETABLE_LOCKING #ifdef _RETARGETABLE_LOCKING
/* Actual platfrom-specific definition of struct __lock. /* Actual platfrom-specific definition of struct __lock.
@ -48,4 +52,12 @@ int _lock_try_acquire_recursive(_lock_t *plock);
void _lock_release(_lock_t *plock); void _lock_release(_lock_t *plock);
void _lock_release_recursive(_lock_t *plock); void _lock_release_recursive(_lock_t *plock);
#if CONFIG_LIBC_PICOLIBC
#define __lock_try_acquire(lock) _lock_try_acquire(&(lock))
#define __lock_try_acquire_recursive(lock) _lock_try_acquire_recursive(&(lock))
#endif // CONFIG_LIBC_PICOLIBC
#endif // _RETARGETABLE_LOCKING #endif // _RETARGETABLE_LOCKING
#ifdef __cplusplus
}
#endif

View File

@ -5,22 +5,37 @@
*/ */
#pragma once #pragma once
#include "sdkconfig.h"
#if CONFIG_LIBC_NEWLIB
#define _REENT_BACKWARD_BINARY_COMPAT #define _REENT_BACKWARD_BINARY_COMPAT
#define _REENT_SDIDINIT(_ptr) ((_ptr)->_reserved_0) #define _REENT_SDIDINIT(_ptr) ((_ptr)->_reserved_0)
#define _REENT_SGLUE(_ptr) (__sglue) #define _REENT_SGLUE(_ptr) (__sglue)
#include_next<sys/reent.h> #include_next<sys/reent.h>
#endif // CONFIG_LIBC_NEWLIB
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#if CONFIG_LIBC_NEWLIB
extern void __sinit(struct _reent *); extern void __sinit(struct _reent *);
extern struct _glue __sglue; extern struct _glue __sglue;
extern struct _reent * _global_impure_ptr; extern struct _reent * _global_impure_ptr;
#else // CONFIG_LIBC_NEWLIB
struct _reent {};
#define __getreent() NULL
int _system_r(struct _reent *r, const char *str);
int _raise_r(struct _reent *r, int sig);
#endif // CONFIG_LIBC_NEWLIB
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -5,8 +5,6 @@
*/ */
#pragma once #pragma once
void esp_time_impl_init(void);
uint64_t esp_time_impl_get_time(void); uint64_t esp_time_impl_get_time(void);
uint64_t esp_time_impl_get_time_since_boot(void); uint64_t esp_time_impl_get_time_since_boot(void);
@ -16,3 +14,7 @@ uint32_t esp_time_impl_get_time_resolution(void);
void esp_time_impl_set_boot_time(uint64_t t); void esp_time_impl_set_boot_time(uint64_t t);
uint64_t esp_time_impl_get_boot_time(void); uint64_t esp_time_impl_get_boot_time(void);
void esp_sync_timekeeping_timers(void);
void esp_set_time_from_rtc(void);

View File

@ -0,0 +1,17 @@
# sdkconfig replacement configurations for deprecated options formatted as
# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
CONFIG_NEWLIB_STDOUT_LINE_ENDING CONFIG_LIBC_STDOUT_LINE_ENDING
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF
CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF CONFIG_LIBC_STDOUT_LINE_ENDING_LF
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR CONFIG_LIBC_STDOUT_LINE_ENDING_CR
CONFIG_NEWLIB_STDIN_LINE_ENDING CONFIG_LIBC_STDIN_LINE_ENDING
CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF CONFIG_LIBC_STDIN_LINE_ENDING_CRLF
CONFIG_NEWLIB_STDIN_LINE_ENDING_LF CONFIG_LIBC_STDIN_LINE_ENDING_LF
CONFIG_NEWLIB_STDIN_LINE_ENDING_CR CONFIG_LIBC_STDIN_LINE_ENDING_CR
CONFIG_NEWLIB_NANO_FORMAT CONFIG_LIBC_NEWLIB_NANO_FORMAT
CONFIG_NEWLIB_TIME_SYSCALL CONFIG_LIBC_TIME_SYSCALL
CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC CONFIG_LIBC_TIME_SYSCALL_USE_RTC
CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_LIBC_TIME_SYSCALL_USE_HRT
CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE CONFIG_LIBC_TIME_SYSCALL_USE_NONE

View File

@ -1,9 +1,9 @@
# sdkconfig replacement configurations for deprecated options formatted as # sdkconfig replacement configurations for deprecated options formatted as
# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION # CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32_TIME_SYSCALL_USE_RTC CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC CONFIG_ESP32_TIME_SYSCALL_USE_RTC CONFIG_LIBC_TIME_SYSCALL_USE_RTC
CONFIG_ESP32_TIME_SYSCALL_USE_HRT CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32_TIME_SYSCALL_USE_HRT CONFIG_LIBC_TIME_SYSCALL_USE_HRT
CONFIG_ESP32_TIME_SYSCALL_USE_NONE CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE CONFIG_ESP32_TIME_SYSCALL_USE_NONE CONFIG_LIBC_TIME_SYSCALL_USE_NONE
CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_HRT

View File

@ -1,7 +1,7 @@
# sdkconfig replacement configurations for deprecated options formatted as # sdkconfig replacement configurations for deprecated options formatted as
# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION # CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC CONFIG_ESP32C3_TIME_SYSCALL_USE_RTC CONFIG_LIBC_TIME_SYSCALL_USE_RTC
CONFIG_ESP32C3_TIME_SYSCALL_USE_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32C3_TIME_SYSCALL_USE_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_HRT
CONFIG_ESP32C3_TIME_SYSCALL_USE_NONE CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE CONFIG_ESP32C3_TIME_SYSCALL_USE_NONE CONFIG_LIBC_TIME_SYSCALL_USE_NONE

View File

@ -1,9 +1,9 @@
# sdkconfig replacement configurations for deprecated options formatted as # sdkconfig replacement configurations for deprecated options formatted as
# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION # CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC CONFIG_LIBC_TIME_SYSCALL_USE_RTC
CONFIG_ESP32S2_TIME_SYSCALL_USE_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32S2_TIME_SYSCALL_USE_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_HRT
CONFIG_ESP32S2_TIME_SYSCALL_USE_NONE CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE CONFIG_ESP32S2_TIME_SYSCALL_USE_NONE CONFIG_LIBC_TIME_SYSCALL_USE_NONE
CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32S2_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32S2_TIME_SYSCALL_USE_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32S2_TIME_SYSCALL_USE_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_HRT

View File

@ -1,9 +1,9 @@
# sdkconfig replacement configurations for deprecated options formatted as # sdkconfig replacement configurations for deprecated options formatted as
# CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION # CONFIG_DEPRECATED_OPTION CONFIG_NEW_OPTION
CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC CONFIG_LIBC_TIME_SYSCALL_USE_RTC
CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER CONFIG_LIBC_TIME_SYSCALL_USE_HRT
CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE CONFIG_LIBC_TIME_SYSCALL_USE_NONE
CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT
CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 CONFIG_LIBC_TIME_SYSCALL_USE_HRT

View File

@ -81,12 +81,16 @@ void __attribute__((noreturn)) __assert_func(const char *file, int line, const c
#endif /* CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT */ #endif /* CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT */
} }
#if CONFIG_LIBC_NEWLIB
void __attribute__((noreturn)) __assert(const char *file, int line, const char *failedexpr) void __attribute__((noreturn)) __assert(const char *file, int line, const char *failedexpr)
#else
void __attribute__((noreturn)) __assert(const char *file, const char *failedexpr, int line)
#endif
{ {
__assert_func(file, line, NULL, failedexpr); __assert_func(file, line, NULL, failedexpr);
} }
/* No-op function, used to force linker to include these changes */ /* No-op function, used to force linker to include these changes */
void newlib_include_assert_impl(void) void esp_libc_include_assert_impl(void)
{ {
} }

View File

@ -29,7 +29,7 @@ int getentropy(void *buffer, size_t length)
return 0; return 0;
} }
void newlib_include_getentropy_impl(void) void esp_libc_include_getentropy_impl(void)
{ {
// Linker hook, exists for no other purpose // Linker hook, exists for no other purpose
} }

View File

@ -24,11 +24,6 @@ void* malloc(size_t size)
return heap_caps_malloc_default(size); return heap_caps_malloc_default(size);
} }
void* calloc(size_t n, size_t size)
{
return _calloc_r(_REENT, n, size);
}
void* realloc(void* ptr, size_t size) void* realloc(void* ptr, size_t size)
{ {
return heap_caps_realloc_default(ptr, size); return heap_caps_realloc_default(ptr, size);
@ -39,22 +34,8 @@ void free(void *ptr)
heap_caps_free(ptr); heap_caps_free(ptr);
} }
void* _malloc_r(struct _reent *r, size_t size) ESP_COMPILER_DIAGNOSTIC_PUSH_IGNORE("-Wanalyzer-malloc-leak")
{ void* calloc(size_t nmemb, size_t size)
return heap_caps_malloc_default(size);
}
void _free_r(struct _reent *r, void* ptr)
{
heap_caps_free(ptr);
}
void* _realloc_r(struct _reent *r, void* ptr, size_t size)
{
return heap_caps_realloc_default(ptr, size);
}
void* _calloc_r(struct _reent *r, size_t nmemb, size_t size)
{ {
void *result; void *result;
size_t size_bytes; size_t size_bytes;
@ -68,6 +49,29 @@ void* _calloc_r(struct _reent *r, size_t nmemb, size_t size)
} }
return result; return result;
} }
ESP_COMPILER_DIAGNOSTIC_POP("-Wanalyzer-malloc-leak")
#if CONFIG_LIBC_NEWLIB
void _free_r(struct _reent *r, void* ptr)
{
heap_caps_free(ptr);
}
void* _realloc_r(struct _reent *r, void* ptr, size_t size)
{
return heap_caps_realloc_default(ptr, size);
}
void* _malloc_r(struct _reent *r, size_t size)
{
return heap_caps_malloc_default(size);
}
void* _calloc_r(struct _reent *r, size_t nmemb, size_t size)
{
return calloc(nmemb, size);
}
#endif
void* memalign(size_t alignment, size_t n) void* memalign(size_t alignment, size_t n)
{ {
@ -99,7 +103,7 @@ int posix_memalign(void **out_ptr, size_t alignment, size_t size)
/* No-op function, used to force linking this file, /* No-op function, used to force linking this file,
instead of the heap implementation from newlib. instead of the heap implementation from newlib.
*/ */
void newlib_include_heap_impl(void) void esp_libc_include_heap_impl(void)
{ {
} }

View File

@ -0,0 +1,30 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "sdkconfig.h"
#include "esp_newlib.h"
#include "esp_private/startup_internal.h"
#include "esp_bit_defs.h"
ESP_SYSTEM_INIT_FN(init_libc, CORE, BIT(0), 102)
{
esp_libc_init();
return ESP_OK;
}
ESP_SYSTEM_INIT_FN(init_libc_stdio, CORE, BIT(0), 115)
{
#if CONFIG_VFS_SUPPORT_IO
esp_libc_init_global_stdio("/dev/console");
#else
esp_libc_init_global_stdio();
#endif
return ESP_OK;
}
// Hook to force the linker to include this file
void esp_libc_init_funcs(void)
{
}

View File

@ -14,6 +14,8 @@
#include "freertos/portable.h" #include "freertos/portable.h"
#include "esp_rom_caps.h" #include "esp_rom_caps.h"
#include "sdkconfig.h"
/* Notes on our newlib lock implementation: /* Notes on our newlib lock implementation:
* *
* - Use FreeRTOS mutex semaphores as locks. * - Use FreeRTOS mutex semaphores as locks.
@ -24,12 +26,16 @@
* protected by lock_init_spinlock. * protected by lock_init_spinlock.
* - Race conditions around lazy initialisation (via lock_acquire) are * - Race conditions around lazy initialisation (via lock_acquire) are
* protected against. * protected against.
* - Anyone calling lock_close is reponsible for ensuring noone else * - Anyone calling lock_close is responsible for ensuring no one else
* is holding the lock at this time. * is holding the lock at this time.
* - Race conditions between lock_close & lock_init (for the same lock) * - Race conditions between lock_close & lock_init (for the same lock)
* are the responsibility of the caller. * are the responsibility of the caller.
*/ */
#if CONFIG_LIBC_PICOLIBC
struct __lock __lock___libc_recursive_mutex;
#endif
static portMUX_TYPE lock_init_spinlock = portMUX_INITIALIZER_UNLOCKED; static portMUX_TYPE lock_init_spinlock = portMUX_INITIALIZER_UNLOCKED;
/* Initialize the given lock by allocating a new mutex semaphore /* Initialize the given lock by allocating a new mutex semaphore
@ -359,23 +365,13 @@ extern StaticSemaphore_t __attribute__((alias("s_common_mutex"))) __lock___tz_mu
extern StaticSemaphore_t __attribute__((alias("s_common_mutex"))) __lock___dd_hash_mutex; extern StaticSemaphore_t __attribute__((alias("s_common_mutex"))) __lock___dd_hash_mutex;
extern StaticSemaphore_t __attribute__((alias("s_common_mutex"))) __lock___arc4random_mutex; extern StaticSemaphore_t __attribute__((alias("s_common_mutex"))) __lock___arc4random_mutex;
void esp_newlib_locks_init(void) #if CONFIG_LIBC_NEWLIB
static void esp_libc_newlib_locks_init(void)
{ {
/* Initialize the two mutexes used for the locks above.
* Asserts below check our assumption that SemaphoreHandle_t will always
* point to the corresponding StaticSemaphore_t structure.
*/
SemaphoreHandle_t handle;
handle = xSemaphoreCreateMutexStatic(&s_common_mutex);
assert(handle == (SemaphoreHandle_t) &s_common_mutex);
handle = xSemaphoreCreateRecursiveMutexStatic(&s_common_recursive_mutex);
assert(handle == (SemaphoreHandle_t) &s_common_recursive_mutex);
(void) handle;
/* Chip ROMs are built with older versions of newlib, and rely on different lock variables. /* Chip ROMs are built with older versions of newlib, and rely on different lock variables.
* Initialize these locks to the same values. * Initialize these locks to the same values.
*/ */
#ifdef CONFIG_IDF_TARGET_ESP32 #if CONFIG_IDF_TARGET_ESP32
/* Newlib 2.2.0 is used in ROM, the following lock symbols are defined: */ /* Newlib 2.2.0 is used in ROM, the following lock symbols are defined: */
extern _lock_t __sfp_lock; extern _lock_t __sfp_lock;
__sfp_lock = (_lock_t) &s_common_recursive_mutex; __sfp_lock = (_lock_t) &s_common_recursive_mutex;
@ -385,7 +381,7 @@ void esp_newlib_locks_init(void)
__env_lock_object = (_lock_t) &s_common_recursive_mutex; __env_lock_object = (_lock_t) &s_common_recursive_mutex;
extern _lock_t __tz_lock_object; extern _lock_t __tz_lock_object;
__tz_lock_object = (_lock_t) &s_common_mutex; __tz_lock_object = (_lock_t) &s_common_mutex;
#elif defined(CONFIG_IDF_TARGET_ESP32S2) #elif CONFIG_IDF_TARGET_ESP32S2
/* Newlib 3.0.0 is used in ROM, the following lock symbols are defined: */ /* Newlib 3.0.0 is used in ROM, the following lock symbols are defined: */
extern _lock_t __sinit_recursive_mutex; extern _lock_t __sinit_recursive_mutex;
__sinit_recursive_mutex = (_lock_t) &s_common_recursive_mutex; __sinit_recursive_mutex = (_lock_t) &s_common_recursive_mutex;
@ -405,3 +401,28 @@ void esp_newlib_locks_init(void)
#error Unsupported target #error Unsupported target
#endif #endif
} }
#endif // CONFIG_LIBC_NEWLIB
/* TODO IDF-11226 */
void esp_newlib_locks_init(void) __attribute__((alias("esp_libc_locks_init")));
void esp_libc_locks_init(void)
{
/* Initialize the two mutexes used for the locks above.
* Asserts below check our assumption that SemaphoreHandle_t will always
* point to the corresponding StaticSemaphore_t structure.
*/
SemaphoreHandle_t handle;
handle = xSemaphoreCreateMutexStatic(&s_common_mutex);
assert(handle == (SemaphoreHandle_t) &s_common_mutex);
handle = xSemaphoreCreateRecursiveMutexStatic(&s_common_recursive_mutex);
assert(handle == (SemaphoreHandle_t) &s_common_recursive_mutex);
#if CONFIG_LIBC_PICOLIBC
handle = xSemaphoreCreateRecursiveMutexStatic((StaticQueue_t *) &__lock___libc_recursive_mutex);
assert(handle == (SemaphoreHandle_t) &__lock___libc_recursive_mutex);
#endif
(void) handle;
#if CONFIG_LIBC_NEWLIB
esp_libc_newlib_locks_init();
#endif
}

View File

@ -21,7 +21,6 @@
#include "soc/soc_caps.h" #include "soc/soc_caps.h"
#include "esp_rom_caps.h" #include "esp_rom_caps.h"
#include "esp_rom_libc_stubs.h" #include "esp_rom_libc_stubs.h"
#include "esp_private/startup_internal.h"
extern int _printf_float(struct _reent *rptr, extern int _printf_float(struct _reent *rptr,
void *pdata, void *pdata,
@ -126,7 +125,9 @@ static struct syscall_stub_table s_stub_table = {
#endif #endif
}; };
void esp_newlib_init(void) /* TODO IDF-11226 */
void esp_newlib_init(void) __attribute__((alias("esp_libc_init")));
void esp_libc_init(void)
{ {
#if CONFIG_IDF_TARGET_ESP32 #if CONFIG_IDF_TARGET_ESP32
syscall_table_ptr_pro = syscall_table_ptr_app = &s_stub_table; syscall_table_ptr_pro = syscall_table_ptr_app = &s_stub_table;
@ -150,16 +151,10 @@ void esp_newlib_init(void)
} }
environ[0] = NULL; environ[0] = NULL;
esp_newlib_locks_init(); esp_libc_locks_init();
} }
ESP_SYSTEM_INIT_FN(init_newlib, CORE, BIT(0), 102) void esp_setup_newlib_syscalls(void) __attribute__((alias("esp_libc_init")));
{
esp_newlib_init();
return ESP_OK;
}
void esp_setup_newlib_syscalls(void) __attribute__((alias("esp_newlib_init")));
/** /**
* Postponed _GLOBAL_REENT stdio FPs initialization. * Postponed _GLOBAL_REENT stdio FPs initialization.
@ -169,46 +164,39 @@ void esp_setup_newlib_syscalls(void) __attribute__((alias("esp_newlib_init")));
* Called from startup code and FreeRTOS, not intended to be called from * Called from startup code and FreeRTOS, not intended to be called from
* application code. * application code.
*/ */
void esp_newlib_init_global_stdio(const char *stdio_dev) #if CONFIG_VFS_SUPPORT_IO
void esp_libc_init_global_stdio(const char *stdio_dev)
{ {
if (stdio_dev == NULL) { _REENT_STDIN(_GLOBAL_REENT) = fopen(stdio_dev, "r");
_GLOBAL_REENT->__cleanup = NULL; _REENT_STDOUT(_GLOBAL_REENT) = fopen(stdio_dev, "w");
_REENT_SDIDINIT(_GLOBAL_REENT) = 0; _REENT_STDERR(_GLOBAL_REENT) = fopen(stdio_dev, "w");
__sinit(_GLOBAL_REENT);
_GLOBAL_REENT->__cleanup = esp_cleanup_r;
_REENT_SDIDINIT(_GLOBAL_REENT) = 1;
} else {
_REENT_STDIN(_GLOBAL_REENT) = fopen(stdio_dev, "r");
_REENT_STDOUT(_GLOBAL_REENT) = fopen(stdio_dev, "w");
_REENT_STDERR(_GLOBAL_REENT) = fopen(stdio_dev, "w");
#if ESP_ROM_NEEDS_SWSETUP_WORKAROUND #if ESP_ROM_NEEDS_SWSETUP_WORKAROUND
/* /*
- This workaround for printf functions using 32-bit time_t after the 64-bit time_t upgrade - This workaround for printf functions using 32-bit time_t after the 64-bit time_t upgrade
- The 32-bit time_t usage is triggered through ROM Newlib functions printf related functions calling __swsetup_r() on - The 32-bit time_t usage is triggered through ROM Newlib functions printf related functions calling __swsetup_r() on
the first call to a particular file pointer (i.e., stdin, stdout, stderr) the first call to a particular file pointer (i.e., stdin, stdout, stderr)
- Thus, we call the toolchain version of __swsetup_r() now (before any printf calls are made) to setup all of the - Thus, we call the toolchain version of __swsetup_r() now (before any printf calls are made) to setup all of the
file pointers. Thus, the ROM newlib code will never call the ROM version of __swsetup_r(). file pointers. Thus, the ROM newlib code will never call the ROM version of __swsetup_r().
- See IDFGH-7728 for more details - See IDFGH-7728 for more details
*/ */
extern int __swsetup_r(struct _reent *, FILE *); extern int __swsetup_r(struct _reent *, FILE *);
__swsetup_r(_GLOBAL_REENT, _REENT_STDIN(_GLOBAL_REENT)); __swsetup_r(_GLOBAL_REENT, _REENT_STDIN(_GLOBAL_REENT));
__swsetup_r(_GLOBAL_REENT, _REENT_STDOUT(_GLOBAL_REENT)); __swsetup_r(_GLOBAL_REENT, _REENT_STDOUT(_GLOBAL_REENT));
__swsetup_r(_GLOBAL_REENT, _REENT_STDERR(_GLOBAL_REENT)); __swsetup_r(_GLOBAL_REENT, _REENT_STDERR(_GLOBAL_REENT));
#endif /* ESP_ROM_NEEDS_SWSETUP_WORKAROUND */ #endif /* ESP_ROM_NEEDS_SWSETUP_WORKAROUND */
}
} }
#else /* CONFIG_VFS_SUPPORT_IO */
ESP_SYSTEM_INIT_FN(init_newlib_stdio, CORE, BIT(0), 115) void esp_libc_init_global_stdio(void)
{ {
#if defined(CONFIG_VFS_SUPPORT_IO) _GLOBAL_REENT->__cleanup = NULL;
esp_newlib_init_global_stdio("/dev/console"); _REENT_SDIDINIT(_GLOBAL_REENT) = 0;
#else __sinit(_GLOBAL_REENT);
esp_newlib_init_global_stdio(NULL); _GLOBAL_REENT->__cleanup = esp_cleanup_r;
#endif _REENT_SDIDINIT(_GLOBAL_REENT) = 1;
return ESP_OK;
} }
#endif /* CONFIG_VFS_SUPPORT_IO */
// Hook to force the linker to include this file // Hook to force the linker to include this file
void newlib_include_init_funcs(void) void esp_libc_include_init_funcs(void)
{ {
} }

View File

@ -0,0 +1,162 @@
# If the Picolibc functions in ROM aren't used (eg because the external SPI RAM workaround is active), these functions will
# be linked into the application directly instead. Normally, they would end up in flash, which is undesirable because esp-idf
# and/or applications may assume that because these functions normally are in ROM, they are accessible even when flash is
# inaccessible. To work around this, this ld fragment places these functions in RAM instead. If the ROM functions are used,
# these defines do nothing, so they can still be included in that situation.
[mapping:libc]
archive:
libc.a
entries:
if SPIRAM_CACHE_WORKAROUND = y:
# The following libs are either used in a lot of places or in critical code. (such as panic or abort)
# Thus, they shall always be placed in IRAM.
libc_stdlib_itoa (noflash)
libc_string_memcmp (noflash)
libc_machine_xtensa_memcpy (noflash)
libc_machine_xtensa_memset (noflash)
libc_string_strcat (noflash)
libc_machine_xtensa_strcmp (noflash)
libc_machine_xtensa_strlen (noflash)
if SPIRAM_CACHE_LIBJMP_IN_IRAM = y:
libc_machine_xtensa_longjmp (noflash)
libc_machine_xtensa_setjmp (noflash)
if SPIRAM_CACHE_LIBMATH_IN_IRAM = y:
libc_stdlib_abs (noflash)
libc_stdlib_div (noflash)
libc_stdlib_labs (noflash)
libc_stdlib_ldiv (noflash)
libm_common_quorem (noflash)
libm_common_s_fpclassify (noflash)
libm_common_sf_nan (noflash)
if SPIRAM_CACHE_LIBNUMPARSER_IN_IRAM = y:
libc_stdlib_utoa (noflash)
libc_stdlib_atoi (noflash)
libc_stdlib_atol (noflash)
libc_tinystdio_strtol (noflash)
libc_tinystdio_strtoul (noflash)
if SPIRAM_CACHE_LIBIO_IN_IRAM = y:
libc_stdlib_wcrtomb (noflash)
libc_stdlib_fvwrite (noflash)
libc_stdlib_wbuf (noflash)
libc_stdlib_wsetup (noflash)
libc_tinystdio_fputwc (noflash)
libc_stdlib_wctomb_r (noflash)
libc_tinystdio_ungetc (noflash)
libc_tinystdio_makebuf (noflash)
libc_tinystdio_fflush (noflash)
libc_stdlib_refill (noflash)
libc_stdlib_sccl (noflash)
if SPIRAM_CACHE_LIBTIME_IN_IRAM = y:
libc_time_asctime (noflash)
libc_time_asctime_r (noflash)
libc_time_ctime (noflash)
libc_time_ctime_r (noflash)
libc_time_lcltime (noflash)
libc_time_lcltime_r (noflash)
libc_time_gmtime (noflash)
libc_time_gmtime_r (noflash)
libc_time_strftime (noflash)
libc_time_mktime (noflash)
libc_time_tzset_r (noflash)
libc_time_tzset (noflash)
libc_time_time (noflash)
libc_time_gettzinfo (noflash)
libc_time_systimes (noflash)
libc_time_month_lengths (noflash)
libc_time_timelocal (noflash)
libc_time_tzvars (noflash)
libc_time_tzlock (noflash)
libc_time_tzcalc_limits (noflash)
libc_time_strptime (noflash)
if SPIRAM_CACHE_LIBCHAR_IN_IRAM = y:
libc_ctype_ctype_ (noflash)
libc_ctype_toupper (noflash)
libc_ctype_tolower (noflash)
libc_ctype_toascii (noflash)
libc_string_strupr (noflash)
libc_string_bzero (noflash)
libc_ctype_isalnum (noflash)
libc_ctype_isalpha (noflash)
libc_ctype_isascii (noflash)
libc_ctype_isblank (noflash)
libc_ctype_iscntrl (noflash)
libc_ctype_isdigit (noflash)
libc_ctype_isgraph (noflash)
libc_ctype_islower (noflash)
libc_ctype_isprint (noflash)
libc_ctype_ispunct (noflash)
libc_ctype_isspace (noflash)
libc_ctype_isupper (noflash)
if SPIRAM_CACHE_LIBMEM_IN_IRAM = y:
libc_string_memccpy (noflash)
libc_string_memchr (noflash)
libc_string_memmove (noflash)
libc_string_memrchr (noflash)
if SPIRAM_CACHE_LIBSTR_IN_IRAM = y:
libc_string_strcasecmp (noflash)
libc_string_strcasestr (noflash)
libc_string_strchr (noflash)
libc_string_strcoll (noflash)
libc_string_strcpy (noflash)
libc_string_strcspn (noflash)
libc_string_strdup (noflash)
libc_string_strdup_r (noflash)
libc_string_strlcat (noflash)
libc_string_strlcpy (noflash)
libc_string_strlwr (noflash)
libc_string_strncasecmp (noflash)
libc_string_strncat (noflash)
libc_string_strncmp (noflash)
libc_string_strncpy (noflash)
libc_string_strndup (noflash)
libc_string_strndup_r (noflash)
libc_string_strnlen (noflash)
libc_string_strrchr (noflash)
libc_string_strsep (noflash)
libc_string_strspn (noflash)
libc_string_strstr (noflash)
libc_string_strtok_r (noflash)
libc_string_strupr (noflash)
if SPIRAM_CACHE_LIBRAND_IN_IRAM = y:
libc_stdlib_srand (noflash)
libc_stdlib_rand (noflash)
libc_stdlib_rand_r (noflash)
if SPIRAM_CACHE_LIBENV_IN_IRAM = y:
libc_stdlib_environ (noflash)
libc_stdlib_envlock (noflash)
libc_stdlib_getenv_r (noflash)
if SPIRAM_CACHE_LIBFILE_IN_IRAM = y:
libc_tinystdio_lock (noflash)
libc_tinystdio_isatty (noflash)
libc_tinystdio_fclose (noflash)
libc_tinystdio_open (noflash)
libc_tinystdio_close (noflash)
libc_tinystdio_creat (noflash)
libc_tinystdio_read (noflash)
libc_tinystdio_rshift (noflash)
libc_tinystdio_sbrk (noflash)
libc_tinystdio_stdio (noflash)
libc_tinystdio_syssbrk (noflash)
libc_tinystdio_sysclose (noflash)
libc_tinystdio_sysopen (noflash)
libc_tinystdio_sysread (noflash)
libc_tinystdio_syswrite (noflash)
libc_tinystdio_impure (noflash)
libc_tinystdio_fwalk (noflash)
libc_tinystdio_findfp (noflash)
if SPIRAM_CACHE_LIBMISC_IN_IRAM = y:
libc_stdlib_raise (noflash)
libc_stdlib_system (noflash)

View File

@ -0,0 +1,128 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio-bufio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#define GET_BUF(mf) (*(mf->pbuf))
#define GET_SIZE(mf) (*(mf->psize))
struct __file_mem {
struct __file_ext xfile;
char **pbuf;
size_t *psize; // == strlen(*pbuf);
size_t len; // Total allocated size
size_t pos;
};
static int __fmem_put(char c, FILE *f)
{
struct __file_mem *mf = (struct __file_mem *) f;
if (mf->len == mf->pos) {
size_t newsize = mf->len * 3 / 2;
char *tmp = realloc(GET_BUF(mf), newsize);
if (!tmp) {
return _FDEV_ERR;
}
GET_BUF(mf) = tmp;
mf->len = newsize;
}
GET_BUF(mf)[mf->pos++] = c;
if (mf->pos > GET_SIZE(mf)) {
GET_SIZE(mf) = mf->pos;
}
return (unsigned char) c;
}
static int __fmem_get(FILE *f)
{
struct __file_mem *mf = (struct __file_mem *) f;
int c;
if (mf->pos < GET_SIZE(mf)) {
c = (unsigned char) GET_BUF(mf)[mf->pos++];
if (c == '\0') {
c = _FDEV_EOF;
}
} else {
c = _FDEV_ERR;
}
return c;
}
static int __fmem_flush(FILE *f)
{
struct __file_mem *mf = (struct __file_mem *) f;
GET_BUF(mf)[mf->pos] = '\0';
GET_SIZE(mf) = mf->pos;
return 0;
}
static off_t __fmem_seek(FILE *f, off_t pos, int whence)
{
struct __file_mem *mf = (struct __file_mem *) f;
switch (whence) {
case SEEK_SET:
break;
case SEEK_CUR:
pos += mf->pos;
break;
case SEEK_END:
pos += GET_SIZE(mf);
break;
}
if (pos < 0 || GET_SIZE(mf) < (size_t) pos) {
return EOF;
}
mf->pos = pos;
return pos;
}
static int __fmem_close(FILE *f)
{
__fmem_flush(f);
free(f);
return 0;
}
FILE *
open_memstream(char **buf, size_t *size)
{
struct __file_mem *mf;
if (!buf || !size) {
errno = EINVAL;
return NULL;
}
/* Allocate file structure and necessary buffers */
mf = calloc(1, sizeof(struct __file_mem));
if (mf == NULL) {
errno = ENOMEM;
return NULL;
}
*buf = malloc(BUFSIZ);
if (*buf == NULL) {
errno = ENOMEM;
free(mf);
return NULL;
}
*mf = (struct __file_mem) {
.xfile = FDEV_SETUP_EXT(__fmem_put, __fmem_get, __fmem_flush, __fmem_close,
__fmem_seek, NULL, __SWR),
.pbuf = buf,
.psize = size,
.len = BUFSIZ,
.pos = 0,
};
*size = 0;
*buf[0] = '\0';
return (FILE *) mf;
}

Some files were not shown because too many files have changed in this diff Show More