Newlib: implement locks

* Dynamically allocate arc4random data. Saves about 1k off the bss.
This commit is contained in:
Our Air Quality 2017-12-09 00:45:57 +11:00
parent 89c6c410ff
commit e9d9201527
24 changed files with 3442 additions and 44 deletions

View File

@ -97,6 +97,9 @@
#ifndef configCHECK_FOR_STACK_OVERFLOW
#define configCHECK_FOR_STACK_OVERFLOW 2
#endif
#ifndef configUSE_RECURSIVE_MUTEXES
#define configUSE_RECURSIVE_MUTEXES 1
#endif
#ifndef configUSE_MUTEXES
#define configUSE_MUTEXES 1
#endif

View File

@ -134,6 +134,8 @@ static void IRAM default_putc(char c) {
uart_putc(0, c);
}
void init_newlib_locks(void);
// .text+0x258
void IRAM sdk_user_start(void) {
uint32_t buf32[sizeof(struct sdk_g_ic_saved_st) / 4];
@ -223,6 +225,7 @@ void IRAM sdk_user_start(void) {
status = sysparam_init(sysparam_addr, 0);
}
}
init_newlib_locks();
if (status != SYSPARAM_OK) {
printf("WARNING: Could not initialize sysparams (%d)!\n", status);
}

View File

