posix: sysconf: match _SC* defines with newlib/picolib

It's possible for newlib/picolib libc libraries to
internally call sysconf() which would execute zephyr's
implementation.  However, if the _SC* defines do not have
matching values, then the incorrect switch case executes.

This issue arises when using newlib/picolib libc that includes
sysconf implementation for ARM.  With current defaults, the
zephyr sysconf() overrides the original libc sysconf() so
we must ensure proper operation.

We will switch to the #define list just like newlib/picolib.
We can't currently use their unistd.h directly due to a domino
of declaration conflicts.
For the "small" macro implementation, we have to drop using
CONCAT to prevent pre-expansion of the new #defines

Signed-off-by: Nicholas Lowell <Nicholas.Lowell@lexmark.com>
This commit is contained in:
Nicholas Lowell 2025-04-15 13:46:58 -04:00 committed by Benjamin Cabé
commit c5f1c43b8c
3 changed files with 170 additions and 146 deletions

View file

@ -13,133 +13,166 @@
extern "C" { extern "C" {
#endif #endif
enum { /* Values assigned are intended to match the values assigned in newlib and picolib
_SC_ADVISORY_INFO, * Even though the POSIX standard does not require specific values, this seems to be
_SC_ASYNCHRONOUS_IO, * required for proper sysconf() operation when called from within newlib/picolib itself.
_SC_BARRIERS, */
_SC_CLOCK_SELECTION, #define _SC_ARG_MAX 0
_SC_CPUTIME, #define _SC_CHILD_MAX 1
_SC_FSYNC, #define _SC_CLK_TCK 2
_SC_IPV6, #define _SC_NGROUPS_MAX 3
_SC_JOB_CONTROL, #define _SC_OPEN_MAX 4
_SC_MAPPED_FILES, #define _SC_JOB_CONTROL 5
_SC_MEMLOCK, #define _SC_SAVED_IDS 6
_SC_MEMLOCK_RANGE, #define _SC_VERSION 7
_SC_MEMORY_PROTECTION, #define _SC_PAGESIZE 8
_SC_MESSAGE_PASSING, #define _SC_PAGE_SIZE _SC_PAGESIZE
_SC_MONOTONIC_CLOCK, /* These are non-POSIX values we accidentally introduced in 2000 without
_SC_PRIORITIZED_IO, * guarding them. Keeping them unguarded for backward compatibility.
_SC_PRIORITY_SCHEDULING, */
_SC_RAW_SOCKETS, #define _SC_NPROCESSORS_CONF 9
_SC_RE_DUP_MAX, #define _SC_NPROCESSORS_ONLN 10
_SC_READER_WRITER_LOCKS, #define _SC_PHYS_PAGES 11
_SC_REALTIME_SIGNALS, #define _SC_AVPHYS_PAGES 12
_SC_REGEXP, /* End of non-POSIX values. */
_SC_SAVED_IDS, #define _SC_MQ_OPEN_MAX 13
_SC_SEMAPHORES, #define _SC_MQ_PRIO_MAX 14
_SC_SHARED_MEMORY_OBJECTS, #define _SC_RTSIG_MAX 15
_SC_SHELL, #define _SC_SEM_NSEMS_MAX 16
_SC_SPAWN, #define _SC_SEM_VALUE_MAX 17
_SC_SPIN_LOCKS, #define _SC_SIGQUEUE_MAX 18
_SC_SPORADIC_SERVER, #define _SC_TIMER_MAX 19
_SC_SS_REPL_MAX, #define _SC_TZNAME_MAX 20
_SC_SYNCHRONIZED_IO, #define _SC_ASYNCHRONOUS_IO 21
_SC_THREAD_ATTR_STACKADDR, #define _SC_FSYNC 22
_SC_THREAD_ATTR_STACKSIZE, #define _SC_MAPPED_FILES 23
_SC_THREAD_CPUTIME, #define _SC_MEMLOCK 24
_SC_THREAD_PRIO_INHERIT, #define _SC_MEMLOCK_RANGE 25
_SC_THREAD_PRIO_PROTECT, #define _SC_MEMORY_PROTECTION 26
_SC_THREAD_PRIORITY_SCHEDULING, #define _SC_MESSAGE_PASSING 27
_SC_THREAD_PROCESS_SHARED, #define _SC_PRIORITIZED_IO 28
_SC_THREAD_ROBUST_PRIO_INHERIT, #define _SC_REALTIME_SIGNALS 29
_SC_THREAD_ROBUST_PRIO_PROTECT, #define _SC_SEMAPHORES 30
_SC_THREAD_SAFE_FUNCTIONS, #define _SC_SHARED_MEMORY_OBJECTS 31
_SC_THREAD_SPORADIC_SERVER, #define _SC_SYNCHRONIZED_IO 32
_SC_THREADS, #define _SC_TIMERS 33
_SC_TIMEOUTS, #define _SC_AIO_LISTIO_MAX 34
_SC_TIMERS, #define _SC_AIO_MAX 35
_SC_TRACE, #define _SC_AIO_PRIO_DELTA_MAX 36
_SC_TRACE_EVENT_FILTER, #define _SC_DELAYTIMER_MAX 37
_SC_TRACE_EVENT_NAME_MAX, #define _SC_THREAD_KEYS_MAX 38
_SC_TRACE_INHERIT, #define _SC_THREAD_STACK_MIN 39
_SC_TRACE_LOG, #define _SC_THREAD_THREADS_MAX 40
_SC_TRACE_NAME_MAX, #define _SC_TTY_NAME_MAX 41
_SC_TRACE_SYS_MAX, #define _SC_THREADS 42
_SC_TRACE_USER_EVENT_MAX, #define _SC_THREAD_ATTR_STACKADDR 43
_SC_TYPED_MEMORY_OBJECTS, #define _SC_THREAD_ATTR_STACKSIZE 44
_SC_VERSION, #define _SC_THREAD_PRIORITY_SCHEDULING 45
_SC_V7_ILP32_OFF32, #define _SC_THREAD_PRIO_INHERIT 46
_SC_V7_ILP32_OFFBIG, /* _SC_THREAD_PRIO_PROTECT was _SC_THREAD_PRIO_CEILING in early drafts */
_SC_V7_LP64_OFF64, #define _SC_THREAD_PRIO_PROTECT 47
_SC_V7_LPBIG_OFFBIG, #define _SC_THREAD_PRIO_CEILING _SC_THREAD_PRIO_PROTECT
_SC_V6_ILP32_OFF32, #define _SC_THREAD_PROCESS_SHARED 48
_SC_V6_ILP32_OFFBIG, #define _SC_THREAD_SAFE_FUNCTIONS 49
_SC_V6_LP64_OFF64, #define _SC_GETGR_R_SIZE_MAX 50
_SC_V6_LPBIG_OFFBIG, #define _SC_GETPW_R_SIZE_MAX 51
_SC_BC_BASE_MAX, #define _SC_LOGIN_NAME_MAX 52
_SC_BC_DIM_MAX, #define _SC_THREAD_DESTRUCTOR_ITERATIONS 53
_SC_BC_SCALE_MAX, #define _SC_ADVISORY_INFO 54
_SC_BC_STRING_MAX, #define _SC_ATEXIT_MAX 55
_SC_2_C_BIND, #define _SC_BARRIERS 56
_SC_2_C_DEV, #define _SC_BC_BASE_MAX 57
_SC_2_CHAR_TERM, #define _SC_BC_DIM_MAX 58
_SC_COLL_WEIGHTS_MAX, #define _SC_BC_SCALE_MAX 59
_SC_DELAYTIMER_MAX, #define _SC_BC_STRING_MAX 60
_SC_EXPR_NEST_MAX, #define _SC_CLOCK_SELECTION 61
_SC_2_FORT_DEV, #define _SC_COLL_WEIGHTS_MAX 62
_SC_2_FORT_RUN, #define _SC_CPUTIME 63
_SC_LINE_MAX, #define _SC_EXPR_NEST_MAX 64
_SC_2_LOCALEDEF, #define _SC_HOST_NAME_MAX 65
_SC_2_PBS, #define _SC_IOV_MAX 66
_SC_2_PBS_ACCOUNTING, #define _SC_IPV6 67
_SC_2_PBS_CHECKPOINT, #define _SC_LINE_MAX 68
_SC_2_PBS_LOCATE, #define _SC_MONOTONIC_CLOCK 69
_SC_2_PBS_MESSAGE, #define _SC_RAW_SOCKETS 70
_SC_2_PBS_TRACK, #define _SC_READER_WRITER_LOCKS 71
_SC_2_SW_DEV, #define _SC_REGEXP 72
_SC_2_UPE, #define _SC_RE_DUP_MAX 73
_SC_2_VERSION, #define _SC_SHELL 74
_SC_XOPEN_CRYPT, #define _SC_SPAWN 75
_SC_XOPEN_ENH_I18N, #define _SC_SPIN_LOCKS 76
_SC_XOPEN_REALTIME, #define _SC_SPORADIC_SERVER 77
_SC_XOPEN_REALTIME_THREADS, #define _SC_SS_REPL_MAX 78
_SC_XOPEN_SHM, #define _SC_SYMLOOP_MAX 79
_SC_XOPEN_STREAMS, #define _SC_THREAD_CPUTIME 80
_SC_XOPEN_UNIX, #define _SC_THREAD_SPORADIC_SERVER 81
_SC_XOPEN_UUCP, #define _SC_TIMEOUTS 82
_SC_XOPEN_VERSION, #define _SC_TRACE 83
_SC_CLK_TCK, #define _SC_TRACE_EVENT_FILTER 84
_SC_GETGR_R_SIZE_MAX, #define _SC_TRACE_EVENT_NAME_MAX 85
_SC_GETPW_R_SIZE_MAX, #define _SC_TRACE_INHERIT 86
_SC_AIO_LISTIO_MAX, #define _SC_TRACE_LOG 87
_SC_AIO_MAX, #define _SC_TRACE_NAME_MAX 88
_SC_AIO_PRIO_DELTA_MAX, #define _SC_TRACE_SYS_MAX 89
_SC_ARG_MAX, #define _SC_TRACE_USER_EVENT_MAX 90
_SC_ATEXIT_MAX, #define _SC_TYPED_MEMORY_OBJECTS 91
_SC_CHILD_MAX, #define _SC_V7_ILP32_OFF32 92
_SC_HOST_NAME_MAX, #define _SC_V6_ILP32_OFF32 _SC_V7_ILP32_OFF32
_SC_IOV_MAX, #define _SC_XBS5_ILP32_OFF32 _SC_V7_ILP32_OFF32
_SC_LOGIN_NAME_MAX, #define _SC_V7_ILP32_OFFBIG 93
_SC_NGROUPS_MAX, #define _SC_V6_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG
_SC_MQ_OPEN_MAX, #define _SC_XBS5_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG
_SC_MQ_PRIO_MAX, #define _SC_V7_LP64_OFF64 94
_SC_OPEN_MAX, #define _SC_V6_LP64_OFF64 _SC_V7_LP64_OFF64
_SC_PAGE_SIZE, #define _SC_XBS5_LP64_OFF64 _SC_V7_LP64_OFF64
_SC_PAGESIZE, #define _SC_V7_LPBIG_OFFBIG 95
_SC_THREAD_DESTRUCTOR_ITERATIONS, #define _SC_V6_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG
_SC_THREAD_KEYS_MAX, #define _SC_XBS5_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG
_SC_THREAD_STACK_MIN, #define _SC_XOPEN_CRYPT 96
_SC_THREAD_THREADS_MAX, #define _SC_XOPEN_ENH_I18N 97
_SC_RTSIG_MAX, #define _SC_XOPEN_LEGACY 98
_SC_SEM_NSEMS_MAX, #define _SC_XOPEN_REALTIME 99
_SC_SEM_VALUE_MAX, #define _SC_STREAM_MAX 100
_SC_SIGQUEUE_MAX, #define _SC_PRIORITY_SCHEDULING 101
_SC_STREAM_MAX, #define _SC_XOPEN_REALTIME_THREADS 102
_SC_SYMLOOP_MAX, #define _SC_XOPEN_SHM 103
_SC_TIMER_MAX, #define _SC_XOPEN_STREAMS 104
_SC_TTY_NAME_MAX, #define _SC_XOPEN_UNIX 105
_SC_TZNAME_MAX, #define _SC_XOPEN_VERSION 106
}; #define _SC_2_CHAR_TERM 107
#define _SC_2_C_BIND 108
#define _SC_2_C_DEV 109
#define _SC_2_FORT_DEV 110
#define _SC_2_FORT_RUN 111
#define _SC_2_LOCALEDEF 112
#define _SC_2_PBS 113
#define _SC_2_PBS_ACCOUNTING 114
#define _SC_2_PBS_CHECKPOINT 115
#define _SC_2_PBS_LOCATE 116
#define _SC_2_PBS_MESSAGE 117
#define _SC_2_PBS_TRACK 118
#define _SC_2_SW_DEV 119
#define _SC_2_UPE 120
#define _SC_2_VERSION 121
#define _SC_THREAD_ROBUST_PRIO_INHERIT 122
#define _SC_THREAD_ROBUST_PRIO_PROTECT 123
#define _SC_XOPEN_UUCP 124
#define _SC_LEVEL1_ICACHE_SIZE 125
#define _SC_LEVEL1_ICACHE_ASSOC 126
#define _SC_LEVEL1_ICACHE_LINESIZE 127
#define _SC_LEVEL1_DCACHE_SIZE 128
#define _SC_LEVEL1_DCACHE_ASSOC 129
#define _SC_LEVEL1_DCACHE_LINESIZE 130
#define _SC_LEVEL2_CACHE_SIZE 131
#define _SC_LEVEL2_CACHE_ASSOC 132
#define _SC_LEVEL2_CACHE_LINESIZE 133
#define _SC_LEVEL3_CACHE_SIZE 134
#define _SC_LEVEL3_CACHE_ASSOC 135
#define _SC_LEVEL3_CACHE_LINESIZE 136
#define _SC_LEVEL4_CACHE_SIZE 137
#define _SC_LEVEL4_CACHE_ASSOC 138
#define _SC_LEVEL4_CACHE_LINESIZE 139
#define _SC_POSIX_26_VERSION 140
#define __z_posix_sysconf_SC_ADVISORY_INFO (-1L) #define __z_posix_sysconf_SC_ADVISORY_INFO (-1L)
#define __z_posix_sysconf_SC_ASYNCHRONOUS_IO \ #define __z_posix_sysconf_SC_ASYNCHRONOUS_IO \
@ -295,10 +328,6 @@ enum {
#define __z_posix_sysconf_SC_TTY_NAME_MAX TTY_NAME_MAX #define __z_posix_sysconf_SC_TTY_NAME_MAX TTY_NAME_MAX
#define __z_posix_sysconf_SC_TZNAME_MAX TZNAME_MAX #define __z_posix_sysconf_SC_TZNAME_MAX TZNAME_MAX
#ifdef CONFIG_POSIX_SYSCONF_IMPL_MACRO
#define sysconf(x) (long)CONCAT(__z_posix_sysconf, x)
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -64,7 +64,8 @@ size_t confstr(int name, char *buf, size_t len);
#endif #endif
#ifdef CONFIG_POSIX_SYSCONF_IMPL_MACRO #ifdef CONFIG_POSIX_SYSCONF_IMPL_MACRO
#define sysconf(x) (long)CONCAT(__z_posix_sysconf, x) /* Can't use CONCAT(), must concat directly to prevent expansion of 'x' */
#define sysconf(x) (long)__z_posix_sysconf##x
#else #else
long sysconf(int opt); long sysconf(int opt);
#endif /* CONFIG_POSIX_SYSCONF_IMPL_FULL */ #endif /* CONFIG_POSIX_SYSCONF_IMPL_FULL */

View file

@ -6,13 +6,12 @@
#undef _POSIX_C_SOURCE #undef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L #define _POSIX_C_SOURCE 200809L
#include <zephyr/posix/pthread.h>
#include <zephyr/posix/sys/sysconf.h> #include <zephyr/posix/sys/sysconf.h>
#include <zephyr/posix/unistd.h> #include <zephyr/posix/unistd.h>
#ifdef CONFIG_POSIX_SYSCONF_IMPL_FULL #ifdef CONFIG_POSIX_SYSCONF_IMPL_FULL
/* Can't use CONCAT(), must concat directly to prevent expansion of 'x' */
#define z_sysconf(x) (long)CONCAT(__z_posix_sysconf, x) #define z_sysconf(x) (long)__z_posix_sysconf##x
long sysconf(int x) long sysconf(int x)
{ {
@ -125,21 +124,17 @@ long sysconf(int x)
return z_sysconf(_SC_TYPED_MEMORY_OBJECTS); return z_sysconf(_SC_TYPED_MEMORY_OBJECTS);
case _SC_VERSION: case _SC_VERSION:
return z_sysconf(_SC_VERSION); return z_sysconf(_SC_VERSION);
case _SC_V6_ILP32_OFF32:
return z_sysconf(_SC_V6_ILP32_OFF32);
case _SC_V6_ILP32_OFFBIG:
return z_sysconf(_SC_V6_ILP32_OFFBIG);
case _SC_V6_LP64_OFF64:
return z_sysconf(_SC_V6_LP64_OFF64);
case _SC_V6_LPBIG_OFFBIG:
return z_sysconf(_SC_V6_LPBIG_OFFBIG);
case _SC_V7_ILP32_OFF32: case _SC_V7_ILP32_OFF32:
/* case _SC_V6_ILP32_OFF32 */
return z_sysconf(_SC_V7_ILP32_OFF32); return z_sysconf(_SC_V7_ILP32_OFF32);
case _SC_V7_ILP32_OFFBIG: case _SC_V7_ILP32_OFFBIG:
/* case _SC_V6_ILP32_OFFBIG */
return z_sysconf(_SC_V7_ILP32_OFFBIG); return z_sysconf(_SC_V7_ILP32_OFFBIG);
case _SC_V7_LP64_OFF64: case _SC_V7_LP64_OFF64:
/* case _SC_V6_LP64_OFF64 */
return z_sysconf(_SC_V7_LP64_OFF64); return z_sysconf(_SC_V7_LP64_OFF64);
case _SC_V7_LPBIG_OFFBIG: case _SC_V7_LPBIG_OFFBIG:
/* case _SC_V6_LPBIG_OFFBIG */
return z_sysconf(_SC_V7_LPBIG_OFFBIG); return z_sysconf(_SC_V7_LPBIG_OFFBIG);
case _SC_BC_BASE_MAX: case _SC_BC_BASE_MAX:
return z_sysconf(_SC_BC_BASE_MAX); return z_sysconf(_SC_BC_BASE_MAX);
@ -237,10 +232,9 @@ long sysconf(int x)
return z_sysconf(_SC_MQ_PRIO_MAX); return z_sysconf(_SC_MQ_PRIO_MAX);
case _SC_OPEN_MAX: case _SC_OPEN_MAX:
return z_sysconf(_SC_OPEN_MAX); return z_sysconf(_SC_OPEN_MAX);
case _SC_PAGE_SIZE:
return z_sysconf(_SC_PAGE_SIZE);
case _SC_PAGESIZE: case _SC_PAGESIZE:
return z_sysconf(_SC_PAGESIZE); /* case _SC_PAGE_SIZE */
return z_sysconf(_SC_PAGE_SIZE);
case _SC_THREAD_DESTRUCTOR_ITERATIONS: case _SC_THREAD_DESTRUCTOR_ITERATIONS:
return z_sysconf(_SC_THREAD_DESTRUCTOR_ITERATIONS); return z_sysconf(_SC_THREAD_DESTRUCTOR_ITERATIONS);
case _SC_THREAD_KEYS_MAX: case _SC_THREAD_KEYS_MAX: