| [1] | 1 | /* | 
|---|
| [407] | 2 |  * syscalls.h - Kernel side services for syscall handling. | 
|---|
| [1] | 3 |  *  | 
|---|
| [457] | 4 |  * Author     Alain Greiner (2016,2017,2018) | 
|---|
| [1] | 5 |  * | 
|---|
 | 6 |  * Copyright (c) UPMC Sorbonne Universites | 
|---|
 | 7 |  * | 
|---|
 | 8 |  * This file is part of ALMOS-MKH. | 
|---|
 | 9 |  * | 
|---|
 | 10 |  * ALMOS-MKH is free software; you can redistribute it and/or modify it | 
|---|
 | 11 |  * under the terms of the GNU General Public License as published by | 
|---|
 | 12 |  * the Free Software Foundation; version 2.0 of the License. | 
|---|
 | 13 |  * | 
|---|
 | 14 |  * ALMOS-MKH is distributed in the hope that it will be useful, but | 
|---|
 | 15 |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
 | 16 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
 | 17 |  * General Public License for more details. | 
|---|
 | 18 |  * | 
|---|
 | 19 |  * You should have received a copy of the GNU General Public License | 
|---|
 | 20 |  * along with ALMOS-MKH; if not, write to the Free Software Foundation, | 
|---|
 | 21 |  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 
|---|
 | 22 |  */ | 
|---|
 | 23 |  | 
|---|
| [16] | 24 | #ifndef _SYSCALLS_H_ | 
|---|
 | 25 | #define _SYSCALLS_H_ | 
|---|
| [1] | 26 |  | 
|---|
| [457] | 27 | #include <hal_kernel_types.h> | 
|---|
| [407] | 28 | #include <shared_syscalls.h> | 
|---|
| [23] | 29 |  | 
|---|
| [407] | 30 | /**   Forward declarations  *****/ | 
|---|
| [23] | 31 |  | 
|---|
 | 32 | struct thread_s;                  // defined in thread.h | 
|---|
 | 33 | struct pthread_attr_s;            // defined in thread.h | 
|---|
 | 34 | struct vfs_stat_s;                // defined in vfs.h | 
|---|
 | 35 | struct vfs_dirent_s;              // defined in vfs.h | 
|---|
 | 36 | struct mmap_attr_s;               // defined in vmm.h | 
|---|
 | 37 |  | 
|---|
| [407] | 38 | /******************************************************************************************  | 
|---|
 | 39 |  * [0] This function terminates the execution of the calling user thread,  | 
|---|
| [23] | 40 |  * and makes the exit_value pointer available to any successful pthread_join() with the  | 
|---|
 | 41 |  * terminating thread. | 
|---|
| [409] | 42 |  * It actually set the THREAD_SIG_EXIT signal, set the THREAD_BLOCKED_GLOBAL bit in the | 
|---|
 | 43 |  * thread descriptor and deschedule. | 
|---|
 | 44 |  * The thread will be detached from its process, and the memory allocated to the thread | 
|---|
 | 45 |  * descriptor will be released later by the scheduler. | 
|---|
| [407] | 46 |  ****************************************************************************************** | 
|---|
| [409] | 47 |  * @ exit_vallue  : pointer to be returned to joining thread if thread is attached. | 
|---|
 | 48 |  * @ return 0 if success / return -1 if all locks not released or illegal argument. | 
|---|
| [407] | 49 |  *****************************************************************************************/ | 
|---|
| [23] | 50 | int sys_thread_exit( void * exit_value ); | 
|---|
| [16] | 51 |  | 
|---|
| [407] | 52 | /******************************************************************************************  | 
|---|
 | 53 |  * [1] This function calls the scheduler for the core running the calling thread. | 
|---|
 | 54 |  ****************************************************************************************** | 
|---|
 | 55 |  * @ x_size   : [out] number of clusters in a row. | 
|---|
 | 56 |  * @ y_size   : [out] number of clusters in a column. | 
|---|
 | 57 |  * @ ncores   : [out] number of cores per cluster. | 
|---|
 | 58 |  * @ return always 0. | 
|---|
 | 59 |  *****************************************************************************************/ | 
|---|
| [479] | 60 | int sys_thread_yield( void ); | 
|---|
| [16] | 61 |  | 
|---|
| [407] | 62 | /******************************************************************************************  | 
|---|
| [23] | 63 |  * [2] This function creates a new user thread. The <user_attr> argument is a pointer | 
|---|
 | 64 |  * on astructure containing the thread attributes, defined in thread.h file. | 
|---|
| [407] | 65 |  ****************************************************************************************** | 
|---|
| [566] | 66 |  * @ trdid_ptr   : [out] pointer on buffer for created thread trdid. | 
|---|
| [23] | 67 |  * @ user_attr   : [in]  pointer on thread attributes structure. | 
|---|
 | 68 |  * @ start_func  : [in]  pointer on start function. | 
|---|
 | 69 |  * @ start_args  : [in]  pointer on start function arguments. | 
|---|
 | 70 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 71 |  *****************************************************************************************/ | 
|---|
| [566] | 72 | int sys_thread_create( trdid_t               * trdid_ptr, | 
|---|
 | 73 |                        struct pthread_attr_s * user_attr, | 
|---|
 | 74 |                        void                  * start_func, | 
|---|
 | 75 |                        void                  * start_args ); | 
|---|
| [16] | 76 |  | 
|---|
| [407] | 77 | /******************************************************************************************  | 
|---|
| [23] | 78 |  * [3] This blocking function suspend execution of the calling thread until completion  | 
|---|
 | 79 |  * of another target thread identified by the <trdid> argument. | 
|---|
| [421] | 80 |  * The target thread must be joinable (running in ATTACHED mode), and must be different | 
|---|
 | 81 |  * from the calling thread. | 
|---|
| [23] | 82 |  * If the <exit_value> argument is not NULL, the value passed to pthread_exit() by the  | 
|---|
 | 83 |  * target thread is stored in the location referenced by exit_value. | 
|---|
| [407] | 84 |  ****************************************************************************************** | 
|---|
| [23] | 85 |  * @ trdid     : [in]  target thread identifier. | 
|---|
 | 86 |  * @ thread    : [out] buffer for exit_value returned by target thread.  | 
|---|
 | 87 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 88 |  *****************************************************************************************/ | 
