Skip to content

Commit 932ba01

Browse files
committed
Add "new" QuRT libc
1 parent 47aa07f commit 932ba01

File tree

14 files changed

+898
-147
lines changed

14 files changed

+898
-147
lines changed

src/new/qurt/errno.rs

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

src/new/qurt/fcntl.rs

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

src/new/qurt/limits.rs

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

src/new/qurt/pthread.rs

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
//! Header: `pthread.h`
2+
//!
3+
//! QuRT provides a subset of POSIX pthread functionality optimized for real-time systems.
4+
5+
use crate::prelude::*;
6+
7+
// Thread creation attributes
8+
pub const PTHREAD_CREATE_JOINABLE: c_int = 0;
9+
pub const PTHREAD_CREATE_DETACHED: c_int = 1;
10+
11+
// Mutex types
12+
pub const PTHREAD_MUTEX_NORMAL: c_int = 0;
13+
pub const PTHREAD_MUTEX_RECURSIVE: c_int = 1;
14+
pub const PTHREAD_MUTEX_ERRORCHECK: c_int = 2;
15+
pub const PTHREAD_MUTEX_DEFAULT: c_int = PTHREAD_MUTEX_NORMAL;
16+
17+
// Mutex protocol
18+
pub const PTHREAD_PRIO_NONE: c_int = 0;
19+
pub const PTHREAD_PRIO_INHERIT: c_int = 1;
20+
pub const PTHREAD_PRIO_PROTECT: c_int = 2;
21+
22+
// Thread priority constants
23+
pub const PTHREAD_MIN_PRIORITY: c_int = 0;
24+
pub const PTHREAD_MAX_PRIORITY: c_int = 255;
25+
26+
// Scheduling policies
27+
pub const SCHED_OTHER: c_int = 0;
28+
pub const SCHED_FIFO: c_int = 1;
29+
pub const SCHED_RR: c_int = 2;
30+
31+
// Initializer constants
32+
pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0xFFFFFFFF;
33+
pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0xFFFFFFFF;
34+
pub const PTHREAD_ONCE_INIT: pthread_once_t = 0;
35+
36+
// Stack size
37+
pub const PTHREAD_STACK_MIN: size_t = 8192;
38+
39+
// Additional pthread types and attributes
40+
pub const PTHREAD_SCOPE_SYSTEM: c_int = 0;
41+
pub const PTHREAD_SCOPE_PROCESS: c_int = 1;
42+
43+
pub const PTHREAD_INHERIT_SCHED: c_int = 0;
44+
pub const PTHREAD_EXPLICIT_SCHED: c_int = 1;
45+
46+
extern "C" {
47+
// Thread management
48+
pub fn pthread_create(
49+
thread: *mut pthread_t,
50+
attr: *const pthread_attr_t,
51+
start_routine: extern "C" fn(*mut c_void) -> *mut c_void,
52+
arg: *mut c_void,
53+
) -> c_int;
54+
pub fn pthread_join(thread: pthread_t, retval: *mut *mut c_void) -> c_int;
55+
pub fn pthread_detach(thread: pthread_t) -> c_int;
56+
pub fn pthread_exit(retval: *mut c_void) -> !;
57+
pub fn pthread_self() -> pthread_t;
58+
pub fn pthread_equal(t1: pthread_t, t2: pthread_t) -> c_int;
59+
60+
// Thread attributes
61+
pub fn pthread_attr_init(attr: *mut pthread_attr_t) -> c_int;
62+
pub fn pthread_attr_destroy(attr: *mut pthread_attr_t) -> c_int;
63+
pub fn pthread_attr_setstacksize(attr: *mut pthread_attr_t, stacksize: size_t) -> c_int;
64+
pub fn pthread_attr_getstacksize(attr: *const pthread_attr_t, stacksize: *mut size_t) -> c_int;
65+
pub fn pthread_attr_setdetachstate(attr: *mut pthread_attr_t, detachstate: c_int) -> c_int;
66+
pub fn pthread_attr_getdetachstate(
67+
attr: *const pthread_attr_t,
68+
detachstate: *mut c_int,
69+
) -> c_int;
70+
71+
// Mutex operations
72+
pub fn pthread_mutex_init(
73+
mutex: *mut pthread_mutex_t,
74+
attr: *const pthread_mutexattr_t,
75+
) -> c_int;
76+
pub fn pthread_mutex_destroy(mutex: *mut pthread_mutex_t) -> c_int;
77+
pub fn pthread_mutex_lock(mutex: *mut pthread_mutex_t) -> c_int;
78+
pub fn pthread_mutex_trylock(mutex: *mut pthread_mutex_t) -> c_int;
79+
pub fn pthread_mutex_unlock(mutex: *mut pthread_mutex_t) -> c_int;
80+
81+
// Mutex attributes
82+
pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> c_int;
83+
pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> c_int;
84+
pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t, kind: c_int) -> c_int;
85+
pub fn pthread_mutexattr_gettype(attr: *const pthread_mutexattr_t, kind: *mut c_int) -> c_int;
86+
87+
// Condition variables
88+
pub fn pthread_cond_init(cond: *mut pthread_cond_t, attr: *const pthread_condattr_t) -> c_int;
89+
pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> c_int;
90+
pub fn pthread_cond_wait(cond: *mut pthread_cond_t, mutex: *mut pthread_mutex_t) -> c_int;
91+
pub fn pthread_cond_timedwait(
92+
cond: *mut pthread_cond_t,
93+
mutex: *mut pthread_mutex_t,
94+
abstime: *const timespec,
95+
) -> c_int;
96+
pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> c_int;
97+
pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> c_int;
98+
99+
// Condition variable attributes
100+
pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> c_int;
101+
pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> c_int;
102+
103+
// Thread-local storage
104+
pub fn pthread_key_create(
105+
key: *mut pthread_key_t,
106+
destructor: Option<extern "C" fn(*mut c_void)>,
107+
) -> c_int;
108+
pub fn pthread_key_delete(key: pthread_key_t) -> c_int;
109+
pub fn pthread_getspecific(key: pthread_key_t) -> *mut c_void;
110+
pub fn pthread_setspecific(key: pthread_key_t, value: *const c_void) -> c_int;
111+
112+
// One-time initialization
113+
pub fn pthread_once(once_control: *mut pthread_once_t, init_routine: extern "C" fn()) -> c_int;
114+
115+
// GNU extensions
116+
pub fn pthread_getname_np(thread: pthread_t, name: *mut c_char, len: size_t) -> c_int;
117+
118+
pub fn pthread_attr_setaffinity_np(
119+
attr: *mut pthread_attr_t,
120+
cpusetsize: size_t,
121+
cpuset: *const cpu_set_t,
122+
) -> c_int;
123+
124+
pub fn pthread_attr_getaffinity_np(
125+
attr: *mut pthread_attr_t,
126+
cpusetsize: size_t,
127+
cpuset: *mut cpu_set_t,
128+
) -> c_int;
129+
130+
// POSIX standard
131+
pub fn posix_memalign(memptr: *mut *mut c_void, alignment: size_t, size: size_t) -> c_int;
132+
}

src/new/qurt/semaphore.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//! Header: `semaphore.h`
2+
3+
use crate::prelude::*;
4+
5+
extern "C" {
6+
pub fn sem_init(sem: *mut sem_t, pshared: c_int, value: c_uint) -> c_int;
7+
pub fn sem_destroy(sem: *mut sem_t) -> c_int;
8+
pub fn sem_wait(sem: *mut sem_t) -> c_int;
9+
pub fn sem_trywait(sem: *mut sem_t) -> c_int;
10+
pub fn sem_post(sem: *mut sem_t) -> c_int;
11+
pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int;
12+
}

0 commit comments

Comments
 (0)