Skip to content

Commit 0312ed9

Browse files
committed
qurt: Add support for Qualcomm QuRT
The QuRT RTOS -- used primarily on the Hexagon architecture -- has support for large parts of POSIX.
1 parent d58c1f4 commit 0312ed9

File tree

6 files changed

+1316
-1
lines changed

6 files changed

+1316
-1
lines changed

src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ cfg_if! {
7777
mod vxworks;
7878
pub use crate::vxworks::*;
7979

80+
prelude!();
81+
} else if #[cfg(target_os = "qurt")] {
82+
mod primitives;
83+
pub use crate::primitives::*;
84+
85+
mod qurt;
86+
pub use crate::qurt::*;
87+
8088
prelude!();
8189
} else if #[cfg(target_os = "solid_asp3")] {
8290
mod primitives;

src/new/common/posix/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
target_os = "emscripten",
99
target_os = "l4re",
1010
target_os = "linux",
11+
target_os = "qurt",
1112
target_vendor = "apple",
1213
))]
1314
pub(crate) mod pthread;

src/new/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ cfg_if! {
101101
} else if #[cfg(target_os = "openbsd")] {
102102
mod openbsd;
103103
pub(crate) use openbsd::*;
104+
} else if #[cfg(target_os = "qurt")] {
105+
mod qurt;
106+
pub(crate) use qurt::*;
104107
} else if #[cfg(target_os = "redox")] {
105108
mod redox;
106109
// pub(crate) use redox::*;
@@ -208,7 +211,7 @@ cfg_if! {
208211

209212
// Per-family headers we export
210213
cfg_if! {
211-
if #[cfg(target_family = "unix")] {
214+
if #[cfg(all(target_family = "unix", not(target_os = "qurt")))] {
212215
// FIXME(pthread): eventually all platforms should use this module
213216
#[cfg(any(
214217
target_os = "android",

src/new/qurt/mod.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//! QuRT (Qualcomm Real-Time OS) bindings
2+
//!
3+
//! QuRT is Qualcomm's real-time operating system for Hexagon DSP architectures.
4+
5+
pub(crate) mod errno;
6+
pub(crate) mod fcntl;
7+
pub(crate) mod limits;
8+
pub(crate) mod pthread;
9+
pub(crate) mod semaphore;
10+
pub(crate) mod signal;
11+
pub(crate) mod stdio;
12+
pub(crate) mod stdlib;
13+
pub(crate) mod sys;
14+
pub(crate) mod time;
15+
pub(crate) mod unistd;

src/qurt/hexagon.rs

Lines changed: 340 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,340 @@
1+
use crate::prelude::*;
2+
3+
pub type wchar_t = u32;
4+
5+
pub type cpu_set_t = c_uint;
6+
7+
s! {
8+
pub struct stat {
9+
pub st_dev: crate::dev_t,
10+
pub st_ino: crate::ino_t,
11+
pub st_mode: crate::mode_t,
12+
pub st_nlink: crate::nlink_t,
13+
pub st_uid: crate::uid_t,
14+
pub st_gid: crate::gid_t,
15+
pub st_rdev: crate::dev_t,
16+
pub st_size: crate::off_t,
17+
pub st_blksize: crate::blksize_t,
18+
pub st_blocks: crate::blkcnt_t,
19+
pub st_atime: crate::time_t,
20+
pub st_atime_nsec: c_long,
21+
pub st_mtime: crate::time_t,
22+
pub st_mtime_nsec: c_long,
23+
pub st_ctime: crate::time_t,
24+
pub st_ctime_nsec: c_long,
25+
}
26+
27+
pub struct dirent {
28+
pub d_ino: crate::ino_t,
29+
pub d_type: c_uchar,
30+
pub d_name: [c_char; 256],
31+
}
32+
}
33+
34+
// File type constants for stat.st_mode
35+
pub const S_IFMT: crate::mode_t = 0o170000;
36+
pub const S_IFSOCK: crate::mode_t = 0o140000;
37+
pub const S_IFLNK: crate::mode_t = 0o120000;
38+
pub const S_IFREG: crate::mode_t = 0o100000;
39+
pub const S_IFBLK: crate::mode_t = 0o060000;
40+
pub const S_IFDIR: crate::mode_t = 0o040000;
41+
pub const S_IFCHR: crate::mode_t = 0o020000;
42+
pub const S_IFIFO: crate::mode_t = 0o010000;
43+
44+
// File permission constants
45+
pub const S_ISUID: crate::mode_t = 0o4000;
46+
pub const S_ISGID: crate::mode_t = 0o2000;
47+
pub const S_ISVTX: crate::mode_t = 0o1000;
48+
pub const S_IRWXU: crate::mode_t = 0o0700;
49+
pub const S_IRUSR: crate::mode_t = 0o0400;
50+
pub const S_IWUSR: crate::mode_t = 0o0200;
51+
pub const S_IXUSR: crate::mode_t = 0o0100;
52+
pub const S_IRWXG: crate::mode_t = 0o0070;
53+
pub const S_IRGRP: crate::mode_t = 0o0040;
54+
pub const S_IWGRP: crate::mode_t = 0o0020;
55+
pub const S_IXGRP: crate::mode_t = 0o0010;
56+
pub const S_IRWXO: crate::mode_t = 0o0007;
57+
pub const S_IROTH: crate::mode_t = 0o0004;
58+
pub const S_IWOTH: crate::mode_t = 0o0002;
59+
pub const S_IXOTH: crate::mode_t = 0o0001;
60+
61+
// Directory entry types
62+
pub const DT_UNKNOWN: c_uchar = 0;
63+
pub const DT_FIFO: c_uchar = 1;
64+
pub const DT_CHR: c_uchar = 2;
65+
pub const DT_DIR: c_uchar = 4;
66+
pub const DT_BLK: c_uchar = 6;
67+
pub const DT_REG: c_uchar = 8;
68+
pub const DT_LNK: c_uchar = 10;
69+
pub const DT_SOCK: c_uchar = 12;
70+
71+
// Size types
72+
pub const PAGESIZE: size_t = 4096;
73+
pub const PAGE_SIZE: size_t = 4096;
74+
75+
// pathconf constants (from bits/confname.h)
76+
pub const _PC_LINK_MAX: c_int = 0;
77+
pub const _PC_MAX_CANON: c_int = 1;
78+
pub const _PC_MAX_INPUT: c_int = 2;
79+
pub const _PC_NAME_MAX: c_int = 3;
80+
pub const _PC_PATH_MAX: c_int = 4;
81+
pub const _PC_PIPE_BUF: c_int = 5;
82+
pub const _PC_CHOWN_RESTRICTED: c_int = 6;
83+
pub const _PC_NO_TRUNC: c_int = 7;
84+
pub const _PC_VDISABLE: c_int = 8;
85+
pub const _PC_SYNC_IO: c_int = 9;
86+
pub const _PC_ASYNC_IO: c_int = 10;
87+
pub const _PC_PRIO_IO: c_int = 11;
88+
pub const _PC_SOCK_MAXBUF: c_int = 12;
89+
pub const _PC_FILESIZEBITS: c_int = 13;
90+
pub const _PC_REC_INCR_XFER_SIZE: c_int = 14;
91+
pub const _PC_REC_MAX_XFER_SIZE: c_int = 15;
92+
pub const _PC_REC_MIN_XFER_SIZE: c_int = 16;
93+
pub const _PC_REC_XFER_ALIGN: c_int = 17;
94+
pub const _PC_ALLOC_SIZE_MIN: c_int = 18;
95+
pub const _PC_SYMLINK_MAX: c_int = 19;
96+
pub const _PC_2_SYMLINKS: c_int = 20;
97+
98+
// sysconf constants (from bits/confname.h)
99+
pub const _SC_ARG_MAX: c_int = 0;
100+
pub const _SC_CHILD_MAX: c_int = 1;
101+
pub const _SC_CLK_TCK: c_int = 2;
102+
pub const _SC_NGROUPS_MAX: c_int = 3;
103+
pub const _SC_OPEN_MAX: c_int = 4;
104+
pub const _SC_STREAM_MAX: c_int = 5;
105+
pub const _SC_TZNAME_MAX: c_int = 6;
106+
pub const _SC_JOB_CONTROL: c_int = 7;
107+
pub const _SC_SAVED_IDS: c_int = 8;
108+
pub const _SC_REALTIME_SIGNALS: c_int = 9;
109+
pub const _SC_PRIORITY_SCHEDULING: c_int = 10;
110+
pub const _SC_TIMERS: c_int = 11;
111+
pub const _SC_ASYNCHRONOUS_IO: c_int = 12;
112+
pub const _SC_PRIORITIZED_IO: c_int = 13;
113+
pub const _SC_SYNCHRONIZED_IO: c_int = 14;
114+
pub const _SC_FSYNC: c_int = 15;
115+
pub const _SC_MAPPED_FILES: c_int = 16;
116+
pub const _SC_MEMLOCK: c_int = 17;
117+
pub const _SC_MEMLOCK_RANGE: c_int = 18;
118+
pub const _SC_MEMORY_PROTECTION: c_int = 19;
119+
pub const _SC_MESSAGE_PASSING: c_int = 20;
120+
pub const _SC_SEMAPHORES: c_int = 21;
121+
pub const _SC_SHARED_MEMORY_OBJECTS: c_int = 22;
122+
pub const _SC_AIO_LISTIO_MAX: c_int = 23;
123+
pub const _SC_AIO_MAX: c_int = 24;
124+
pub const _SC_AIO_PRIO_DELTA_MAX: c_int = 25;
125+
pub const _SC_DELAYTIMER_MAX: c_int = 26;
126+
pub const _SC_MQ_OPEN_MAX: c_int = 27;
127+
pub const _SC_MQ_PRIO_MAX: c_int = 28;
128+
pub const _SC_VERSION: c_int = 29;
129+
pub const _SC_PAGESIZE: c_int = 30;
130+
pub const _SC_PAGE_SIZE: c_int = _SC_PAGESIZE;
131+
pub const _SC_RTSIG_MAX: c_int = 31;
132+
pub const _SC_SEM_NSEMS_MAX: c_int = 32;
133+
pub const _SC_SEM_VALUE_MAX: c_int = 33;
134+
pub const _SC_SIGQUEUE_MAX: c_int = 34;
135+
pub const _SC_TIMER_MAX: c_int = 35;
136+
137+
// POSIX2 sysconf options
138+
pub const _SC_BC_BASE_MAX: c_int = 36;
139+
pub const _SC_BC_DIM_MAX: c_int = 37;
140+
pub const _SC_BC_SCALE_MAX: c_int = 38;
141+
pub const _SC_BC_STRING_MAX: c_int = 39;
142+
pub const _SC_COLL_WEIGHTS_MAX: c_int = 40;
143+
pub const _SC_EQUIV_CLASS_MAX: c_int = 41;
144+
pub const _SC_EXPR_NEST_MAX: c_int = 42;
145+
pub const _SC_LINE_MAX: c_int = 43;
146+
pub const _SC_RE_DUP_MAX: c_int = 44;
147+
pub const _SC_CHARCLASS_NAME_MAX: c_int = 45;
148+
149+
pub const _SC_2_VERSION: c_int = 46;
150+
pub const _SC_2_C_BIND: c_int = 47;
151+
pub const _SC_2_C_DEV: c_int = 48;
152+
pub const _SC_2_FORT_DEV: c_int = 49;
153+
pub const _SC_2_FORT_RUN: c_int = 50;
154+
pub const _SC_2_SW_DEV: c_int = 51;
155+
pub const _SC_2_LOCALEDEF: c_int = 52;
156+
157+
pub const _SC_PII: c_int = 53;
158+
pub const _SC_PII_XTI: c_int = 54;
159+
pub const _SC_PII_SOCKET: c_int = 55;
160+
pub const _SC_PII_INTERNET: c_int = 56;
161+
pub const _SC_PII_OSI: c_int = 57;
162+
pub const _SC_POLL: c_int = 58;
163+
pub const _SC_SELECT: c_int = 59;
164+
pub const _SC_UIO_MAXIOV: c_int = 60;
165+
pub const _SC_IOV_MAX: c_int = _SC_UIO_MAXIOV;
166+
pub const _SC_PII_INTERNET_STREAM: c_int = 61;
167+
pub const _SC_PII_INTERNET_DGRAM: c_int = 62;
168+
pub const _SC_PII_OSI_COTS: c_int = 63;
169+
pub const _SC_PII_OSI_CLTS: c_int = 64;
170+
pub const _SC_PII_OSI_M: c_int = 65;
171+
pub const _SC_T_IOV_MAX: c_int = 66;
172+
173+
// POSIX threads sysconf options
174+
pub const _SC_THREADS: c_int = 67;
175+
pub const _SC_THREAD_SAFE_FUNCTIONS: c_int = 68;
176+
pub const _SC_GETGR_R_SIZE_MAX: c_int = 69;
177+
pub const _SC_GETPW_R_SIZE_MAX: c_int = 70;
178+
pub const _SC_LOGIN_NAME_MAX: c_int = 71;
179+
pub const _SC_TTY_NAME_MAX: c_int = 72;
180+
pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: c_int = 73;
181+
pub const _SC_THREAD_KEYS_MAX: c_int = 74;
182+
pub const _SC_THREAD_STACK_MIN: c_int = 75;
183+
pub const _SC_THREAD_THREADS_MAX: c_int = 76;
184+
pub const _SC_THREAD_ATTR_STACKADDR: c_int = 77;
185+
pub const _SC_THREAD_ATTR_STACKSIZE: c_int = 78;
186+
pub const _SC_THREAD_PRIORITY_SCHEDULING: c_int = 79;
187+
pub const _SC_THREAD_PRIO_INHERIT: c_int = 80;
188+
pub const _SC_THREAD_PRIO_PROTECT: c_int = 81;
189+
pub const _SC_THREAD_PROCESS_SHARED: c_int = 82;
190+
191+
pub const _SC_NPROCESSORS_CONF: c_int = 83;
192+
pub const _SC_NPROCESSORS_ONLN: c_int = 84;
193+
pub const _SC_PHYS_PAGES: c_int = 85;
194+
pub const _SC_AVPHYS_PAGES: c_int = 86;
195+
pub const _SC_ATEXIT_MAX: c_int = 87;
196+
pub const _SC_PASS_MAX: c_int = 88;
197+
198+
pub const _SC_XOPEN_VERSION: c_int = 89;
199+
pub const _SC_XOPEN_XCU_VERSION: c_int = 90;
200+
pub const _SC_XOPEN_UNIX: c_int = 91;
201+
pub const _SC_XOPEN_CRYPT: c_int = 92;
202+
pub const _SC_XOPEN_ENH_I18N: c_int = 93;
203+
pub const _SC_XOPEN_SHM: c_int = 94;
204+
205+
pub const _SC_2_CHAR_TERM: c_int = 95;
206+
pub const _SC_2_C_VERSION: c_int = 96;
207+
pub const _SC_2_UPE: c_int = 97;
208+
209+
pub const _SC_XOPEN_XPG2: c_int = 98;
210+
pub const _SC_XOPEN_XPG3: c_int = 99;
211+
pub const _SC_XOPEN_XPG4: c_int = 100;
212+
213+
pub const _SC_CHAR_BIT: c_int = 101;
214+
pub const _SC_CHAR_MAX: c_int = 102;
215+
pub const _SC_CHAR_MIN: c_int = 103;
216+
pub const _SC_INT_MAX: c_int = 104;
217+
pub const _SC_INT_MIN: c_int = 105;
218+
pub const _SC_LONG_BIT: c_int = 106;
219+
pub const _SC_WORD_BIT: c_int = 107;
220+
pub const _SC_MB_LEN_MAX: c_int = 108;
221+
pub const _SC_NZERO: c_int = 109;
222+
pub const _SC_SSIZE_MAX: c_int = 110;
223+
pub const _SC_SCHAR_MAX: c_int = 111;
224+
pub const _SC_SCHAR_MIN: c_int = 112;
225+
pub const _SC_SHRT_MAX: c_int = 113;
226+
pub const _SC_SHRT_MIN: c_int = 114;
227+
pub const _SC_UCHAR_MAX: c_int = 115;
228+
pub const _SC_UINT_MAX: c_int = 116;
229+
pub const _SC_ULONG_MAX: c_int = 117;
230+
pub const _SC_USHRT_MAX: c_int = 118;
231+
232+
pub const _SC_NL_ARGMAX: c_int = 119;
233+
pub const _SC_NL_LANGMAX: c_int = 120;
234+
pub const _SC_NL_MSGMAX: c_int = 121;
235+
pub const _SC_NL_NMAX: c_int = 122;
236+
pub const _SC_NL_SETMAX: c_int = 123;
237+
pub const _SC_NL_TEXTMAX: c_int = 124;
238+
239+
pub const _SC_XBS5_ILP32_OFF32: c_int = 125;
240+
pub const _SC_XBS5_ILP32_OFFBIG: c_int = 126;
241+
pub const _SC_XBS5_LP64_OFF64: c_int = 127;
242+
pub const _SC_XBS5_LPBIG_OFFBIG: c_int = 128;
243+
244+
pub const _SC_XOPEN_LEGACY: c_int = 129;
245+
pub const _SC_XOPEN_REALTIME: c_int = 130;
246+
pub const _SC_XOPEN_REALTIME_THREADS: c_int = 131;
247+
248+
pub const _SC_ADVISORY_INFO: c_int = 132;
249+
pub const _SC_BARRIERS: c_int = 133;
250+
pub const _SC_BASE: c_int = 134;
251+
pub const _SC_C_LANG_SUPPORT: c_int = 135;
252+
pub const _SC_C_LANG_SUPPORT_R: c_int = 136;
253+
pub const _SC_CLOCK_SELECTION: c_int = 137;
254+
pub const _SC_CPUTIME: c_int = 138;
255+
pub const _SC_THREAD_CPUTIME: c_int = 139;
256+
pub const _SC_DEVICE_IO: c_int = 140;
257+
pub const _SC_DEVICE_SPECIFIC: c_int = 141;
258+
pub const _SC_DEVICE_SPECIFIC_R: c_int = 142;
259+
pub const _SC_FD_MGMT: c_int = 143;
260+
pub const _SC_FIFO: c_int = 144;
261+
pub const _SC_PIPE: c_int = 145;
262+
pub const _SC_FILE_ATTRIBUTES: c_int = 146;
263+
pub const _SC_FILE_LOCKING: c_int = 147;
264+
pub const _SC_FILE_SYSTEM: c_int = 148;
265+
pub const _SC_MONOTONIC_CLOCK: c_int = 149;
266+
pub const _SC_MULTI_PROCESS: c_int = 150;
267+
pub const _SC_SINGLE_PROCESS: c_int = 151;
268+
pub const _SC_NETWORKING: c_int = 152;
269+
pub const _SC_READER_WRITER_LOCKS: c_int = 153;
270+
pub const _SC_SPIN_LOCKS: c_int = 154;
271+
pub const _SC_REGEXP: c_int = 155;
272+
pub const _SC_REGEX_VERSION: c_int = 156;
273+
pub const _SC_SHELL: c_int = 157;
274+
pub const _SC_SIGNALS: c_int = 158;
275+
pub const _SC_SPAWN: c_int = 159;
276+
pub const _SC_SPORADIC_SERVER: c_int = 160;
277+
pub const _SC_THREAD_SPORADIC_SERVER: c_int = 161;
278+
pub const _SC_SYSTEM_DATABASE: c_int = 162;
279+
pub const _SC_SYSTEM_DATABASE_R: c_int = 163;
280+
pub const _SC_TIMEOUTS: c_int = 164;
281+
pub const _SC_TYPED_MEMORY_OBJECTS: c_int = 165;
282+
pub const _SC_USER_GROUPS: c_int = 166;
283+
pub const _SC_USER_GROUPS_R: c_int = 167;
284+
pub const _SC_2_PBS: c_int = 168;
285+
pub const _SC_2_PBS_ACCOUNTING: c_int = 169;
286+
pub const _SC_2_PBS_LOCATE: c_int = 170;
287+
pub const _SC_2_PBS_MESSAGE: c_int = 171;
288+
pub const _SC_2_PBS_TRACK: c_int = 172;
289+
pub const _SC_SYMLOOP_MAX: c_int = 173;
290+
pub const _SC_STREAMS: c_int = 174;
291+
pub const _SC_2_PBS_CHECKPOINT: c_int = 175;
292+
293+
pub const _SC_V6_ILP32_OFF32: c_int = 176;
294+
pub const _SC_V6_ILP32_OFFBIG: c_int = 177;
295+
pub const _SC_V6_LP64_OFF64: c_int = 178;
296+
pub const _SC_V6_LPBIG_OFFBIG: c_int = 179;
297+
298+
pub const _SC_HOST_NAME_MAX: c_int = 180;
299+
pub const _SC_TRACE: c_int = 181;
300+
pub const _SC_TRACE_EVENT_FILTER: c_int = 182;
301+
pub const _SC_TRACE_INHERIT: c_int = 183;
302+
pub const _SC_TRACE_LOG: c_int = 184;
303+
304+
pub const _SC_LEVEL1_ICACHE_SIZE: c_int = 185;
305+
pub const _SC_LEVEL1_ICACHE_ASSOC: c_int = 186;
306+
pub const _SC_LEVEL1_ICACHE_LINESIZE: c_int = 187;
307+
pub const _SC_LEVEL1_DCACHE_SIZE: c_int = 188;
308+
pub const _SC_LEVEL1_DCACHE_ASSOC: c_int = 189;
309+
pub const _SC_LEVEL1_DCACHE_LINESIZE: c_int = 190;
310+
pub const _SC_LEVEL2_CACHE_SIZE: c_int = 191;
311+
pub const _SC_LEVEL2_CACHE_ASSOC: c_int = 192;
312+
pub const _SC_LEVEL2_CACHE_LINESIZE: c_int = 193;
313+
pub const _SC_LEVEL3_CACHE_SIZE: c_int = 194;
314+
pub const _SC_LEVEL3_CACHE_ASSOC: c_int = 195;
315+
pub const _SC_LEVEL3_CACHE_LINESIZE: c_int = 196;
316+
pub const _SC_LEVEL4_CACHE_SIZE: c_int = 197;
317+
pub const _SC_LEVEL4_CACHE_ASSOC: c_int = 198;
318+
pub const _SC_LEVEL4_CACHE_LINESIZE: c_int = 199;
319+
320+
pub const _SC_IPV6: c_int = 235;
321+
pub const _SC_RAW_SOCKETS: c_int = 236;
322+
323+
pub const _SC_V7_ILP32_OFF32: c_int = 237;
324+
pub const _SC_V7_ILP32_OFFBIG: c_int = 238;
325+
pub const _SC_V7_LP64_OFF64: c_int = 239;
326+
pub const _SC_V7_LPBIG_OFFBIG: c_int = 240;
327+
328+
pub const _SC_SS_REPL_MAX: c_int = 241;
329+
330+
pub const _SC_TRACE_EVENT_NAME_MAX: c_int = 242;
331+
pub const _SC_TRACE_NAME_MAX: c_int = 243;
332+
pub const _SC_TRACE_SYS_MAX: c_int = 244;
333+
pub const _SC_TRACE_USER_EVENT_MAX: c_int = 245;
334+
335+
pub const _SC_XOPEN_STREAMS: c_int = 246;
336+
337+
pub const _SC_THREAD_ROBUST_PRIO_INHERIT: c_int = 247;
338+
pub const _SC_THREAD_ROBUST_PRIO_PROTECT: c_int = 248;
339+
340+
// Note: QuRT doesn't use traditional syscalls but has its own API

0 commit comments

Comments
 (0)