|---|
| [23] | 89 | int sys_thread_join( trdid_t    trdid, | 
|---|
 | 90 |                      void    ** exit_value ); | 
|---|
| [16] | 91 |  | 
|---|
| [407] | 92 | /******************************************************************************************  | 
|---|
| [23] | 93 |  * [4] This function detach a joinable thread. | 
|---|
| [407] | 94 |  ****************************************************************************************** | 
|---|
| [409] | 95 |  * @ trdid   : thread identifier. | 
|---|
| [23] | 96 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 97 |  *****************************************************************************************/ | 
|---|
| [23] | 98 | int sys_thread_detach( trdid_t  trdid ); | 
|---|
| [16] | 99 |  | 
|---|
| [407] | 100 | /******************************************************************************************  | 
|---|
| [409] | 101 |  * [5] This function requests a target thread identified by its <trdid> argument | 
|---|
| [436] | 102 |  * to be cancelled. It calls the thread_kill() function to block the target thread | 
|---|
 | 103 |  * on the THREAD_BLOCKED_GLOBAL condition, and to set the THREAD_FLAG_REQ_DELETE. | 
|---|
| [409] | 104 |  * The thread will be detached from its process, and the memory allocated to the thread | 
|---|
| [436] | 105 |  * descriptor will be released by the scheduler at the next scheduling point. | 
|---|
| [409] | 106 |  ****************************************************************************************** | 
|---|
 | 107 |  * @ trdid   : thread identifier. | 
|---|
 | 108 |  * @ return 0 if success / return -1 if illegal argument. | 
|---|
| [407] | 109 |  *****************************************************************************************/ | 
|---|
| [409] | 110 | int sys_thread_cancel( trdid_t  trdid ); | 
|---|
| [16] | 111 |  | 
|---|
| [407] | 112 | /******************************************************************************************  | 
|---|
| [23] | 113 |  * [6] This function implement all operations on a POSIX unnamed semaphore, | 
|---|
 | 114 |  * that can be shared by threads running in different clusters. | 
|---|
 | 115 |  * The kernel structure representing a remote semaphore is in the remote_sem.h file, | 
|---|
 | 116 |  * and the code implementing the operations is in the remore_sem.c file. | 
|---|
| [407] | 117 |  ****************************************************************************************** | 
|---|
| [457] | 118 |  * @ vaddr         : semaphore virtual address in user space == identifier. | 
|---|
 | 119 |  * @ operation     : SEM_INIT / SEM_DESTROY / SEM_GETVALUE / SEM_POST / SEM_WAIT. | 
|---|
 | 120 |  * @ init_value    : initial semaphore value. | 
|---|
 | 121 |  * @ current_value : pointer on buffer for current semaphore value. | 
|---|
| [23] | 122 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 123 |  *****************************************************************************************/ | 
|---|
| [23] | 124 | int sys_sem( void       * vaddr, | 
|---|
 | 125 |              uint32_t     operation, | 
|---|
| [457] | 126 |              uint32_t     init_value, | 
|---|
 | 127 |              uint32_t   * current_value ); | 
|---|
| [16] | 128 |  | 
|---|
| [407] | 129 | /******************************************************************************************  | 
|---|
| [23] | 130 |  * [7] This function implement all operations on a POSIX condition variable. | 
|---|
| [566] | 131 |  * The kernel structure representing a condvar is defined in the remote_condvar.h file, | 
|---|
 | 132 |  * The code implementing the operations is defined in the remote_condvar.c file. | 
|---|
| [407] | 133 |  ****************************************************************************************** | 
|---|
| [23] | 134 |  * @ vaddr     : condvar virtual address in user space == identifier. | 
|---|
 | 135 |  * @ operation : operation type (see below). | 
|---|
 | 136 |  * @ attr      : mutex virtual address in user space == identifier. | 
|---|
 | 137 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 138 |  *****************************************************************************************/ | 
|---|
| [23] | 139 | int sys_condvar( void     * condvar, | 
|---|
 | 140 |                  uint32_t   operation, | 
|---|
 | 141 |                  void     * mutex ); | 
|---|
| [16] | 142 |  | 
|---|
| [407] | 143 | /******************************************************************************************  | 
|---|
| [23] | 144 |  * [8] This function implement all operations on a POSIX barrier. | 
|---|
 | 145 |  * The kernel structure representing a barrier is defined in the remote_barrier.h file. | 
|---|
 | 146 |  * The code implementting the operations is defined in the remote_barrier.c file. | 
|---|
| [407] | 147 |  ****************************************************************************************** | 
|---|
| [23] | 148 |  * @ vaddr     : barrier virtual address in user space == identifier. | 
|---|
 | 149 |  * @ operation : BARRIER_INIT / BARRIER_DESTROY / BARRIER_WAIT. | 
|---|
 | 150 |  * @ count     : number of expected threads (only used by BARRIER_INIT operation). | 
|---|
 | 151 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 152 |  *****************************************************************************************/ | 
|---|
| [23] | 153 | int sys_barrier( void     * vaddr, | 
|---|
 | 154 |                  uint32_t   operation, | 
|---|
 | 155 |                  uint32_t   count ); | 
|---|
| [16] | 156 |  | 
|---|
| [407] | 157 | /******************************************************************************************  | 
|---|
| [23] | 158 |  * [9] This function implement all operations on a POSIX mutex. | 
|---|
 | 159 |  * The kernel structure representing a barrier is defined in the remote_barrier.h file. | 
|---|
 | 160 |  * The code implementting the operations is defined in the remote_barrier.c file. | 
|---|
| [407] | 161 |  ****************************************************************************************** | 
|---|
| [23] | 162 |  * @ vaddr     : mutex virtual address in user space == identifier. | 
|---|
 | 163 |  * @ operation : MUTEX_INIT / MUTEX_DESTROY / MUTEX_LOCK / MUTEX_UNLOCK | 
|---|
 | 164 |  * @ attr      : mutex attributes (non supported yet => must be 0). | 
|---|
 | 165 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 166 |  *****************************************************************************************/ | 
