Skip to content

Commit f6bc184

Browse files
Nicholas LowellNicholas Lowell
Nicholas Lowell
authored and
Nicholas Lowell
committed
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. Signed-off-by: Nicholas Lowell <[email protected]>
1 parent 59b6224 commit f6bc184

File tree

2 files changed

+161
-141
lines changed

2 files changed

+161
-141
lines changed

include/zephyr/posix/sys/sysconf.h

+155-130
Original file line numberDiff line numberDiff line change
@@ -13,132 +13,162 @@
1313
extern "C" {
1414
#endif
1515

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

144174
#define __z_posix_sysconf_SC_ADVISORY_INFO (-1L)
@@ -220,10 +250,6 @@ enum {
220250
#define __z_posix_sysconf_SC_TRACE_USER_EVENT_MAX _POSIX_TRACE_USER_EVENT_MAX
221251
#define __z_posix_sysconf_SC_TYPED_MEMORY_OBJECTS (-1L)
222252
#define __z_posix_sysconf_SC_VERSION _POSIX_VERSION
223-
#define __z_posix_sysconf_SC_V6_ILP32_OFF32 (-1L)
224-
#define __z_posix_sysconf_SC_V6_ILP32_OFFBIG (-1L)
225-
#define __z_posix_sysconf_SC_V6_LP64_OFF64 (-1L)
226-
#define __z_posix_sysconf_SC_V6_LPBIG_OFFBIG (-1L)
227253
#define __z_posix_sysconf_SC_V7_ILP32_OFF32 (-1L)
228254
#define __z_posix_sysconf_SC_V7_ILP32_OFFBIG (-1L)
229255
#define __z_posix_sysconf_SC_V7_LP64_OFF64 (-1L)
@@ -280,7 +306,6 @@ enum {
280306
#define __z_posix_sysconf_SC_MQ_PRIO_MAX MQ_PRIO_MAX
281307
#define __z_posix_sysconf_SC_OPEN_MAX CONFIG_ZVFS_OPEN_MAX
282308
#define __z_posix_sysconf_SC_PAGE_SIZE PAGE_SIZE
283-
#define __z_posix_sysconf_SC_PAGESIZE PAGESIZE
284309
#define __z_posix_sysconf_SC_THREAD_DESTRUCTOR_ITERATIONS PTHREAD_DESTRUCTOR_ITERATIONS
285310
#define __z_posix_sysconf_SC_THREAD_KEYS_MAX PTHREAD_KEYS_MAX
286311
#define __z_posix_sysconf_SC_THREAD_STACK_MIN PTHREAD_STACK_MIN

lib/posix/options/sysconf.c

+6-11
Original file line numberDiff line numberDiff line change
@@ -125,21 +125,17 @@ long sysconf(int x)
125125
return z_sysconf(_SC_TYPED_MEMORY_OBJECTS);
126126
case _SC_VERSION:
127127
return z_sysconf(_SC_VERSION);
128-
case _SC_V6_ILP32_OFF32:
129-
return z_sysconf(_SC_V6_ILP32_OFF32);
130-
case _SC_V6_ILP32_OFFBIG:
131-
return z_sysconf(_SC_V6_ILP32_OFFBIG);
132-
case _SC_V6_LP64_OFF64:
133-
return z_sysconf(_SC_V6_LP64_OFF64);
134-
case _SC_V6_LPBIG_OFFBIG:
135-
return z_sysconf(_SC_V6_LPBIG_OFFBIG);
136128
case _SC_V7_ILP32_OFF32:
129+
/* case _SC_V6_ILP32_OFF32: */
137130
return z_sysconf(_SC_V7_ILP32_OFF32);
138131
case _SC_V7_ILP32_OFFBIG:
132+
/* case _SC_V6_ILP32_OFFBIG: */
139133
return z_sysconf(_SC_V7_ILP32_OFFBIG);
140134
case _SC_V7_LP64_OFF64:
135+
/* case _SC_V6_LP64_OFF64: */
141136
return z_sysconf(_SC_V7_LP64_OFF64);
142137
case _SC_V7_LPBIG_OFFBIG:
138+
/* case _SC_V6_LPBIG_OFFBIG: */
143139
return z_sysconf(_SC_V7_LPBIG_OFFBIG);
144140
case _SC_BC_BASE_MAX:
145141
return z_sysconf(_SC_BC_BASE_MAX);
@@ -237,10 +233,9 @@ long sysconf(int x)
237233
return z_sysconf(_SC_MQ_PRIO_MAX);
238234
case _SC_OPEN_MAX:
239235
return z_sysconf(_SC_OPEN_MAX);
240-
case _SC_PAGE_SIZE:
241-
return z_sysconf(_SC_PAGE_SIZE);
242236
case _SC_PAGESIZE:
243-
return z_sysconf(_SC_PAGESIZE);
237+
/* case _SC_PAGE_SIZE: */
238+
return z_sysconf(_SC_PAGE_SIZE);
244239
case _SC_THREAD_DESTRUCTOR_ITERATIONS:
245240
return z_sysconf(_SC_THREAD_DESTRUCTOR_ITERATIONS);
246241
case _SC_THREAD_KEYS_MAX:

0 commit comments

Comments
 (0)