source: soft/giet_vm/giet_libs/stdio.h @ 744

Last change on this file since 744 was 743, checked in by alain, 9 years ago

Introducing the giet_fat_printf() system call.

  • Property svn:executable set to *
File size: 15.6 KB
Line 
1/////////////////////////////////////////////////////////////////////////////
2// File     : stdio.h         
3// Date     : 01/04/2010
4// Author   : alain greiner & Joel Porquet
5// Copyright (c) UPMC-LIP6
6/////////////////////////////////////////////////////////////////////////////
7// The stdio.c and stdio.h files are part of the GIET_VM nano-kernel.
8// This library contains all user-level functions that contain a system call
9// to access protected or shared ressources.
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _STDIO_H
13#define _STDIO_H
14
15#include "giet_fat32/fat32_shared.h"
16#include "giet_common/mips32_registers.h"
17
18// These define must be synchronised with
19// the _syscall_vector defined in file sys_handler.c
20
21#define SYSCALL_PROC_XYP             0x00
22#define SYSCALL_PROC_TIME            0x01
23#define SYSCALL_PROCS_NUMBER         0x02
24#define SYSCALL_GET_XY               0x03
25//                                   0x04
26#define SYSCALL_VOBJ_GET_VBASE       0x05
27#define SYSCALL_VOBJ_GET_LENGTH      0x06
28#define SYSCALL_HEAP_INFO            0x07
29#define SYSCALL_FBF_SIZE             0x08
30#define SYSCALL_FBF_ALLOC            0x09
31#define SYSCALL_FBF_CMA_ALLOC        0x0A
32#define SYSCALL_FBF_CMA_INIT_BUF     0x0B
33#define SYSCALL_FBF_CMA_START        0x0C
34#define SYSCALL_FBF_CMA_DISPLAY      0x0D
35#define SYSCALL_FBF_CMA_STOP         0x0E
36#define SYSCALL_FBF_CMA_CHECK        0x0F
37
38#define SYSCALL_APPS_STATUS          0x10
39#define SYSCALL_FBF_SYNC_WRITE       0x11
40#define SYSCALL_FBF_SYNC_READ        0x12
41//                                   0x13
42#define SYSCALL_TIM_ALLOC            0x14
43#define SYSCALL_TIM_START            0x15
44#define SYSCALL_TIM_STOP             0x16
45#define SYSCALL_KILL_APP             0x17
46#define SYSCALL_EXEC_APP             0x18
47//                                   0x19
48#define SYSCALL_PTHREAD_CONTROL      0x1A
49#define SYSCALL_PTHREAD_YIELD        0x1B
50#define SYSCALL_PTHREAD_KILL         0x1C
51#define SYSCALL_PTHREAD_CREATE       0x1D
52#define SYSCALL_PTHREAD_JOIN         0x1E
53#define SYSCALL_PTHREAD_EXIT         0x1F
54
55#define SYSCALL_FAT_OPEN             0x20
56#define SYSCALL_FAT_READ             0x21
57#define SYSCALL_FAT_WRITE            0x22
58#define SYSCALL_FAT_LSEEK            0x23
59#define SYSCALL_FAT_FINFO            0x24
60#define SYSCALL_FAT_CLOSE            0x25
61#define SYSCALL_FAT_REMOVE           0x26
62#define SYSCALL_FAT_RENAME           0x27
63#define SYSCALL_FAT_MKDIR            0x28
64#define SYSCALL_FAT_OPENDIR          0x29
65#define SYSCALL_FAT_CLOSEDIR         0x2A
66#define SYSCALL_FAT_READDIR          0x2B
67//                                   0x2C
68//                                   0x2D
69//                                   0x2E
70//                                   0x2F
71
72#define SYSCALL_NIC_ALLOC            0x30
73#define SYSCALL_NIC_START            0x31
74#define SYSCALL_NIC_MOVE             0x32
75#define SYSCALL_NIC_STOP             0x33
76#define SYSCALL_NIC_STATS            0x34
77#define SYSCALL_NIC_CLEAR            0x35
78#define SYSCALL_TTY_WRITE            0x36
79#define SYSCALL_TTY_READ             0x37
80#define SYSCALL_TTY_ALLOC            0x38
81//                                   0x39
82//                                   0x3A
83#define SYSCALL_COPROC_COMPLETED     0x3B
84#define SYSCALL_COPROC_ALLOC         0x3C
85#define SYSCALL_COPROC_CHANNEL_INIT  0x3D
86#define SYSCALL_COPROC_RUN           0x3E
87#define SYSCALL_COPROC_RELEASE       0x3F
88
89////////////////////////////////////////////////////////////////////////////
90// Define the error codes for the syscall handlers
91// These define must be synchronized with values in the sys_handler.h file
92////////////////////////////////////////////////////////////////////////////
93
94#define SYSCALL_OK                               ( 0 )
95#define SYSCALL_VSPACE_NOT_FOUND                 (-1 )
96#define SYSCALL_THREAD_NOT_FOUND                 (-2 )
97#define SYSCALL_NOT_IN_SAME_VSPACE               (-3 )
98#define SYSCALL_UNCOHERENT_THREAD_CONTEXT        (-4 )
99#define SYSCALL_ILLEGAL_THREAD_COMMAND_TYPE      (-5 )
100#define SYSCALL_CANNOT_LOAD_DATA_SEGMENT         (-6 )
101#define SYSCALL_THREAD_ALREADY_ACTIVE            (-7 )
102#define SYSCALL_MAIN_NOT_FOUND                   (-8 )
103#define SYSCALL_APPLI_CANNOT_BE_KILLED           (-9 )
104#define SYSCALL_PTHREAD_ARGUMENT_NOT_SUPPORTED   (-10)
105#define SYSCALL_ILLEGAL_CLUSTER_COORDINATES      (-11)
106#define SYSCALL_VSEG_NOT_FOUND                   (-12)
107#define SYSCALL_UNDEFINED_SYSTEM_CALL            (-13)
108#define SYSCALL_COPROCESSOR_NOT_FOUND            (-14)
109#define SYSCALL_COPROCESSOR_ILLEGAL_MODE         (-15)
110#define SYSCALL_COPROCESSOR_NON_ALLOCATED        (-16)
111#define SYSCALL_CHANNEL_ALREADY_ALLOCATED        (-17)
112#define SYSCALL_NO_CHANNEL_AVAILABLE             (-18)
113#define SYSCALL_CHANNEL_NON_ALLOCATED            (-19)
114#define SYSCALL_ILLEGAL_XY_ARGUMENTS             (-20)
115#define SYSCALL_OUT_OF_KERNEL_HEAP_MEMORY        (-21)
116#define SYSCALL_ADDRESS_NON_ALIGNED              (-22)
117#define SYSCALL_ADDRESS_NON_USER_ACCESSIBLE      (-23)
118#define SYSCALL_MISSING_INITIALISATION           (-24)
119#define SYSCALL_SHARED_PERIPHERAL_BUSY           (-25)
120
121////////////////////////////////////////////////////////////////////////////
122// Command values for the giet_pthread_control() syscall
123// These define must be synchronized with values in the sys_handler.h file
124////////////////////////////////////////////////////////////////////////////
125
126#define THREAD_CMD_PAUSE        0
127#define THREAD_CMD_RESUME       1
128#define THREAD_CMD_CONTEXT      2
129
130////////////////////////////////////////////////////////////////////////////
131// NULL pointer definition
132////////////////////////////////////////////////////////////////////////////
133
134#define NULL (void *)0
135
136////////////////////////////////////////////////////////////////////////////
137// This generic C function is used to implement all system calls.
138// It writes the system call arguments in the proper registers,
139// and tells GCC what has been modified by system call execution.
140// Returns -1 to signal an error.
141////////////////////////////////////////////////////////////////////////////
142static inline int sys_call( int call_no,
143                            int arg_0, 
144                            int arg_1, 
145                            int arg_2, 
146                            int arg_3 ) 
147{
148    register int reg_no_and_output asm("v0") = call_no;
149    register int reg_a0 asm("a0") = arg_0;
150    register int reg_a1 asm("a1") = arg_1;
151    register int reg_a2 asm("a2") = arg_2;
152    register int reg_a3 asm("a3") = arg_3;
153
154    asm volatile(
155            "syscall"
156            : "+r" (reg_no_and_output), /* input/output argument */
157              "+r" (reg_a0),             
158              "+r" (reg_a1),
159              "+r" (reg_a2),
160              "+r" (reg_a3),
161              "+r" (reg_no_and_output)
162            : /* input arguments */
163            : "memory",
164            /* These persistant registers will be saved on the stack by the
165             * compiler only if they contain relevant data. */
166            "at",
167            "v1",
168            "ra",
169            "t0",
170            "t1",
171            "t2",
172            "t3",
173            "t4",
174            "t5",
175            "t6",
176            "t7",
177            "t8",
178            "t9"
179               );
180    return (volatile int)reg_no_and_output;
181}
182
183//////////////////////////////////////////////////////////////////////////
184//               MIPS32 related system calls
185//////////////////////////////////////////////////////////////////////////
186
187extern void giet_proc_xyp( unsigned int* cluster_x,
188                           unsigned int* cluster_y,
189                           unsigned int* lpid );
190
191extern unsigned int giet_proctime();
192
193extern unsigned int giet_rand();
194
195//////////////////////////////////////////////////////////////////////////
196//              Threads related system calls
197//////////////////////////////////////////////////////////////////////////
198
199typedef unsigned int pthread_t;
200
201typedef unsigned int pthread_attr_t;
202
203extern int giet_pthread_create( pthread_t*       trdid,
204                                pthread_attr_t*  attr,
205                                void*            function,
206                                void*            ptr ); 
207
208extern void giet_pthread_exit( void* string );
209
210extern int giet_pthread_join( pthread_t  trdid,
211                              void**     ptr );
212
213extern int giet_pthread_kill( pthread_t thread_id,
214                              int       signal );
215
216extern void giet_pthread_yield();
217
218extern void giet_pthread_assert( unsigned int condition, 
219                                 char*        string );
220
221extern void giet_pthread_control( unsigned int command,
222                                  char*        vspace_name,
223                                  char*        thread_name );
224
225//////////////////////////////////////////////////////////////////////////
226//               Application related system calls
227//////////////////////////////////////////////////////////////////////////
228
229extern int giet_kill_application( char* name );
230
231extern int giet_exec_application( char* name );
232
233extern void giet_applications_status( char* name );
234
235//////////////////////////////////////////////////////////////////////////
236//             Coprocessors related system calls
237//////////////////////////////////////////////////////////////////////////
238
239// this structure is used by the giet_coproc_channel_init()
240// system call to specify the communication channel parameters.
241typedef struct giet_coproc_channel
242{
243    unsigned int  channel_mode;    // MWMR / DMA_IRQ / DMA_NO_IRQ
244    unsigned int  buffer_size;     // memory buffer size
245    unsigned int  buffer_vaddr;    // memory buffer virtual address
246    unsigned int  status_vaddr;    // MWMR status virtual address (12 bytes)
247    unsigned int  lock_vaddr;      // MWMR lock virtual address (64 bytes)
248} giet_coproc_channel_t;
249
250extern void giet_coproc_alloc( unsigned int   cluster_xy,
251                               unsigned int   coproc_type,
252                               unsigned int*  coproc_info );
253
254extern void giet_coproc_release( unsigned int cluster_xy,
255                                 unsigned int coproc_type );
256
257extern void giet_coproc_channel_init( unsigned int            cluster_xy,
258                                      unsigned int            coproc_type,
259                                      unsigned int            channel,
260                                      giet_coproc_channel_t*  desc );
261
262extern void giet_coproc_run( unsigned int cluster_xy,
263                             unsigned int coproc_type );
264
265extern void giet_coproc_completed( unsigned int cluster_xy,
266                                   unsigned int coproc_type );
267
268//////////////////////////////////////////////////////////////////////////
269//             TTY device related system calls
270//////////////////////////////////////////////////////////////////////////
271
272extern void giet_tty_alloc( unsigned int shared );
273
274extern void giet_tty_printf( char* format, ... );
275
276extern void giet_tty_getc( char* byte );
277
278extern void giet_tty_gets( char* buf, unsigned int bufsize );
279
280extern void giet_tty_getw( unsigned int* val );
281
282//////////////////////////////////////////////////////////////////////////
283//                TIMER device related system calls
284//////////////////////////////////////////////////////////////////////////
285
286extern void giet_timer_alloc();
287
288extern void giet_timer_start( unsigned int period );
289
290extern void giet_timer_stop();
291 
292//////////////////////////////////////////////////////////////////////////
293//                Frame buffer device related system calls
294//////////////////////////////////////////////////////////////////////////
295
296extern void giet_fbf_size();
297
298extern void giet_fbf_alloc();
299
300extern void giet_fbf_cma_alloc( unsigned int nbufs );
301
302extern void giet_fbf_cma_init_buf( unsigned int index,
303                                   void*        buf_vbase, 
304                                   void*        sts_vaddr );
305
306extern void giet_fbf_cma_start();
307
308extern void giet_fbf_cma_check( unsigned int buffer );
309
310extern void giet_fbf_cma_display( unsigned int buffer );
311
312extern void giet_fbf_cma_stop();
313
314extern void giet_fbf_sync_read( unsigned int offset, 
315                                void*        buffer, 
316                                unsigned int length );
317
318extern void giet_fbf_sync_write( unsigned int offset, 
319                                 void*        buffer, 
320                                 unsigned int length );
321
322//////////////////////////////////////////////////////////////////////////
323//                  NIC related system calls
324//////////////////////////////////////////////////////////////////////////
325
326extern void giet_nic_rx_alloc( unsigned int xmax, unsigned int ymax );
327
328extern void giet_nic_tx_alloc( unsigned int xmax, unsigned int ymax );
329
330extern void giet_nic_rx_start();
331
332extern void giet_nic_tx_start();
333
334extern void giet_nic_rx_move( void* buffer );
335
336extern void giet_nic_tx_move( void* buffer );
337
338extern void giet_nic_rx_stop();
339
340extern void giet_nic_tx_stop();
341
342extern void giet_nic_rx_stats();
343
344extern void giet_nic_tx_stats();
345
346extern void giet_nic_rx_clear();
347
348extern void giet_nic_tx_clear();
349
350//////////////////////////////////////////////////////////////////////////
351//               FAT related system calls
352//////////////////////////////////////////////////////////////////////////
353
354extern int giet_fat_open( char*        pathname,
355                          unsigned int flags );
356
357extern int giet_fat_close( unsigned int fd_id );
358
359extern int giet_fat_file_info( unsigned int     fd_id,
360                               fat_file_info_t* info );
361
362extern int giet_fat_read( unsigned int fd_id,
363                          void*        buffer,
364                          unsigned int count );
365
366extern int giet_fat_write( unsigned int fd,
367                           void*        buffer,
368                           unsigned int count );
369
370extern int giet_fat_lseek( unsigned int fd,
371                           unsigned int offset,
372                           unsigned int whence );
373
374extern int giet_fat_remove( char*        pathname,
375                            unsigned int should_be_dir );
376
377extern int giet_fat_rename( char*  old_path,
378                            char*  new_path ); 
379
380extern int giet_fat_mkdir( char* pathname );
381
382extern int giet_fat_opendir( char* pathname );
383
384extern int giet_fat_closedir( unsigned int fd_id );
385
386extern int giet_fat_readdir( unsigned int  fd_id,
387                             fat_dirent_t* entry );
388
389extern int giet_fat_fprintf( unsigned int  fd_id,
390                             char*         format, ... );
391
392//////////////////////////////////////////////////////////////////////////
393//                    Miscelaneous system calls
394//////////////////////////////////////////////////////////////////////////
395
396extern void giet_procs_number( unsigned int* x_size,
397                               unsigned int* y_size,
398                               unsigned int* nprocs );
399
400extern void giet_vobj_get_vbase( char*         vspace_name, 
401                                 char*         vobj_name, 
402                                 unsigned int* vobj_vaddr);
403
404extern void giet_vobj_get_length( char*         vspace_name, 
405                                  char*         vobj_name, 
406                                  unsigned int* vobj_vaddr);
407
408extern void giet_heap_info( unsigned int* vaddr, 
409                            unsigned int* length,
410                            unsigned int  x,
411                            unsigned int  y );
412
413extern void giet_get_xy( void*          ptr, 
414                         unsigned int*  px,
415                         unsigned int*  py );
416
417#endif
418
419// Local Variables:
420// tab-width: 4
421// c-basic-offset: 4
422// c-file-offsets:((innamespace . 0)(inline-open . 0))
423// indent-tabs-mode: nil
424// End:
425// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
426
Note: See TracBrowser for help on using the repository browser.