|---|
| [23] | 167 | int sys_mutex( void     * vaddr, | 
|---|
 | 168 |                uint32_t   operation, | 
|---|
 | 169 |                uint32_t   count ); | 
|---|
| [16] | 170 |  | 
|---|
| [407] | 171 | /******************************************************************************************  | 
|---|
| [408] | 172 |  * [10] This function implement the exit system call terminating a POSIX process. | 
|---|
| [440] | 173 |  * It can be called by any thread running in any cluster. | 
|---|
| [443] | 174 |  * It uses both remote accesses to access the owner process descriptor, and the | 
|---|
 | 175 |  * RPC_PROCESS_SIGACTION to delete remote process and thread descriptors. | 
|---|
| [433] | 176 |  * In the present implementation, this function implements actually the _exit(): | 
|---|
| [440] | 177 |  * - it does not flush open output streams. | 
|---|
| [433] | 178 |  * - it does not close open streams. | 
|---|
| [407] | 179 |  ****************************************************************************************** | 
|---|
| [408] | 180 |  * @ status   : terminaison status (not used in present implementation). | 
|---|
| [407] | 181 |  *****************************************************************************************/ | 
|---|
| [409] | 182 | int sys_exit( uint32_t status ); | 
|---|
| [16] | 183 |  | 
|---|
| [407] | 184 | /******************************************************************************************  | 
|---|
| [408] | 185 |  * [11] This function remove an existing mapping defined by the <addr> and <size> | 
|---|
| [407] | 186 |  * arguments in user space. | 
|---|
 | 187 |  ****************************************************************************************** | 
|---|
 | 188 |  * @ addr  : base address in user space. | 
|---|
 | 189 |  * # size  : number of bytes. | 
|---|
| [23] | 190 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 191 |  *****************************************************************************************/ | 
|---|
 | 192 | int sys_munmap( void     * addr, | 
|---|
 | 193 |                 uint32_t   size ); | 
|---|
| [16] | 194 |  | 
|---|
| [407] | 195 | /******************************************************************************************  | 
|---|
 | 196 |  * [12] This function open or create an open file descriptor. | 
|---|
 | 197 |  ****************************************************************************************** | 
|---|
| [23] | 198 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
| [445] | 199 |  * @ flags      : bit vector attributes (see in shared_fcntl.h file) | 
|---|
| [23] | 200 |  * @ mode       : access rights. | 
|---|
 | 201 |  * @ return file descriptor index in fd_array if success / return -1 if failure. | 
|---|
| [407] | 202 |  *****************************************************************************************/ | 
|---|
| [566] | 203 | int sys_open( char       * pathname, | 
|---|
| [506] | 204 |               uint32_t     flags, | 
|---|
 | 205 |               uint32_t     mode ); | 
|---|
| [16] | 206 |  | 
|---|
| [407] | 207 | /******************************************************************************************  | 
|---|
 | 208 |  * [13] This function map physical memory (or a file) in the calling thread virtual space. | 
|---|
 | 209 |  * The <attr> argument is a pointer on a structure for arguments (see shared_syscalls.h). | 
|---|
| [594] | 210 |  * The user defined virtual address (MAP_FIXED flag) is not supported. | 
|---|
 | 211 |  * TODO : the access rights checking is not implemented yet [AG] | 
|---|
 | 212 |  * TODO : the Copy on Write for MAP_PRIVATE is not implemented yet [AG] | 
|---|
| [407] | 213 |  ****************************************************************************************** | 
|---|
 | 214 |  * @ attr       : pointer on attributes structure. | 
|---|
 | 215 |  * @ return 0 if success / return -1 if failure. | 
|---|
 | 216 |  *****************************************************************************************/ | 
|---|
 | 217 | int sys_mmap( mmap_attr_t * attr ); | 
|---|
| [23] | 218 |  | 
|---|
| [407] | 219 | /******************************************************************************************  | 
|---|
| [23] | 220 |  * [14] This function read bytes from an open file identified by its file descriptor. | 
|---|
| [407] | 221 |  * The file can be a regular file or character oriented device. | 
|---|
| [408] | 222 |  * IRQs are enabled during this system call. | 
|---|
| [407] | 223 |  ****************************************************************************************** | 
|---|
| [23] | 224 |  * @ file_id  : open file index in fd_array. | 
|---|
 | 225 |  * @ buf      : buffer virtual address in user space. | 
|---|
 | 226 |  * @ count    : number of bytes. | 
|---|
 | 227 |  * @ return number of bytes actually read if success / returns -1 if failure. | 
|---|
| [407] | 228 |  *****************************************************************************************/ | 
|---|
| [23] | 229 | int sys_read( uint32_t   file_id, | 
|---|
 | 230 |               void     * buf, | 
|---|
 | 231 |               uint32_t   count ); | 
|---|
| [16] | 232 |  | 
|---|
| [407] | 233 | /******************************************************************************************  | 
|---|
| [23] | 234 |  * [15] This function writes bytes to an open file identified by its file descriptor. | 
|---|
| [407] | 235 |  * The file can be a regular file or character oriented device. | 
|---|
| [408] | 236 |  * IRQs are enabled during this system call. | 
|---|
| [407] | 237 |  ****************************************************************************************** | 
|---|
| [23] | 238 |  * @ file_id  : open file index in fd_array. | 
|---|
 | 239 |  * @ buf      : buffer virtual address in user space. | 
|---|
 | 240 |  * @ count    : number of bytes. | 
|---|
 | 241 |  * @ return number of bytes actually written if success / returns -1 if failure. | 
|---|
| [407] | 242 |  *****************************************************************************************/ | 
|---|
| [23] | 243 | int sys_write( uint32_t   file_id, | 
|---|
 | 244 |                void     * buf, | 
|---|
 | 245 |                uint32_t   count ); | 
