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