Implement sysconf for Arm
- add support for using sysconf to get page size in _mallocr.c via HAVE_SYSCONF_PAGESIZE flag set in configure.host - set flag in configure.host for arm and add a default sysconf implementation in libc/sys/arm that returns the page size - the default implementation can be overridden outside newlib to allow a different page size to improve malloc on devices with a small footprint without needing to rebuild newlib - this patch is based on a contribution from Torbjorn Svensson and Niklas Dahlquist (https://ecos.sourceware.org/ml/newlib/current/017616.html)
This commit is contained in:
parent
eb5c631ead
commit
5230eb7f8c
|
@ -628,6 +628,7 @@ newlib_cflags="${newlib_cflags} -DCLOCK_PROVIDED -DMALLOC_PROVIDED -DEXIT_PROVID
|
|||
;;
|
||||
arm*-*-pe)
|
||||
syscall_dir=syscalls
|
||||
newlib_cflags="${newlib_cflags} -DHAVE_SYSCONF_PAGESIZE"
|
||||
;;
|
||||
arm*-*-*)
|
||||
syscall_dir=syscalls
|
||||
|
@ -642,6 +643,7 @@ newlib_cflags="${newlib_cflags} -DCLOCK_PROVIDED -DMALLOC_PROVIDED -DEXIT_PROVID
|
|||
# newlib_cflags="${newlib_cflags} -DARM_RDP_MONITOR"
|
||||
newlib_cflags="${newlib_cflags} -DARM_RDI_MONITOR"
|
||||
fi
|
||||
newlib_cflags="${newlib_cflags} -DHAVE_SYSCONF_PAGESIZE"
|
||||
;;
|
||||
avr*)
|
||||
newlib_cflags="${newlib_cflags} -DNO_EXEC -DSMALL_MEMORY -DMISSING_SYSCALL_NAMES"
|
||||
|
|
|
@ -320,12 +320,14 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
#ifndef HAVE_SYSCONF_PAGESIZE
|
||||
#ifdef SMALL_MEMORY
|
||||
#define malloc_getpagesize (128)
|
||||
#else
|
||||
#define malloc_getpagesize (4096)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if __STD_C
|
||||
extern void __malloc_lock(struct _reent *);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
AM_CPPFLAGS_%C% = -I$(srcdir)/libc/machine/arm
|
||||
|
||||
libc_a_SOURCES += %D%/access.c %D%/aeabi_atexit.c
|
||||
libc_a_SOURCES += %D%/access.c %D%/aeabi_atexit.c %D%/sysconf.c
|
||||
if MAY_SUPPLY_SYSCALLS
|
||||
libc_a_SOURCES += %D%/libcfunc.c %D%/trap.S %D%/syscalls.c
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/* libc/sys/arm/sysconf.c - The sysconf function */
|
||||
|
||||
/* Copyright 2020, STMicroelectronics
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution, modification, and use in source and binary forms is permitted
|
||||
* provided that the above copyright notice and following paragraph are
|
||||
* duplicated in all such forms.
|
||||
*
|
||||
* This file is distributed WITHOUT ANY WARRANTY; without even the implied
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
long sysconf(int name)
|
||||
{
|
||||
switch (name)
|
||||
{
|
||||
case _SC_PAGESIZE:
|
||||
#ifdef SMALL_MEMORY
|
||||
return 128;
|
||||
#else
|
||||
return 4096;
|
||||
#endif
|
||||
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
return -1; /* Can't get here */
|
||||
}
|
Loading…
Reference in New Issue