|---|
| [16] | 246 |  | 
|---|
| [407] | 247 | /******************************************************************************************  | 
|---|
 | 248 |  * [16] This function repositions the offset of the file descriptor identified by <file_id>, | 
|---|
 | 249 |  * according to the operation type defined by the <whence> argument. | 
|---|
 | 250 |  ****************************************************************************************** | 
|---|
| [23] | 251 |  * @ file_id  : open file index in fd_array. | 
|---|
| [407] | 252 |  * @ offset   : used to compute new offset value. | 
|---|
| [23] | 253 |  * @ whence   : operation type (see below). | 
|---|
 | 254 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 255 |  *****************************************************************************************/ | 
|---|
| [23] | 256 | int sys_lseek( xptr_t    file_id, | 
|---|
 | 257 |                uint32_t  offset, | 
|---|
 | 258 |                uint32_t  whence ); | 
|---|
| [16] | 259 |  | 
|---|
| [407] | 260 | /******************************************************************************************  | 
|---|
| [23] | 261 |  * [17] This function release the memory allocated for the file descriptor identified by  | 
|---|
 | 262 |  * the <file_id> argument, and remove the fd array_entry in all copies of the process  | 
|---|
 | 263 |  * descriptor. | 
|---|
| [407] | 264 |  ****************************************************************************************** | 
|---|
| [23] | 265 |   file_id   : file descriptor index in fd_array. | 
|---|
 | 266 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 267 |  *****************************************************************************************/ | 
|---|
| [23] | 268 | int sys_close( uint32_t file_id ); | 
|---|
| [16] | 269 |  | 
|---|
| [407] | 270 | /******************************************************************************************  | 
|---|
 | 271 |  * [18] This function removes a directory entry identified by the <pathname> from the | 
|---|
| [23] | 272 |  * directory, and decrement the link count of the file referenced by the link. | 
|---|
 | 273 |  * If the link count reduces to zero, and no process has the file open, then all resources | 
|---|
 | 274 |  * associated with the file are reclaimed.  If one or more process have the file open when | 
|---|
 | 275 |  * the last link is removed, the link is removed, but the removal of the file is delayed  | 
|---|
 | 276 |  * until all references to it have been closed. | 
|---|
| [407] | 277 |  ****************************************************************************************** | 
|---|
| [23] | 278 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 279 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 280 |  *****************************************************************************************/ | 
|---|
| [566] | 281 | int sys_unlink( char * pathname ); | 
|---|
| [16] | 282 |  | 
|---|
| [407] | 283 | /******************************************************************************************  | 
|---|
| [23] | 284 |  * [19] This function creates in the calling thread cluster an unnamed pipe, and two | 
|---|
 | 285 |  * (read and write) file descriptors. | 
|---|
| [594] | 286 |  * TODO not implemented yet [AG] | 
|---|
| [407] | 287 |  ****************************************************************************************** | 
|---|
| [23] | 288 |  * @ file_id[0] : [out] read only file descriptor index. | 
|---|
 | 289 |  * @ file_id[1] : [out] write only file descriptor index. | 
|---|
 | 290 |  * @ return 0 if success / return -1 if failure. | 
|---|
| [407] | 291 |  *****************************************************************************************/ | 
|---|
| [23] | 292 | int sys_pipe( uint32_t file_id[2] ); | 
|---|
| [16] | 293 |  | 
|---|
| [407] | 294 | /******************************************************************************************  | 
|---|
| [23] | 295 |  * [20] This function change the current working directory in reference process descriptor. | 
|---|
| [407] | 296 |  ****************************************************************************************** | 
|---|
| [23] | 297 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 298 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 299 |  *****************************************************************************************/ | 
|---|
| [566] | 300 | int sys_chdir( char * pathname ); | 
|---|
| [16] | 301 |  | 
|---|
| [407] | 302 | /******************************************************************************************  | 
|---|
| [23] | 303 |  * [21] This function creates a new directory in file system. | 
|---|
| [407] | 304 |  ****************************************************************************************** | 
|---|
| [23] | 305 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 306 |  * @ mode       : access rights (as defined in chmod). | 
|---|
 | 307 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 308 |  *****************************************************************************************/ | 
|---|
| [279] | 309 | int sys_mkdir( char    * pathname, | 
|---|
| [23] | 310 |                uint32_t  mode ); | 
|---|
| [16] | 311 |  | 
|---|
| [407] | 312 | /******************************************************************************************  | 
|---|
| [23] | 313 |  * [22] This function creates a named FIFO file in the calling thread cluster. | 
|---|
 | 314 |  * The associated read and write file descriptors mut be be  explicitely created | 
|---|
| [407] | 315 |  * using the sys_open() function. | 
|---|
 | 316 |  ****************************************************************************************** | 
|---|
| [23] | 317 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 318 |  * @ mode       : access rights (as defined in chmod). | 
|---|
 | 319 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 320 |  *****************************************************************************************/ | 
|---|
| [23] | 321 | int sys_mkfifo( char     * pathname, | 
|---|
 | 322 |                 uint32_t   mode ); | 
|---|
| [16] | 323 |  | 
|---|
| [407] | 324 | /******************************************************************************************  | 
|---|
 | 325 |  * [23] This function open a directory, that must exist in the file system, returning  | 
|---|
 | 326 |  * a DIR pointer on the directory in user space. | 
|---|
 | 327 |  ****************************************************************************************** | 
|---|
| [23] | 328 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
| [407] | 329 |  * @ dirp       : [out] buffer for pointer on user directory (DIR). | 
|---|
| [23] | 330 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 331 |  *****************************************************************************************/ | 
|---|
 | 332 | int sys_opendir( char * pathname, | 
|---|
 | 333 |                  DIR ** dirp ); | 
|---|
| [16] | 334 |  | 
|---|
| [407] | 335 | /******************************************************************************************  | 
|---|
 | 336 |  * [24] This function returns an user pointer on the dirent structure describing the | 
|---|
 | 337 |  * next directory entry in the directory identified by the <dirp> argument. | 
|---|
 | 338 |  ****************************************************************************************** | 
|---|
 | 339 |  * @ dirp     : user pointer identifying the searched directory. | 
|---|
 | 340 |  * @ dentp    : [out] buffer for pointer on user direntory entry (dirent). | 
|---|
 | 341 |  * @ return O if success / returns -1 if failure. | 
|---|
 | 342 |  *****************************************************************************************/ | 