@ -14,7 +14,7 @@ extern "C"
{
#endif
typedef long _WriteFunction(struct _reent *r, int fd, const char *ptr, int len );
typedef ssize_t _WriteFunction(struct _reent *r, int fd, const void *ptr, size_t len);
/** Set implementation of write syscall for stdout.
*

View File

@ -15,6 +15,10 @@
#include <stdout_redirect.h>
#include <sys/time.h>
#include <lwip/sockets.h>
#include <sys/lock.h>
#include <FreeRTOS.h>
#include <semphr.h>
#include <esp/hwrand.h>
/*
* The file descriptor index space is allocated in blocks. The first block of 3
@ -32,7 +36,7 @@
extern void *xPortSupervisorStackPointer;
IRAM caddr_t _sbrk_r (struct _reent *r, int incr)
IRAM void *_sbrk_r (struct _reent *r, ptrdiff_t incr)
{
extern char _heap_start; /* linker script defined */
static char * heap_end;
@ -58,15 +62,15 @@ IRAM caddr_t _sbrk_r (struct _reent *r, int incr)
}
/* syscall implementation for stdio write to UART */
__attribute__((weak)) long _write_stdout_r(struct _reent *r, int fd, const char *ptr, int len )
__attribute__((weak)) ssize_t _write_stdout_r(struct _reent *r, int fd, const void *ptr, size_t len )
{
for(int i = 0; i < len; i++) {
/* Auto convert CR to CRLF, ignore other LFs (compatible with Espressif SDK behaviour) */
if(ptr[i] == '\r')
if(((char *)ptr)[i] == '\r')
continue;
if(ptr[i] == '\n')
if(((char *)ptr)[i] == '\n')
uart_putc(0, '\r');
uart_putc(0, ptr[i]);
uart_putc(0, ((char *)ptr)[i]);
}
return len;
}
@ -88,13 +92,13 @@ _WriteFunction *get_write_stdout()
}
/* default implementation, replace in a filesystem */
__attribute__((weak)) long _write_filesystem_r(struct _reent *r, int fd, const char *ptr, int len )
__attribute__((weak)) ssize_t _write_filesystem_r(struct _reent *r, int fd, const void *ptr, size_t len)
{
r->_errno = EBADF;
return -1;
}
__attribute__((weak)) long _write_r(struct _reent *r, int fd, const char *ptr, int len )
__attribute__((weak)) ssize_t _write_r(struct _reent *r, int fd, const void *ptr, size_t len)
{
if (fd >= FILE_DESCRIPTOR_OFFSET) {
return _write_filesystem_r(r, fd, ptr, len);
@ -110,26 +114,26 @@ __attribute__((weak)) long _write_r(struct _reent *r, int fd, const char *ptr, i
}
/* syscall implementation for stdio read from UART */
__attribute__((weak)) long _read_stdin_r(struct _reent *r, int fd, char *ptr, int len)
__attribute__((weak)) ssize_t _read_stdin_r(struct _reent *r, int fd, void *ptr, size_t len)
{
int ch, i;
uart_rxfifo_wait(0, 1);
for(i = 0; i < len; i++) {
ch = uart_getc_nowait(0);
if (ch < 0) break;
ptr[i] = ch;
((char *)ptr)[i] = ch;
}
return i;
}
/* default implementation, replace in a filesystem */
__attribute__((weak)) long _read_filesystem_r( struct _reent *r, int fd, char *ptr, int len )
__attribute__((weak)) ssize_t _read_filesystem_r( struct _reent *r, int fd, void *ptr, size_t len )
{
r->_errno = EBADF;
return -1;
}
__attribute__((weak)) long _read_r( struct _reent *r, int fd, char *ptr, int len )
__attribute__((weak)) ssize_t _read_r( struct _reent *r, int fd, void *ptr, size_t len )
{
if (fd >= FILE_DESCRIPTOR_OFFSET) {
return _read_filesystem_r(r, fd, ptr, len);
@ -173,10 +177,10 @@ __attribute__((weak, alias("syscall_returns_enosys")))
int _unlink_r(struct _reent *r, const char *path);
__attribute__((weak, alias("syscall_returns_enosys")))
int _fstat_r(struct _reent *r, int fd, void *buf);
int _fstat_r(struct _reent *r, int fd, struct stat *buf);
__attribute__((weak, alias("syscall_returns_enosys")))
int _stat_r(struct _reent *r, const char *pathname, void *buf);
int _stat_r(struct _reent *r, const char *pathname, struct stat *buf);
__attribute__((weak, alias("syscall_returns_enosys")))
off_t _lseek_r(struct _reent *r, int fd, off_t offset, int whence);
@ -197,3 +201,99 @@ static int syscall_returns_enosys(struct _reent *r)
r->_errno=ENOSYS;
return -1;
}
int getentropy(void *ptr, size_t n)
{
hwrand_fill(ptr, n);
return 0;
}
void _arc4random_getentropy_fail(void)
{
}
void _exit(int status)
{
while(1);
}
/*
* Newlib lock implementation. Some newlib locks are statically allocated, but
* can not be statically initialized so are set to NULL and initialized at
* startup. The malloc lock is used before it can be initialized so there are
* runtime checks on the functions that use it early.
*/
static int locks_initialized = 0;
extern _lock_t __arc4random_mutex;
extern _lock_t __at_quick_exit_mutex;
//extern _lock_t __dd_hash_mutex;
extern _lock_t __tz_mutex;
extern _lock_t __atexit_recursive_mutex;
extern _lock_t __env_recursive_mutex;
extern _lock_t __malloc_recursive_mutex;
extern _lock_t __sfp_recursive_mutex;
extern _lock_t __sinit_recursive_mutex;
void init_newlib_locks()
{
_lock_init(&__arc4random_mutex);
_lock_init(&__at_quick_exit_mutex);
//_lock_init(&__dd_hash_mutex);
_lock_init(&__tz_mutex);
_lock_init_recursive(&__atexit_recursive_mutex);
_lock_init_recursive(&__env_recursive_mutex);
_lock_init_recursive(&__malloc_recursive_mutex);
_lock_init_recursive(&__sfp_recursive_mutex);
_lock_init_recursive(&__sinit_recursive_mutex);
locks_initialized = 1;
}
void _lock_init(_lock_t *lock) {
*lock = (_lock_t)xSemaphoreCreateMutex();
}
void _lock_init_recursive(_lock_t *lock) {
*lock = (_lock_t)xSemaphoreCreateRecursiveMutex();
}
void _lock_close(_lock_t *lock) {
vSemaphoreDelete((QueueHandle_t)*lock);
*lock = 0;
}
void _lock_close_recursive(_lock_t *lock) {
vSemaphoreDelete((QueueHandle_t)*lock);
*lock = 0;
}
void _lock_acquire(_lock_t *lock) {
xSemaphoreTake((QueueHandle_t)*lock, portMAX_DELAY);
}
void _lock_acquire_recursive(_lock_t *lock) {
if (locks_initialized) {
xSemaphoreTakeRecursive((QueueHandle_t)*lock, portMAX_DELAY);
}
}
int _lock_try_acquire(_lock_t *lock) {
return xSemaphoreTake((QueueHandle_t)*lock, 0);
}
int _lock_try_acquire_recursive(_lock_t *lock) {
return xSemaphoreTakeRecursive((QueueHandle_t)*lock, 0);
}
void _lock_release(_lock_t *lock) {
xSemaphoreGive((QueueHandle_t)*lock);
}
void _lock_release_recursive(_lock_t *lock) {
if (locks_initialized) {
xSemaphoreGiveRecursive((QueueHandle_t)*lock);
}
}

View File

@ -21,20 +21,6 @@ MEMORY
pvPortMalloc = malloc;
vPortFree = free;
/* FreeRTOS lock functions.
Rely on a patch to libc that produces weak linked versions of the
below symbols. Currently treating locking primitives like universal
global critical section rather than individual locks, but this seems
OK from the use cases in newlib.
*/
_lock_acquire = vPortEnterCritical;
_lock_acquire_recursive = vPortEnterCritical;
_lock_try_acquire = vPortEnterCritical;
_lock_try_acquire_recursive = vPortEnterCritical;
_lock_release = vPortExitCritical;
_lock_release_recursive = vPortExitCritical;
/* SDK compatibility */
ets_printf = printf;

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1 +1,32 @@
/* Use default implementation, see arc4random.h */
/*
* Copyright (c) 2017
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
void _arc4random_getentropy_fail(void);
#define _ARC4RANDOM_DATA
#define _ARC4RANDOM_GETENTROPY_FAIL() _arc4random_getentropy_fail()
#define _ARC4RANDOM_ALLOCATE(rsp, rsxp) \
do { *rsp = malloc(sizeof(**rsp)); \
*rsxp = malloc(sizeof(**rsxp)); } \
while (0)
__END_DECLS

View File

@ -48,6 +48,23 @@
This represents what type a float arg is passed as. It is used when the type is
not promoted to double.
__OBSOLETE_MATH_DEFAULT
Default value for __OBSOLETE_MATH if that's not set by the user.
It should be set here based on predefined feature macros.
__OBSOLETE_MATH
If set to 1 then some new math code will be disabled and older libm
code will be used instead. This is necessary because the new math
code does not support all targets, it assumes that the toolchain has
ISO C99 support (hexfloat literals, standard fenv semantics), the
target has IEEE-754 conforming binary32 float and binary64 double
(not mixed endian) representation, standard SNaN representation,
double and single precision arithmetics has similar latency and it
has no legacy SVID matherr support, only POSIX errno and fenv
exception based error handling.
*/
#if (defined(__arm__) || defined(__thumb__)) && !defined(__MAVERICK__)
@ -61,6 +78,7 @@
# else
# define __IEEE_BIG_ENDIAN
# endif
# define __OBSOLETE_MATH_DEFAULT 0
#else
# define __IEEE_BIG_ENDIAN
# ifdef __ARMEL__
@ -75,6 +93,7 @@
#else
#define __IEEE_BIG_ENDIAN
#endif
#define __OBSOLETE_MATH_DEFAULT 0
#endif
#ifdef __epiphany__
@ -435,6 +454,14 @@
# endif
#endif
#ifndef __OBSOLETE_MATH_DEFAULT
/* Use old math code by default. */
#define __OBSOLETE_MATH_DEFAULT 1
#endif
#ifndef __OBSOLETE_MATH
#define __OBSOLETE_MATH __OBSOLETE_MATH_DEFAULT
#endif
#ifndef __IEEE_BIG_ENDIAN
#ifndef __IEEE_LITTLE_ENDIAN
#error Endianess not declared!!

View File

@ -171,9 +171,9 @@ int _EXFUN(pthread_setschedprio, (pthread_t thread, int prio));
#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
#if __GNU_VISIBLE
int pthread_getname_np(pthread_t, char *, size_t) __nonnull(2);
int pthread_getname_np(pthread_t, char *, size_t) __nonnull((2));
int pthread_setname_np(pthread_t, const char *) __nonnull(2);
int pthread_setname_np(pthread_t, const char *) __nonnull((2));
#endif
#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT)

View File

@ -796,4 +796,8 @@ _putchar_unlocked(int _c)
_END_STD_C
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/stdio.h>
#endif
#endif /* _STDIO_H_ */

View File

@ -294,7 +294,7 @@ int _EXFUN(_unsetenv_r,(struct _reent *, const char *__string));
#endif /* !__CYGWIN__ */
#if __POSIX_VISIBLE >= 200112
int _EXFUN(__nonnull (1) posix_memalign,(void **, size_t, size_t));
int _EXFUN(__nonnull ((1)) posix_memalign,(void **, size_t, size_t));
#endif
char * _EXFUN(_dtoa_r,(struct _reent *, double, int, int, int *, int*, char**));
@ -346,4 +346,8 @@ _Noreturn void
_END_STD_C
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/stdlib.h>
#endif
#endif /* _STDLIB_H_ */

View File

@ -169,11 +169,15 @@ int _EXFUN(strverscmp,(const char *, const char *));
sure here. */
#if __GNU_VISIBLE && !defined(basename)
# define basename basename
char *_EXFUN(__nonnull (1) basename,(const char *)) __asm__(__ASMNAME("__gnu_basename"));
char *_EXFUN(__nonnull ((1)) basename,(const char *)) __asm__(__ASMNAME("__gnu_basename"));
#endif
#include <sys/string.h>
_END_STD_C
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/string.h>
#endif
#endif /* _STRING_H_ */

View File

@ -53,11 +53,9 @@ void explicit_bzero(void *, size_t);
#if __MISC_VISIBLE || __POSIX_VISIBLE < 200809 || __XSI_VISIBLE >= 700
int ffs(int) __pure2;
#endif
#if __GNU_VISIBLE
#if __BSD_VISIBLE
int ffsl(long) __pure2;
int ffsll(long long) __pure2;
#endif
#if __BSD_VISIBLE
int fls(int) __pure2;
int flsl(long) __pure2;
int flsll(long long) __pure2;
@ -75,4 +73,8 @@ int strncasecmp_l (const char *, const char *, size_t, locale_t);
#endif
__END_DECLS
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/strings.h>
#endif
#endif /* _STRINGS_H_ */

View File

@ -52,17 +52,29 @@ extern "C" {
#define _FNOFOLLOW 0x100000
#define _FDIRECTORY 0x200000
#define _FEXECSRCH 0x400000
#define _FTMPFILE 0x800000
#define _FNOATIME 0x1000000
#define O_BINARY _FBINARY
#define O_TEXT _FTEXT
#define O_CLOEXEC _FNOINHERIT
#define O_DIRECT _FDIRECT
#define O_NOFOLLOW _FNOFOLLOW
#define O_DSYNC _FSYNC
#define O_RSYNC _FSYNC
#define O_DIRECTORY _FDIRECTORY
#define O_EXEC _FEXECSRCH
#define O_SEARCH _FEXECSRCH
/* POSIX-1.2008 specific flags */
#if __POSIX_VISIBLE >= 200809
#define O_CLOEXEC _FNOINHERIT
#define O_NOFOLLOW _FNOFOLLOW
#define O_DIRECTORY _FDIRECTORY
#endif
/* Linux-specific flags */
#if __GNU_VISIBLE
#define O_DIRECT _FDIRECT
#define O_TMPFILE _FTMPFILE
#define O_NOATIME _FNOATIME
#endif
#endif
#if __MISC_VISIBLE

View File

@ -397,7 +397,7 @@
#endif
#if __GNUC_PREREQ__(3, 3)
#define __nonnull(x) __attribute__((__nonnull__(x)))
#define __nonnull(x) __attribute__((__nonnull__ x))
#define __nonnull_all __attribute__((__nonnull__))
#else
#define __nonnull(x)

View File

@ -100,6 +100,9 @@ extern "C" {
* _SVID_SOURCE (deprecated by _DEFAULT_SOURCE)
* _DEFAULT_SOURCE (or none of the above)
* POSIX-1.2008 with BSD and SVr4 extensions
*
* _FORTIFY_SOURCE = 1 or 2
* Object Size Checking function wrappers
*/
#ifdef _GNU_SOURCE
@ -233,9 +236,11 @@ extern "C" {
* __GNU_VISIBLE
* GNU extensions; enabled with _GNU_SOURCE.
*
* __SSP_FORTIFY_LEVEL
* Object Size Checking; defined to 0 (off), 1, or 2.
*
* In all cases above, "enabled by default" means either by defining
* _DEFAULT_SOURCE, or by not defining any of the public feature test macros.
* Defining _GNU_SOURCE makes all of the above avaliable.
*/
#ifdef _ATFILE_SOURCE
@ -314,6 +319,17 @@ extern "C" {
#define __XSI_VISIBLE 0
#endif
#if _FORTIFY_SOURCE > 0 && !defined(__cplusplus) && !defined(__lint__) && \
(__OPTIMIZE__ > 0 || defined(__clang__)) && __GNUC_PREREQ__(4, 1)
# if _FORTIFY_SOURCE > 1
# define __SSP_FORTIFY_LEVEL 2
# else
# define __SSP_FORTIFY_LEVEL 1
# endif
#else
# define __SSP_FORTIFY_LEVEL 0
#endif
/* RTEMS adheres to POSIX -- 1003.1b with some features from annexes. */
#ifdef __rtems__
@ -448,7 +464,7 @@ extern "C" {
#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L
/* #define _POSIX_THREAD_SPORADIC_SERVER -1 */
#define _POSIX_THREADS 200809L
/* #define _POSIX_TIMEOUTS -1 */
#define _POSIX_TIMEOUTS 200809L
#define _POSIX_TIMERS 200809L
/* #define _POSIX_TRACE -1 */
/* #define _POSIX_TRACE_EVENT_FILTER -1 */

View File

@ -22,8 +22,17 @@ typedef _lock_t _LOCK_T;
Lock functions all take a pointer to the _lock_t entry, so the
value stored there can be manipulated.
*/
#if 0
#define __LOCK_INIT(CLASS,NAME) CLASS _lock_t NAME = 0;
#define __LOCK_INIT_RECURSIVE(CLASS,NAME) CLASS _lock_t NAME = 0;
#else
/*
* Skip a 'static' class definition, so they are all visible and can
* be initialize at startup.
*/
#define __LOCK_INIT(CLASS,NAME) _lock_t NAME = 0;
#define __LOCK_INIT_RECURSIVE(CLASS,NAME) _lock_t NAME = 0;
#endif
void _lock_init(_lock_t *lock);
void _lock_init_recursive(_lock_t *lock);

View File

@ -73,13 +73,17 @@ int _EXFUN(execvpe, (const char *__file, char * const __argv[], char * const
#if __ATFILE_VISIBLE
int _EXFUN(faccessat, (int __dirfd, const char *__path, int __mode, int __flags));
#endif
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
int _EXFUN(fchdir, (int __fildes));
#endif
#if __POSIX_VISIBLE >= 199309
int _EXFUN(fchmod, (int __fildes, mode_t __mode ));
#endif
#if !defined(__INSIDE_CYGWIN__)
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
int _EXFUN(fchown, (int __fildes, uid_t __owner, gid_t __group ));
#endif
#endif
#if __ATFILE_VISIBLE
int _EXFUN(fchownat, (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags));
#endif
@ -89,7 +93,9 @@ int _EXFUN(fexecve, (int __fd, char * const __argv[], char * const __envp[] ));
pid_t _EXFUN(fork, (void ));
long _EXFUN(fpathconf, (int __fd, int __name ));
int _EXFUN(fsync, (int __fd));
#if __POSIX_VISIBLE >= 199309
int _EXFUN(fdatasync, (int __fd));
#endif
#if __GNU_VISIBLE
char * _EXFUN(get_current_dir_name, (void));
#endif
@ -113,12 +119,16 @@ char * _EXFUN(getlogin, (void ));
#if defined(_POSIX_THREAD_SAFE_FUNCTIONS)
int _EXFUN(getlogin_r, (char *name, size_t namesize) );
#endif
#if __BSD_VISIBLE || (__XSI_VISIBLE && __POSIX_VISIBLE < 200112)
char * _EXFUN(getpass, (const char *__prompt));
int _EXFUN(getpagesize, (void));
#endif
#if __BSD_VISIBLE
int _EXFUN(getpeereid, (int, uid_t *, gid_t *));
#endif
#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4
pid_t _EXFUN(getpgid, (pid_t));
#endif
pid_t _EXFUN(getpgrp, (void ));
pid_t _EXFUN(getpid, (void ));
pid_t _EXFUN(getppid, (void ));
@ -142,13 +152,17 @@ int _EXFUN(isatty, (int __fildes ));
int _EXFUN(issetugid, (void));
#endif
#if !defined(__INSIDE_CYGWIN__)
#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809
int _EXFUN(lchown, (const char *__path, uid_t __owner, gid_t __group ));
#endif
#endif
int _EXFUN(link, (const char *__path1, const char *__path2 ));
#if __ATFILE_VISIBLE
int _EXFUN(linkat, (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags ));
#endif
#if __MISC_VISIBLE || __XSI_VISIBLE
int _EXFUN(nice, (int __nice_value ));
#endif
#if !defined(__INSIDE_CYGWIN__)
off_t _EXFUN(lseek, (int __fildes, off_t __offset, int __whence ));
#endif
@ -168,8 +182,10 @@ int _EXFUN(pipe, (int __fildes[2] ));
#if __GNU_VISIBLE
int _EXFUN(pipe2, (int __fildes[2], int flags));
#endif
#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500
ssize_t _EXFUN(pread, (int __fd, void *__buf, size_t __nbytes, off_t __offset));
ssize_t _EXFUN(pwrite, (int __fd, const void *__buf, size_t __nbytes, off_t __offset));
#endif
_READ_WRITE_RETURN_TYPE _EXFUN(read, (int __fd, void *__buf, size_t __nbyte ));
#if __BSD_VISIBLE
int _EXFUN(rresvport, (int *__alport));
@ -179,7 +195,9 @@ int _EXFUN(rmdir, (const char *__path ));
#if __BSD_VISIBLE
int _EXFUN(ruserok, (const char *rhost, int superuser, const char *ruser, const char *luser));
#endif
#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112)
void * _EXFUN(sbrk, (ptrdiff_t __incr));
#endif
#if !defined(__INSIDE_CYGWIN__)
#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112
int _EXFUN(setegid, (gid_t __gid ));
@ -194,7 +212,9 @@ int _EXFUN(setgroups, (int ngroups, const gid_t *grouplist ));
int _EXFUN(sethostname, (const char *, size_t));
#endif
int _EXFUN(setpgid, (pid_t __pid, pid_t __pgid ));
#if __SVID_VISIBLE || __XSI_VISIBLE >= 500
int _EXFUN(setpgrp, (void ));
#endif
#if (__BSD_VISIBLE || __XSI_VISIBLE >= 4) && !defined(__INSIDE_CYGWIN__)
int _EXFUN(setregid, (gid_t __rgid, gid_t __egid));
int _EXFUN(setreuid, (uid_t __ruid, uid_t __euid));
@ -567,4 +587,9 @@ int _EXFUN(unlinkat, (int, const char *, int));
#ifdef __cplusplus
}
#endif
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/unistd.h>
#endif
#endif /* _SYS_UNISTD_H */

View File

@ -189,6 +189,10 @@ int _EXFUN(wmemcmp, (const wchar_t *, const wchar_t *, size_t));
wchar_t *_EXFUN(wmemcpy, (wchar_t *__restrict, const wchar_t *__restrict,
size_t));
wchar_t *_EXFUN(wmemmove, (wchar_t *, const wchar_t *, size_t));
#if __GNU_VISIBLE
wchar_t *_EXFUN(wmempcpy, (wchar_t *__restrict, const wchar_t *__restrict,
size_t));
#endif
wchar_t *_EXFUN(wmemset, (wchar_t *, wchar_t, size_t));
long _EXFUN(wcstol, (const wchar_t *__restrict, wchar_t **__restrict, int));
@ -331,4 +335,8 @@ int _EXFUN(_wscanf_r, (struct _reent *, const wchar_t *, ...));
_END_STD_C
#if __SSP_FORTIFY_LEVEL > 0
#include <ssp/wchar.h>
#endif
#endif /* _WCHAR_H_ */

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -4,6 +4,23 @@
BSD Licensed as described in the file LICENSE
*/
#include "open_esplibs.h"
#include "stdlib.h"
#include "stdint.h"
/*
* This replaces a dynamic allocation, a call to zalloc(), from within a
* critical section in the ppTask. The allocation aquired the malloc lock and
* doing so withing a critical section is not safe because it might preempt
* another task which is not possible from within a critical section. The data
* is written to the rtc memory, and was then freed. The freeing has been
* patched to be a nop.
*/
static const uint32_t pp_zeros[8];
void *_ppz20(size_t n)
{
return &pp_zeros;
}
#if OPEN_LIBPP_PP
// The contents of this file are only built if OPEN_LIBPHY_PHY_CHIP_SLEEP is set to true