1 #![feature(const_raw_ptr_to_usize_cast)]
2 #![cfg_attr(feature = "rustc-dep-of-std", no_std)]
3 extern crate libc;
4 
5 use libc::c_void;
6 
7 extern "C" {
8 	fn _start();
9 	fn sys_get_processor_count() -> usize;
10 	fn sys_malloc(size: usize, align: usize) -> *mut u8;
11 	fn sys_realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8;
12 	fn sys_free(ptr: *mut u8, size: usize, align: usize);
13 	fn sys_notify(id: usize, count: i32) -> i32;
14 	fn sys_add_queue(id: usize, timeout_ns: i64) -> i32;
15 	fn sys_wait(id: usize) -> i32;
16 	fn sys_destroy_queue(id: usize) -> i32;
17 	fn sys_read(fd: i32, buf: *mut u8, len: usize) -> isize;
18 	fn sys_write(fd: i32, buf: *const u8, len: usize) -> isize;
19 	fn sys_close(fd: i32) -> i32;
20 	fn sys_sem_init(sem: *mut *const c_void, value: u32) -> i32;
21 	fn sys_sem_destroy(sem: *const c_void) -> i32;
22 	fn sys_sem_post(sem: *const c_void) -> i32;
23 	fn sys_sem_trywait(sem: *const c_void) -> i32;
24 	fn sys_sem_timedwait(sem: *const c_void, ms: u32) -> i32;
25 	fn sys_recmutex_init(recmutex: *mut *const c_void) -> i32;
26 	fn sys_recmutex_destroy(recmutex: *const c_void) -> i32;
27 	fn sys_recmutex_lock(recmutex: *const c_void) -> i32;
28 	fn sys_recmutex_unlock(recmutex: *const c_void) -> i32;
29 	fn sys_getpid() -> u32;
30 	fn sys_exit(arg: i32) -> !;
31 	fn sys_abort() -> !;
32 	fn sys_usleep(usecs: u64);
33 	fn sys_spawn(
34 		id: *mut Tid,
35 		func: extern "C" fn(usize),
36 		arg: usize,
37 		prio: u8,
38 		core_id: isize,
39 	) -> i32;
40 	fn sys_join(id: Tid) -> i32;
41 	fn sys_yield();
42 	fn sys_clock_gettime(clock_id: u64, tp: *mut timespec) -> i32;
43 	fn sys_open(name: *const i8, flags: i32, mode: i32) -> i32;
44 	fn sys_unlink(name: *const i8) -> i32;
45 }
46 
47 pub type Tid = u32;
48 
49 pub const NSEC_PER_SEC: u64 = 1_000_000_000;
50 pub const CLOCK_REALTIME: u64 = 1;
51 pub const CLOCK_MONOTONIC: u64 = 4;
52 pub const STDIN_FILENO: libc::c_int = 0;
53 pub const STDOUT_FILENO: libc::c_int = 1;
54 pub const STDERR_FILENO: libc::c_int = 2;
55 
56 /// returns true if this is a tty
57 pub fn isatty(_fd: libc::c_int) -> bool {
58 	false
59 }
60 
61 #[derive(Copy, Clone, Debug)]
62 #[repr(C)]
63 pub struct timespec {
64 	pub tv_sec: i64,
65 	pub tv_nsec: i64,
66 }
67 
68 pub unsafe fn call_start() {
69 	_start();
70 }
71 
72 #[inline(always)]
73 pub unsafe fn get_processor_count() -> usize {
74 	sys_get_processor_count()
75 }
76 
77 #[inline(always)]
78 pub unsafe fn malloc(size: usize, align: usize) -> *mut u8 {
79 	sys_malloc(size, align)
80 }
81 
82 #[inline(always)]
83 pub unsafe fn realloc(ptr: *mut u8, size: usize, align: usize, new_size: usize) -> *mut u8 {
84 	sys_realloc(ptr, size, align, new_size)
85 }
86 
87 #[inline(always)]
88 pub unsafe fn free(ptr: *mut u8, size: usize, align: usize) {
89 	sys_free(ptr, size, align)
90 }
91 
92 #[inline(always)]
93 pub unsafe fn notify(id: usize, count: i32) -> i32 {
94 	sys_notify(id, count)
95 }
96 
97 #[inline(always)]
98 pub unsafe fn add_queue(id: usize, timeout_ns: i64) -> i32 {
99 	sys_add_queue(id, timeout_ns)
100 }
101 
102 #[inline(always)]
103 pub unsafe fn wait(id: usize) -> i32 {
104 	sys_wait(id)
105 }
106 
107 #[inline(always)]
108 pub unsafe fn destroy_queue(id: usize) -> i32 {
109 	sys_destroy_queue(id)
110 }
111 
112 #[inline(always)]
113 pub unsafe fn read(fd: i32, buf: *mut u8, len: usize) -> isize {
114 	sys_read(fd, buf, len)
115 }
116 
117 #[inline(always)]
118 pub unsafe fn write(fd: i32, buf: *const u8, len: usize) -> isize {
119 	sys_write(fd, buf, len)
120 }
121 
122 #[inline(always)]
123 pub unsafe fn close(fd: i32) -> i32 {
124 	sys_close(fd)
125 }
126 
127 #[inline(always)]
128 pub unsafe fn sem_init(sem: *mut *const c_void, value: u32) -> i32 {
129 	sys_sem_init(sem, value)
130 }
131 
132 #[inline(always)]
133 pub unsafe fn sem_destroy(sem: *const c_void) -> i32 {
134 	sys_sem_destroy(sem)
135 }
136 
137 #[inline(always)]
138 pub unsafe fn sem_post(sem: *const c_void) -> i32 {
139 	sys_sem_post(sem)
140 }
141 
142 #[inline(always)]
143 pub unsafe fn sem_trywait(sem: *const c_void) -> i32 {
144 	sys_sem_trywait(sem)
145 }
146 
147 #[inline(always)]
148 pub unsafe fn sem_timedwait(sem: *const c_void, ms: u32) -> i32 {
149 	sys_sem_timedwait(sem, ms)
150 }
151 
152 #[inline(always)]
153 pub unsafe fn recmutex_init(recmutex: *mut *const c_void) -> i32 {
154 	sys_recmutex_init(recmutex)
155 }
156 
157 #[inline(always)]
158 pub unsafe fn recmutex_destroy(recmutex: *const c_void) -> i32 {
159 	sys_recmutex_destroy(recmutex)
160 }
161 
162 #[inline(always)]
163 pub unsafe fn recmutex_lock(recmutex: *const c_void) -> i32 {
164 	sys_recmutex_lock(recmutex)
165 }
166 
167 #[inline(always)]
168 pub unsafe fn recmutex_unlock(recmutex: *const c_void) -> i32 {
169 	sys_recmutex_unlock(recmutex)
170 }
171 
172 #[inline(always)]
173 pub unsafe fn getpid() -> u32 {
174 	sys_getpid()
175 }
176 
177 #[inline(always)]
178 pub unsafe fn exit(arg: i32) -> ! {
179 	sys_exit(arg)
180 }
181 
182 #[inline(always)]
183 pub unsafe fn abort() -> ! {
184 	sys_abort()
185 }
186 
187 #[inline(always)]
188 pub unsafe fn usleep(usecs: u64) {
189 	sys_usleep(usecs)
190 }
191 
192 #[inline(always)]
193 pub unsafe fn spawn(
194 	id: *mut Tid,
195 	func: extern "C" fn(usize),
196 	arg: usize,
197 	prio: u8,
198 	core_id: isize,
199 ) -> i32 {
200 	sys_spawn(id, func, arg, prio, core_id)
201 }
202 
203 #[inline(always)]
204 pub unsafe fn join(id: Tid) -> i32 {
205 	sys_join(id)
206 }
207 
208 #[inline(always)]
209 pub unsafe fn yield_now() {
210 	sys_yield()
211 }
212 
213 #[inline(always)]
214 pub unsafe fn clock_gettime(clock_id: u64, tp: *mut timespec) -> i32 {
215 	sys_clock_gettime(clock_id, tp)
216 }
217 
218 #[inline(always)]
219 pub unsafe fn open(name: *const i8, flags: i32, mode: i32) -> i32 {
220 	sys_open(name, flags, mode)
221 }
222 
223 #[inline(always)]
224 pub unsafe fn unlink(name: *const i8) -> i32 {
225 	sys_unlink(name)
226 }
227