|---|
 | 343 | int sys_readdir( DIR            * dirp, | 
|---|
 | 344 |                  struct dirent ** dentp ); | 
|---|
 | 345 |  | 
|---|
 | 346 | /******************************************************************************************  | 
|---|
 | 347 |  * [25] This function closes the directory identified by the <dirp> argument, and releases | 
|---|
 | 348 |  * all structures associated with the <dirp> pointer. | 
|---|
 | 349 |  ****************************************************************************************** | 
|---|
 | 350 |  * @ dirp     : user pointer identifying the directory. | 
|---|
| [23] | 351 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 352 |  *****************************************************************************************/ | 
|---|
 | 353 | int sys_closedir( DIR * dirp ); | 
|---|
| [16] | 354 |  | 
|---|
| [407] | 355 | /******************************************************************************************  | 
|---|
| [23] | 356 |  * [26] This function returns the pathname of the current working directory. | 
|---|
| [407] | 357 |  ****************************************************************************************** | 
|---|
| [23] | 358 |  * buf     : buffer addres in user space. | 
|---|
 | 359 |  * nbytes  : user buffer size in bytes. | 
|---|
 | 360 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 361 |  *****************************************************************************************/ | 
|---|
| [23] | 362 | int sys_getcwd( char     * buf, | 
|---|
 | 363 |                 uint32_t   nbytes ); | 
|---|
| [16] | 364 |  | 
|---|
| [407] | 365 | /******************************************************************************************  | 
|---|
| [437] | 366 |  * [27] This function tests whether a given file descriptor dentified by the <file_id> | 
|---|
 | 367 |  * argument is an open file descriptor referring to a terminal. | 
|---|
 | 368 |  ****************************************************************************************** | 
|---|
 | 369 |  * @ file_id   : file descriptor index | 
|---|
 | 370 |  * @ return 1 if it is a TXT device / return 0 if it is not a TXT device. | 
|---|
| [407] | 371 |  *****************************************************************************************/ | 
|---|
| [437] | 372 | int sys_isatty( uint32_t file_id ); | 
|---|
| [16] | 373 |  | 
|---|
| [407] | 374 | /******************************************************************************************  | 
|---|
| [23] | 375 |  * [28] This function forces the calling thread to sleep, for a fixed number of cycles. | 
|---|
| [407] | 376 |  ****************************************************************************************** | 
|---|
| [23] | 377 |  * cycles   : number of cycles. | 
|---|
| [407] | 378 |  *****************************************************************************************/ | 
|---|
| [23] | 379 | int sys_alarm( uint32_t cycles ); | 
|---|
| [16] | 380 |  | 
|---|
| [407] | 381 | /******************************************************************************************  | 
|---|
 | 382 |  * [29] This function removes a directory file whose name is given by <pathname>. | 
|---|
 | 383 |  * The directory must not have any entries other than `.' and `..'. | 
|---|
 | 384 |  ****************************************************************************************** | 
|---|
| [23] | 385 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 386 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 387 |  *****************************************************************************************/ | 
|---|
| [566] | 388 | int sys_rmdir( char * pathname ); | 
|---|
| [16] | 389 |  | 
|---|
| [407] | 390 | /******************************************************************************************  | 
|---|
| [23] | 391 |  * [30] This function implement the operations related to User Thread Local Storage. | 
|---|
 | 392 |  * It is actually implemented as an uint32_t variable in the thread descriptor. | 
|---|
| [407] | 393 |  ****************************************************************************************** | 
|---|
| [23] | 394 |  * @ operation  : UTLS operation type as defined below. | 
|---|
 | 395 |  * @ value      : argument value for the UTLS_SET operation. | 
|---|
 | 396 |  * @ return value for the UTLS_GET and UTLS_GET_ERRNO / return -1 if failure. | 
|---|
| [407] | 397 |  *****************************************************************************************/ | 
|---|
| [23] | 398 | int sys_utls( uint32_t operation, | 
|---|
 | 399 |               uint32_t value ); | 
|---|
| [16] | 400 |  | 
|---|
| [407] | 401 | /******************************************************************************************  | 
|---|
| [23] | 402 |  * [31] This function change the acces rights for the file/dir identified by the | 
|---|
 | 403 |  * pathname argument. | 
|---|
| [407] | 404 |  ****************************************************************************************** | 
|---|
| [23] | 405 |  * @ pathname   : pathname (can be relative or absolute). | 
|---|
 | 406 |  * @ rights     : acces rights. | 
|---|
 | 407 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 408 |  *****************************************************************************************/ | 
|---|
| [566] | 409 | int sys_chmod( char       * pathname, | 
|---|
| [506] | 410 |                uint32_t     rights ); | 
|---|
| [16] | 411 |  | 
|---|
| [407] | 412 | /******************************************************************************************  | 
|---|
| [23] | 413 |  * [32] This function associate a specific signal handler to a given signal type. | 
|---|
| [584] | 414 |  * The handlers for the SIGKILL and SIGSTOP signals cannot be redefined. | 
|---|
| [407] | 415 |  ******************************************************************************************  | 
|---|
| [23] | 416 |  * @ sig_id    : index defining signal type (from 1 to 31). | 
|---|
 | 417 |  * @ handler   : pointer on fonction implementing the specific handler. | 
|---|
 | 418 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 419 |  *****************************************************************************************/ | 
|---|
| [23] | 420 | int sys_signal( uint32_t   sig_id, | 
|---|
 | 421 |                 void     * handler ); | 
