Skip to content

Commit 8ecae6c

Browse files
androm3datgross35
authored andcommitted
qurt: Add support for Qualcomm QuRT
The QuRT RTOS -- used primarily on the Hexagon architecture -- has support for large parts of POSIX.
1 parent b071dcd commit 8ecae6c

File tree

20 files changed

+1635
-2
lines changed

20 files changed

+1635
-2
lines changed

build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ const CHECK_CFG_EXTRA: &[(&str, &[&str])] = &[
3838
(
3939
"target_os",
4040
&[
41-
"switch", "aix", "ohos", "hurd", "rtems", "visionos", "nuttx", "cygwin",
41+
"switch", "aix", "ohos", "hurd", "rtems", "visionos", "nuttx", "cygwin", "qurt",
4242
],
4343
),
4444
(

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
@@ -102,6 +102,9 @@ cfg_if! {
102102
} else if #[cfg(target_os = "openbsd")] {
103103
mod openbsd;
104104
pub(crate) use openbsd::*;
105+
} else if #[cfg(target_os = "qurt")] {
106+
mod qurt;
107+
pub(crate) use qurt::*;
105108
} else if #[cfg(target_os = "redox")] {
106109
mod redox;
107110
// pub(crate) use redox::*;
@@ -210,7 +213,7 @@ cfg_if! {
210213

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

src/new/qurt/errno.rs

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
//! Header: `errno.h`
2+
3+
use super::*;
4+
use crate::prelude::*;
5+
6+
// Standard error codes - verified to match QuRT SDK
7+
pub const EPERM: c_int = 1;
8+
pub const ENOENT: c_int = 2;
9+
pub const ESRCH: c_int = 3;
10+
pub const EINTR: c_int = 4;
11+
pub const EIO: c_int = 5;
12+
pub const ENXIO: c_int = 6;
13+
pub const E2BIG: c_int = 7;
14+
pub const ENOEXEC: c_int = 8;
15+
pub const EBADF: c_int = 9;
16+
pub const ECHILD: c_int = 10;
17+
pub const EAGAIN: c_int = 11;
18+
pub const ENOMEM: c_int = 12;
19+
pub const EACCES: c_int = 13;
20+
pub const EFAULT: c_int = 14;
21+
pub const ENOTBLK: c_int = 15;
22+
pub const EBUSY: c_int = 16;
23+
pub const EEXIST: c_int = 17;
24+
pub const EXDEV: c_int = 18;
25+
pub const ENODEV: c_int = 19;
26+
pub const ENOTDIR: c_int = 20;
27+
pub const EISDIR: c_int = 21;
28+
pub const EINVAL: c_int = 22;
29+
pub const ENFILE: c_int = 23;
30+
pub const EMFILE: c_int = 24;
31+
pub const ENOTTY: c_int = 25;
32+
pub const ETXTBSY: c_int = 26;
33+
pub const EFBIG: c_int = 27;
34+
pub const ENOSPC: c_int = 28;
35+
pub const ESPIPE: c_int = 29;
36+
pub const EROFS: c_int = 30;
37+
pub const EMLINK: c_int = 31;
38+
pub const EPIPE: c_int = 32;
39+
pub const EDOM: c_int = 33;
40+
pub const ERANGE: c_int = 34;
41+
pub const EDEADLK: c_int = 35;
42+
pub const ENAMETOOLONG: c_int = 36;
43+
pub const ENOLCK: c_int = 37;
44+
pub const ENOSYS: c_int = 38;
45+
pub const ENOTEMPTY: c_int = 39;
46+
pub const ELOOP: c_int = 40;
47+
pub const EWOULDBLOCK: c_int = EAGAIN;
48+
pub const ENOMSG: c_int = 42;
49+
pub const EIDRM: c_int = 43;
50+
pub const ECHRNG: c_int = 44;
51+
pub const EL2NSYNC: c_int = 45;
52+
pub const EL3HLT: c_int = 46;
53+
pub const EL3RST: c_int = 47;
54+
pub const ELNRNG: c_int = 48;
55+
pub const EUNATCH: c_int = 49;
56+
pub const ENOCSI: c_int = 50;
57+
pub const EL2HLT: c_int = 51;
58+
pub const EBADE: c_int = 52;
59+
pub const EBADR: c_int = 53;
60+
pub const EXFULL: c_int = 54;
61+
pub const ENOANO: c_int = 55;
62+
pub const EBADRQC: c_int = 56;
63+
pub const EBADSLT: c_int = 57;
64+
pub const EDEADLOCK: c_int = EDEADLK;
65+
pub const EBFONT: c_int = 59;
66+
pub const ENOSTR: c_int = 60;
67+
pub const ENODATA: c_int = 61;
68+
pub const ETIME: c_int = 62;
69+
pub const ENOSR: c_int = 63;
70+
pub const ENONET: c_int = 64;
71+
pub const ENOPKG: c_int = 65;
72+
pub const EREMOTE: c_int = 66;
73+
pub const ENOLINK: c_int = 67;
74+
pub const EADV: c_int = 68;
75+
pub const ESRMNT: c_int = 69;
76+
pub const ECOMM: c_int = 70;
77+
pub const EPROTO: c_int = 71;
78+
pub const EMULTIHOP: c_int = 72;
79+
pub const EDOTDOT: c_int = 73;
80+
pub const EBADMSG: c_int = 74;
81+
pub const EOVERFLOW: c_int = 75;
82+
pub const ENOTUNIQ: c_int = 76;
83+
pub const EBADFD: c_int = 77;
84+
pub const EREMCHG: c_int = 78;
85+
pub const ELIBACC: c_int = 79;
86+
pub const ELIBBAD: c_int = 80;
87+
pub const ELIBSCN: c_int = 81;
88+
pub const ELIBMAX: c_int = 82;
89+
pub const ELIBEXEC: c_int = 83;
90+
pub const EILSEQ: c_int = 84;
91+
pub const ERESTART: c_int = 85;
92+
pub const ESTRPIPE: c_int = 86;
93+
pub const EUSERS: c_int = 87;
94+
pub const ENOTSOCK: c_int = 88;
95+
pub const EDESTADDRREQ: c_int = 89;
96+
pub const EMSGSIZE: c_int = 90;
97+
pub const EPROTOTYPE: c_int = 91;
98+
pub const ENOPROTOOPT: c_int = 92;
99+
pub const EPROTONOSUPPORT: c_int = 93;
100+
pub const ESOCKTNOSUPPORT: c_int = 94;
101+
pub const EOPNOTSUPP: c_int = 95;
102+
pub const ENOTSUP: c_int = EOPNOTSUPP;
103+
pub const EPFNOSUPPORT: c_int = 96;
104+
pub const EAFNOSUPPORT: c_int = 97;
105+
pub const EADDRINUSE: c_int = 98;
106+
pub const EADDRNOTAVAIL: c_int = 99;
107+
pub const ENETDOWN: c_int = 100;
108+
pub const ENETUNREACH: c_int = 101;
109+
pub const ENETRESET: c_int = 102;
110+
pub const ECONNABORTED: c_int = 103;
111+
pub const ECONNRESET: c_int = 104;
112+
pub const ENOBUFS: c_int = 105;
113+
pub const EISCONN: c_int = 106;
114+
pub const ENOTCONN: c_int = 107;
115+
pub const ESHUTDOWN: c_int = 108;
116+
pub const ETOOMANYREFS: c_int = 109;
117+
pub const ETIMEDOUT: c_int = 110;
118+
pub const ECONNREFUSED: c_int = 111;
119+
pub const EHOSTDOWN: c_int = 112;
120+
pub const EHOSTUNREACH: c_int = 113;
121+
pub const EALREADY: c_int = 114;
122+
pub const EINPROGRESS: c_int = 115;
123+
pub const ESTALE: c_int = 116;
124+
pub const EUCLEAN: c_int = 117;
125+
pub const ENOTNAM: c_int = 118;
126+
pub const ENAVAIL: c_int = 119;
127+
pub const EISNAM: c_int = 120;
128+
pub const EREMOTEIO: c_int = 121;
129+
pub const EDQUOT: c_int = 122;
130+
pub const ENOMEDIUM: c_int = 123;
131+
pub const EMEDIUMTYPE: c_int = 124;
132+
pub const ECANCELED: c_int = 125;
133+
pub const ENOKEY: c_int = 126;
134+
pub const EKEYEXPIRED: c_int = 127;
135+
pub const EKEYREVOKED: c_int = 128;
136+
pub const EKEYREJECTED: c_int = 129;
137+
pub const EOWNERDEAD: c_int = 130;
138+
pub const ENOTRECOVERABLE: c_int = 131;
139+
pub const ERFKILL: c_int = 132;
140+
pub const EHWPOISON: c_int = 133;
141+
142+
extern "C" {
143+
// Error number access
144+
#[link_name = "__errno_location"]
145+
pub fn __errno_location() -> *mut c_int;
146+
}
147+
148+
pub unsafe fn errno() -> c_int {
149+
*__errno_location()
150+
}
151+
152+
pub unsafe fn set_errno(value: c_int) {
153+
*__errno_location() = value;
154+
}

src/new/qurt/fcntl.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//! Header: `fcntl.h`
2+
3+
use super::*;
4+
use crate::prelude::*;
5+
6+
// File access modes
7+
pub const O_RDONLY: c_int = 0x0000;
8+
pub const O_WRONLY: c_int = 0x0001;
9+
pub const O_RDWR: c_int = 0x0002;
10+
pub const O_ACCMODE: c_int = 0x0003;
11+
12+
// File creation flags
13+
pub const O_CREAT: c_int = 0x0040;
14+
pub const O_EXCL: c_int = 0x0080;
15+
pub const O_NOCTTY: c_int = 0x0100;
16+
pub const O_TRUNC: c_int = 0x0200;
17+
18+
// File status flags
19+
pub const O_APPEND: c_int = 0x0400;
20+
pub const O_NONBLOCK: c_int = 0x0800;
21+
pub const O_SYNC: c_int = 0x1000;
22+
pub const O_FSYNC: c_int = O_SYNC;
23+
pub const O_DSYNC: c_int = 0x1000;
24+
25+
// fcntl() commands
26+
pub const F_DUPFD: c_int = 0;
27+
pub const F_GETFD: c_int = 1;
28+
pub const F_SETFD: c_int = 2;
29+
pub const F_GETFL: c_int = 3;
30+
pub const F_SETFL: c_int = 4;
31+
pub const F_GETLK: c_int = 5;
32+
pub const F_SETLK: c_int = 6;
33+
pub const F_SETLKW: c_int = 7;
34+
35+
// File descriptor flags
36+
pub const FD_CLOEXEC: c_int = 1;
37+
38+
// Lock types for fcntl()
39+
pub const F_RDLCK: c_int = 0;
40+
pub const F_WRLCK: c_int = 1;
41+
pub const F_UNLCK: c_int = 2;
42+
43+
// Functions
44+
extern "C" {
45+
pub fn open(pathname: *const c_char, flags: c_int, ...) -> c_int;
46+
pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int;
47+
pub fn creat(pathname: *const c_char, mode: mode_t) -> c_int;
48+
pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int;
49+
}

src/new/qurt/limits.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//! Header: `limits.h`
2+
3+
use super::*;
4+
use crate::prelude::*;
5+
6+
// Character properties
7+
pub const CHAR_BIT: c_uint = 8;
8+
pub const CHAR_MAX: c_char = 255; // unsigned char on Hexagon
9+
pub const CHAR_MIN: c_char = 0;
10+
pub const SCHAR_MAX: c_schar = 127;
11+
pub const SCHAR_MIN: c_schar = -128;
12+
pub const UCHAR_MAX: c_uchar = 255;
13+
14+
// Integer properties
15+
pub const INT_MAX: c_int = 2147483647;
16+
pub const INT_MIN: c_int = (-2147483647 - 1);
17+
pub const UINT_MAX: c_uint = 4294967295;
18+
19+
pub const LONG_MAX: c_long = 2147483647;
20+
pub const LONG_MIN: c_long = (-2147483647 - 1);
21+
pub const ULONG_MAX: c_ulong = 4294967295;
22+
23+
pub const SHRT_MAX: c_short = 32767;
24+
pub const SHRT_MIN: c_short = (-32768);
25+
pub const USHRT_MAX: c_ushort = 65535;
26+
27+
// POSIX Limits
28+
pub const ARG_MAX: c_int = 4096;
29+
pub const CHILD_MAX: c_int = 25;
30+
pub const LINK_MAX: c_int = 8;
31+
pub const MAX_CANON: c_int = 255;
32+
pub const MAX_INPUT: c_int = 255;
33+
pub const NAME_MAX: c_int = 255;
34+
pub const OPEN_MAX: c_int = 20;
35+
pub const PATH_MAX: c_int = 260;
36+
pub const PIPE_BUF: c_int = 512;
37+
pub const STREAM_MAX: c_int = 20;
38+
pub const TZNAME_MAX: c_int = 50;
39+
40+
// Additional limits
41+
pub const IOV_MAX: c_int = 16;

0 commit comments

Comments
 (0)