|---|
| [16] | 422 |  | 
|---|
| [407] | 423 | /******************************************************************************************  | 
|---|
| [23] | 424 |  * [33] This function returns in the structure <tv>, defined in the time.h file, | 
|---|
 | 425 |  * the current time (in seconds & micro-seconds). | 
|---|
 | 426 |  * It is computed from the calling core descriptor. | 
|---|
 | 427 |  * The timezone is not supported. | 
|---|
| [407] | 428 |  ****************************************************************************************** | 
|---|
| [23] | 429 |  * @ tv      : pointer on the timeval structure. | 
|---|
 | 430 |  * @ tz      : pointer on the timezone structure : must be NULL.        | 
|---|
 | 431 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 432 |  *****************************************************************************************/ | 
|---|
| [50] | 433 | int sys_timeofday( struct timeval  * tv, | 
|---|
 | 434 |                    struct timezone * tz ); | 
|---|
| [16] | 435 |  | 
|---|
| [407] | 436 | /******************************************************************************************  | 
|---|
| [433] | 437 |  * [34] This function implements the "kill" system call on the kernel side. | 
|---|
| [23] | 438 |  * It register the signal defined by the <sig_id> argument in all thread descriptors  | 
|---|
 | 439 |  * of a target process identified by the <pid> argument. This is done in all clusters | 
|---|
 | 440 |  * containing threads for the target process. | 
|---|
 | 441 |  * It can be executed by any thread running in any cluster, as this function uses | 
|---|
| [407] | 442 |  * remote access to traverse the list of process copies stored in the owner cluster, | 
|---|
| [23] | 443 |  * and the RPC_SIGNAL_RISE to signal the remote threads.  | 
|---|
| [421] | 444 |  * This function does nothing for (sig_id == 0). This can be used to check process pid. | 
|---|
 | 445 |  * TODO : This first implementation supports only SIGKILL / SIGSTOP / SIGCONT values. | 
|---|
| [407] | 446 |  ******************************************************************************************  | 
|---|
| [16] | 447 |  * @ pid      : target process identifier. | 
|---|
| [433] | 448 |  * @ sig_id   : index defining the signal type.  | 
|---|
| [23] | 449 |  * @ return 0 if success / returns -1 if failure. | 
|---|
| [407] | 450 |  *****************************************************************************************/ | 
|---|
| [16] | 451 | int sys_kill( pid_t    pid, | 
|---|
| [23] | 452 |               uint32_t sig_id ); | 
|---|
| [16] | 453 |  | 
|---|
| [407] | 454 | /******************************************************************************************  | 
|---|
| [433] | 455 |  * [35] This function implements the "getpid" system call on the kernel side. | 
|---|
| [407] | 456 |  ******************************************************************************************  | 
|---|
 | 457 |  * @ returns the process PID for the calling thread. | 
|---|
 | 458 |  *****************************************************************************************/ | 
|---|
| [479] | 459 | int sys_getpid( void ); | 
|---|
| [1] | 460 |  | 
|---|
| [407] | 461 | /******************************************************************************************  | 
|---|
| [433] | 462 |  * [36] This function implement the "fork" system call on the kernel side. | 
|---|
 | 463 |  * The calling process descriptor (parent process), and the associated thread descriptor | 
|---|
 | 464 |  * are replicated in a - likely - remote cluster, that becomes the child process owner.  | 
|---|
 | 465 |  * The child process get a new PID, and is linked to the parent PID. The child process  | 
|---|
 | 466 |  * inherit from its parent the memory image, and all open files (including the TXT). | 
|---|
 | 467 |  * The child process becomes the TXT terminal owner. | 
|---|
| [1] | 468 |  * The target cluster depends on the "fork_user" flag and "fork_cxy" variable that can be | 
|---|
 | 469 |  * stored in the calling thread descriptor by the specific fork_place() system call. | 
|---|
| [433] | 470 |  * If not, the kernel function makes a query to the DQDT to select the target cluster.  | 
|---|
| [407] | 471 |  ******************************************************************************************  | 
|---|
 | 472 |  * @ if success, returns child process PID to parent, and return O to child. | 
|---|
 | 473 |  * @ if failure, returns -1 to parent / no child process is created. | 
|---|
 | 474 |  *****************************************************************************************/ | 
|---|
| [479] | 475 | int sys_fork( void ); | 
|---|
| [1] | 476 |  | 
|---|
| [407] | 477 | /******************************************************************************************  | 
|---|
| [433] | 478 |  * [37] This function implement the "exec" system call on the kernel side. | 
|---|
 | 479 |  * It creates, in the same cluster as the calling thread, a new process descriptor, | 
|---|
 | 480 |  * and a new associated main thread descriptor, executing a new memory image defined  | 
|---|
 | 481 |  * by the <filename> argument. This new process inherit from the old process the PID | 
|---|
 | 482 |  * and the PPID, as well as all open files (including the TXT).  | 
|---|
 | 483 |  * The old process descriptor, and all its threads are blocked, and marked for deletion. | 
|---|
 | 484 |  * Therefore the exec syscall does not return to the calling thread in case of success. | 
|---|
 | 485 |  * This function build an exec_info_t structure containing the new process arguments, | 
|---|
 | 486 |  * as defined by the <arv> argument, and the new process environment variables,  | 
|---|
 | 487 |  * as defined by the <envp>  argument. | 
|---|
 | 488 |  * TODO : the <argv> and <envp> arguments are not supported yet (both must be NULL). | 
|---|
| [407] | 489 |  ******************************************************************************************  | 
|---|
 | 490 |  * @ filename : string pointer on .elf filename (pointer in user space) | 
|---|
 | 491 |  * @ argv     : array of strings on process arguments (pointers in user space) | 
|---|
 | 492 |  * @ envp     : array of strings on environment variables (pointers in user space) | 
|---|
| [433] | 493 |  * @ does not return if success / returns -1 if failure. | 
|---|
| [407] | 494 |  *****************************************************************************************/ | 
|---|
| [566] | 495 | int sys_exec( char  * filename, | 
|---|
 | 496 |               char ** argv, | 
|---|
 | 497 |               char ** envp ); | 
|---|
| [1] | 498 |  | 
|---|
| [407] | 499 | /******************************************************************************************  | 
|---|
 | 500 |  * [38] This function  returns in the <stat> structure, defined in the "shared_syscalls.h"  | 
|---|
 | 501 |  * file, various informations on the file/directory identified by the <pathname> argument. | 
|---|
| [594] | 502 |  * TODO only the <st_ino>, <st_mode>,<st_uid>,<st_gid>,<st_size> are set. | 
|---|
| [407] | 503 |  ******************************************************************************************  | 
|---|
 | 504 |  * @ pathname  : user pointer on file pathname. | 
|---|
 | 505 |  * @ stat      : user pointer on the stat structure. | 
|---|
| [23] | 506 |  * @ returns O if success / returns -1 if failure. | 
|---|
| [407] | 507 |  *****************************************************************************************/ | 
|---|
| [566] | 508 | int sys_stat( char        * pathname, | 
|---|
| [407] | 509 |               struct stat * stat ); | 
|---|
| [1] | 510 |  | 
|---|
| [407] | 511 | /******************************************************************************************  | 
|---|
| [433] | 512 |  * [39] This blocking function waits a change of a child process state, that can be: | 
|---|
 | 513 |  * - a termination of child following a process_make_exit(). | 
|---|
 | 514 |  * - a termination of child following a process_make_kill(). | 
|---|
| [421] | 515 |  * - a blocking of child following a SIGSTOP signal. | 
|---|
| [433] | 516 |  * In case of a multi-thread process, this function must be called by the main thread | 
|---|
 | 517 |  * runningin the reference cluster. | 
|---|
 | 518 |  * When a change has been observed, it returns the PID of the child process, and stores | 
|---|
 | 519 |  * in the <status> argument relevant information on the child state change. | 
|---|
| [421] | 520 |  * The following macros can be used to extract information from status: | 
|---|
 | 521 |  * - WIFEXITED(status)   : is true if the child process terminated with an exit(). | 
|---|
| [435] | 522 |  * - WIFSIGNALED(status) : is true if the child process killed by a signal. | 
|---|
| [421] | 523 |  * - WIFSTOPPED(status)  : is true if the child process is stopped by a signal. | 
|---|
 | 524 |  * - WEXITSTATUS(status) : returns the low-order 8 bits of the exit() argument. | 
|---|
 | 525 |  * If a parent process terminates without waiting for all child processes to terminate, | 
|---|
 | 526 |  * the remaining child processes are attached to the init process. | 
|---|
| [433] | 527 |  * WARNING: negative values for the <pid> argument are not supported. | 
|---|
| [421] | 528 |  ****************************************************************************************** | 
|---|
| [433] | 529 |  * @ searched_pid : searched child process identifier. | 
|---|
 | 530 |  * @ status       : [out] child termination status. | 
|---|
 | 531 |  * @ return child PID if success / return -1 if searched PID not found. | 
|---|
| [407] | 532 |  *****************************************************************************************/ | 
|---|
| [421] | 533 | int sys_wait( uint32_t * status ); | 
|---|
| [1] | 534 |  | 
|---|
| [407] | 535 | /******************************************************************************************  | 
|---|
| [584] | 536 |  * [40] This function implement the non-standard get_config() syscall. | 
|---|
 | 537 |  * It returns in <x_size>, <y_size>, <ncores> the hardware platform parameters. | 
|---|
| [407] | 538 |  ****************************************************************************************** | 
|---|
 | 539 |  * @ x_size   : [out] number of clusters in a row. | 
|---|
 | 540 |  * @ y_size   : [out] number of clusters in a column. | 
|---|
 | 541 |  * @ ncores   : [out] number of cores per cluster. | 
|---|
 | 542 |  * @ return 0 if success / return -1 if illegal arguments | 
|---|
 | 543 |  *****************************************************************************************/ | 
|---|
 | 544 | int sys_get_config( uint32_t * x_size, | 
|---|
 | 545 |                     uint32_t * y_size, | 
|---|
 | 546 |                     uint32_t * ncores ); | 
|---|
| [1] | 547 |  | 
|---|
| [407] | 548 | /******************************************************************************************  | 
|---|
| [584] | 549 |  * [41] This function implements the non-standard get_core() syscall. | 
|---|
 | 550 |  * It returns in <cxy> and <lid> the calling core cluster and local index. | 
|---|
| [407] | 551 |  ****************************************************************************************** | 
|---|
 | 552 |  * @ cxy      : [out] cluster identifier (fixed format) | 
|---|
 | 553 |  * @ lid      : [out] core local index in cluster. | 
|---|
 | 554 |  * @ return 0 if success / return -1 if illegal arguments | 
|---|
 | 555 |  *****************************************************************************************/ | 
|---|
 | 556 | int sys_get_core( uint32_t * cxy, | 
|---|
 | 557 |                   uint32_t * lid ); | 
|---|
| [1] | 558 |  | 
|---|
| [407] | 559 | /******************************************************************************************  | 
|---|
| [584] | 560 |  * [42] This function implements the non-standard get_cycle() syscall. | 
|---|
 | 561 |  * It returns in a 64 bits user buffer the calling core cycles count. | 
|---|
| [407] | 562 |  * It uses both the hardware register and the core descriptor cycles count to take | 
|---|
 | 563 |  * into account a possible harware register overflow  in 32 bits architectures. | 
|---|
 | 564 |  ****************************************************************************************** | 
|---|
 | 565 |  * cycle    : [out] address of buffer in user space. | 
|---|
 | 566 |  * @ return 0 if success / return -1 if illegal arguments | 
|---|
 | 567 |  *****************************************************************************************/ | 
|---|
 | 568 | int sys_get_cycle( uint64_t * cycle ); | 
|---|
 | 569 |  | 
|---|
 | 570 | /******************************************************************************************  | 
|---|
| [421] | 571 |  * [43] This debug function displays on the kernel terminal TXT0 an user defined string, | 
|---|
 | 572 |  * or the current state of a kernel structure, identified by the <type> argument. | 
|---|
| [435] | 573 |  * The <arg0> and <arg1> arguments depends on the structure type: | 
|---|
 | 574 |  * - DISPLAY_STRING          : an user defined string | 
|---|
 | 575 |  * - DISPLAY_VMM             : VSL and GPT for a process identified by <pid>. | 
|---|
 | 576 |  * - DISPLAY_SCHED           : all threads allocated to a scheduler <cxy> & <lid>. | 
|---|
 | 577 |  * - DISPLAY_CLUSTER_PROCESS : all processes registered in a cluster identified by <cxy>.   | 
|---|
 | 578 |  * - DISPLAY_TXT_PROCESS     : all processes registered in a cluster identified by <cxy>.   | 
|---|
 | 579 |  * - DISPLAY_VFS             : all files registered in the VFS cache.  | 
|---|
 | 580 |  * - DISPLAY_CHDEV           : all registered channel devices. | 
|---|
| [445] | 581 |  * - DISPLAY_DQDT            : all DQDT nodes. | 
|---|
| [407] | 582 |  ****************************************************************************************** | 
|---|
| [435] | 583 |  * type      : [in] type of display  | 
|---|
| [421] | 584 |  * arg0      : [in] type dependant argument. | 
|---|
 | 585 |  * arg1      : [in] type dependant argument. | 
|---|
| [407] | 586 |  * @ return 0 if success / return -1 if illegal arguments | 
|---|
 | 587 |  *****************************************************************************************/ | 
|---|
| [421] | 588 | int sys_display( reg_t  type, | 
|---|
 | 589 |                  reg_t  arg0, | 
|---|
 | 590 |                  reg_t  arg1 ); | 
|---|
| [407] | 591 |  | 
|---|
 | 592 | /******************************************************************************************  | 
|---|
| [584] | 593 |  * [44] This function implements the non-standard place_fork() syscall. | 
|---|
 | 594 |  * It can be used to specify the target cluster <cxy> for a new process created | 
|---|
 | 595 |  * by a subsequent fork() syscall. | 
|---|
 | 596 |  * WARNING: it must be called before each fork() syscall, as the placement specification | 
|---|
 | 597 |  *          is reset by the fork syscall.  | 
|---|
| [457] | 598 |  ****************************************************************************************** | 
|---|
 | 599 |  * @ cxy    : cluster identifier. | 
|---|
 | 600 |  * @ return 0 if success / return -1 if failure. | 
|---|
 | 601 |  *****************************************************************************************/ | 
|---|
| [584] | 602 | int sys_place_fork( uint32_t cxy ); | 
|---|
| [457] | 603 |  | 
|---|
 | 604 | /******************************************************************************************  | 
|---|
| [407] | 605 |  * [45] This function block the calling thread on the THREAD_BLOCKED_GLOBAL condition, | 
|---|
 | 606 |  * and deschedule. | 
|---|
 | 607 |  ****************************************************************************************** | 
|---|
 | 608 |  * @ return 0 if success / returns -1 if failure. | 
|---|
 | 609 |  *****************************************************************************************/ | 
|---|
| [479] | 610 | int sys_thread_sleep( void ); | 
|---|
| [407] | 611 |  | 
|---|
 | 612 | /******************************************************************************************  | 
|---|
 | 613 |  * [46] This function unblock the thread identified by its <trdid> from the  | 
|---|
 | 614 |  * THREAD_BLOCKED_GLOBAL condition. | 
|---|
 | 615 |  ****************************************************************************************** | 
|---|
 | 616 |  * @ trdid  : target thread identifier. | 
|---|
 | 617 |  * @ return 0 if success / return -1 if failure. | 
|---|
 | 618 |  *****************************************************************************************/ | 
|---|
| [506] | 619 | int sys_thread_wakeup( trdid_t trdid ); | 
|---|
| [407] | 620 |  | 
|---|
| [421] | 621 | /******************************************************************************************  | 
|---|
| [443] | 622 |  * [47] This debug function is used to activate / desactivate the context switches trace | 
|---|
 | 623 |  * for a core identified by the <cxy> and <lid> arguments. | 
|---|
| [421] | 624 |  * It can be called by any other thread in the same process. | 
|---|
 | 625 |  ******************************************************************************************  | 
|---|
| [443] | 626 |  * @ active     : activate trace if true / desactivate trace if false. | 
|---|
 | 627 |  * @ cxy        : cluster identifier. | 
|---|
 | 628 |  * @ lid        : core local index. | 
|---|
| [421] | 629 |  * @ returns O if success / returns -1 if failure. | 
|---|
 | 630 |  *****************************************************************************************/ | 
|---|
| [443] | 631 | int sys_trace( bool_t   active, | 
|---|
 | 632 |                cxy_t    cxy,  | 
|---|
 | 633 |                lid_t    lid ); | 
|---|
| [407] | 634 |  | 
|---|
| [421] | 635 | /******************************************************************************************  | 
|---|
 | 636 |  * [48] This function gives the process identified by the <pid> argument | 
|---|
 | 637 |  * the exclusive ownership of its TXT_TX terminal (put it in foreground). | 
|---|
 | 638 |  ****************************************************************************************** | 
|---|
 | 639 |  * @ pid    : process identifier. | 
|---|
 | 640 |  * @ return 0 if success / return -1 if failure. | 
|---|
 | 641 |  *****************************************************************************************/ | 
|---|
 | 642 | int sys_fg( pid_t   pid ); | 
|---|
 | 643 |  | 
|---|
| [445] | 644 | /******************************************************************************************  | 
|---|
| [457] | 645 |  * [49] This function returns a non-zero value in the <is_fg> buffer when the process | 
|---|
 | 646 |  * identified by the <pid> argument is the current TXT owner. | 
|---|
| [445] | 647 |  ****************************************************************************************** | 
|---|
| [457] | 648 |  * @ pid      : process identifier. | 
|---|
 | 649 |  * @ is_fg    : pointer on buffer. | 
|---|
| [445] | 650 |  * @ return 0 if success / return -1 if failure. | 
|---|
 | 651 |  *****************************************************************************************/ | 
|---|
| [457] | 652 | int sys_is_fg( pid_t      pid, | 
|---|
 | 653 |                uint32_t * is_fg ); | 
|---|
| [421] | 654 |  | 
|---|
| [16] | 655 | #endif  // _SYSCALLS_H_ | 
|---|