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

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

Major release: Change the task model to implement the POSIX threads API.

  • The shell "exec" and "kill" commands can be used to activate/de-activate the applications.
  • The "pause", "resume", and "context" commands can be used to stop, restart, a single thtead or to display the thread context.

This version has been tested on the following multi-threaded applications,
that have been modified to use the POSIX threads:

  • classif
  • convol
  • transpose
  • gameoflife
  • raycast
  • Property svn:executable set to *
File size: 13.1 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//                                   0x05
27//                                   0x06
28#define SYSCALL_HEAP_INFO            0x07
29#define SYSCALL_VOBJ_GET_VBASE       0x08
30#define SYSCALL_VOBJ_GET_LENGTH      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//                                   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// NULL pointer definition
91////////////////////////////////////////////////////////////////////////////
92
93#define NULL (void *)0
94
95////////////////////////////////////////////////////////////////////////////
96// This generic C function is used to implement all system calls.
97// It writes the system call arguments in the proper registers,
98// and tells GCC what has been modified by system call execution.
99// Returns -1 to signal an error.
100////////////////////////////////////////////////////////////////////////////
101static inline int sys_call( int call_no,
102                            int arg_0, 
103                            int arg_1, 
104                            int arg_2, 
105                            int arg_3 ) 
106{
107    register int reg_no_and_output asm("v0") = call_no;
108    register int reg_a0 asm("a0") = arg_0;
109    register int reg_a1 asm("a1") = arg_1;
110    register int reg_a2 asm("a2") = arg_2;
111    register int reg_a3 asm("a3") = arg_3;
112
113    asm volatile(
114            "syscall"
115            : "+r" (reg_no_and_output), /* input/output argument */
116              "+r" (reg_a0),             
117              "+r" (reg_a1),
118              "+r" (reg_a2),
119              "+r" (reg_a3),
120              "+r" (reg_no_and_output)
121            : /* input arguments */
122            : "memory",
123            /* These persistant registers will be saved on the stack by the
124             * compiler only if they contain relevant data. */
125            "at",
126            "v1",
127            "ra",
128            "t0",
129            "t1",
130            "t2",
131            "t3",
132            "t4",
133            "t5",
134            "t6",
135            "t7",
136            "t8",
137            "t9"
138               );
139    return (volatile int)reg_no_and_output;
140}
141
142//////////////////////////////////////////////////////////////////////////
143//               MIPS32 related system calls
144//////////////////////////////////////////////////////////////////////////
145
146extern void giet_proc_xyp( unsigned int* cluster_x,
147                           unsigned int* cluster_y,
148                           unsigned int* lpid );
149
150extern unsigned int giet_proctime();
151
152extern unsigned int giet_rand();
153
154//////////////////////////////////////////////////////////////////////////
155//              Threads related system calls
156//////////////////////////////////////////////////////////////////////////
157
158typedef unsigned int pthread_t;
159
160typedef unsigned int pthread_attr_t;
161
162extern int giet_pthread_create( pthread_t*       trdid,
163                                pthread_attr_t*  attr,
164                                void*            function,
165                                void*            ptr ); 
166
167extern void giet_pthread_exit( void* string );
168
169extern int giet_pthread_join( pthread_t  trdid,
170                              void**     ptr );
171
172extern int giet_pthread_kill( pthread_t thread_id,
173                              int       signal );
174
175extern void giet_pthread_yield();
176
177extern void giet_pthread_assert( unsigned int condition, 
178                                 char*        string );
179
180extern int giet_pthread_pause( char*      vspace,
181                               char*      thread );
182
183extern int giet_pthread_resume( char*      vspace,
184                                char*      thread );
185
186extern int giet_pthread_context( char*      vspace,
187                                 char*      thread );
188
189//////////////////////////////////////////////////////////////////////////
190//               Application related system calls
191//////////////////////////////////////////////////////////////////////////
192
193extern int giet_kill_application( char* name );
194
195extern int giet_exec_application( char* name );
196
197extern void giet_applications_status();
198
199//////////////////////////////////////////////////////////////////////////
200//             Coprocessors related system calls
201//////////////////////////////////////////////////////////////////////////
202
203// this structure is used by the giet_coproc_channel_init()
204// system call to specify the communication channel parameters.
205typedef struct giet_coproc_channel
206{
207    unsigned int  channel_mode;    // MWMR / DMA_IRQ / DMA_NO_IRQ
208    unsigned int  buffer_size;     // memory buffer size
209    unsigned int  buffer_vaddr;    // memory buffer virtual address
210    unsigned int  mwmr_vaddr;      // MWMR descriptor virtual address
211    unsigned int  lock_vaddr;      // lock for MWMR virtual address
212} giet_coproc_channel_t;
213
214extern void giet_coproc_alloc( unsigned int   coproc_type,
215                               unsigned int*  coproc_info );
216
217extern void giet_coproc_release( unsigned int coproc_reg_index );
218
219extern void giet_coproc_channel_init( unsigned int            channel,
220                                      giet_coproc_channel_t*  desc );
221
222extern void giet_coproc_run( unsigned int coproc_reg_index );
223
224extern void giet_coproc_completed();
225
226//////////////////////////////////////////////////////////////////////////
227//             TTY device related system calls
228//////////////////////////////////////////////////////////////////////////
229
230extern void giet_tty_alloc( unsigned int shared );
231
232extern void giet_tty_printf( char* format, ... );
233
234extern void giet_tty_getc( char* byte );
235
236extern void giet_tty_gets( char* buf, unsigned int bufsize );
237
238extern void giet_tty_getw( unsigned int* val );
239
240//////////////////////////////////////////////////////////////////////////
241//                TIMER device related system calls
242//////////////////////////////////////////////////////////////////////////
243
244extern void giet_timer_alloc();
245
246extern void giet_timer_start( unsigned int period );
247
248extern void giet_timer_stop();
249 
250//////////////////////////////////////////////////////////////////////////
251//                Frame buffer device related system calls
252//////////////////////////////////////////////////////////////////////////
253
254extern void giet_fbf_cma_alloc();
255
256extern void giet_fbf_cma_init_buf( void* buf0_vbase, 
257                                   void* buf1_vbase,
258                                   void* sts0_vaddr,
259                                   void* sts1_vaddr );
260
261extern void giet_fbf_cma_start( unsigned int length );
262
263extern void giet_fbf_cma_display( unsigned int buffer );
264
265extern void giet_fbf_cma_stop();
266
267extern void giet_fbf_sync_read( unsigned int offset, 
268                                void*        buffer, 
269                                unsigned int length );
270
271extern void giet_fbf_sync_write( unsigned int offset, 
272                                 void*        buffer, 
273                                 unsigned int length );
274
275//////////////////////////////////////////////////////////////////////////
276//                  NIC related system calls
277//////////////////////////////////////////////////////////////////////////
278
279extern void giet_nic_rx_alloc( unsigned int xmax, unsigned int ymax );
280
281extern void giet_nic_tx_alloc( unsigned int xmax, unsigned int ymax );
282
283extern void giet_nic_rx_start();
284
285extern void giet_nic_tx_start();
286
287extern void giet_nic_rx_move( void* buffer );
288
289extern void giet_nic_tx_move( void* buffer );
290
291extern void giet_nic_rx_stop();
292
293extern void giet_nic_tx_stop();
294
295extern void giet_nic_rx_stats();
296
297extern void giet_nic_tx_stats();
298
299extern void giet_nic_rx_clear();
300
301extern void giet_nic_tx_clear();
302
303//////////////////////////////////////////////////////////////////////////
304//               FAT related system calls
305//////////////////////////////////////////////////////////////////////////
306
307extern int giet_fat_open( char*        pathname,
308                          unsigned int flags );
309
310extern int giet_fat_close( unsigned int fd_id );
311
312extern int giet_fat_file_info( unsigned int     fd_id,
313                               fat_file_info_t* info );
314
315extern int giet_fat_read( unsigned int fd_id,
316                          void*        buffer,
317                          unsigned int count );
318
319extern int giet_fat_write( unsigned int fd,
320                           void*        buffer,
321                           unsigned int count );
322
323extern int giet_fat_lseek( unsigned int fd,
324                           unsigned int offset,
325                           unsigned int whence );
326
327extern int giet_fat_remove( char*        pathname,
328                            unsigned int should_be_dir );
329
330extern int giet_fat_rename( char*  old_path,
331                            char*  new_path ); 
332
333extern int giet_fat_mkdir( char* pathname );
334
335extern int giet_fat_opendir( char* pathname );
336
337extern int giet_fat_closedir( unsigned int fd_id );
338
339extern int giet_fat_readdir( unsigned int  fd_id,
340                             fat_dirent_t* entry );
341
342//////////////////////////////////////////////////////////////////////////
343//                    Miscelaneous system calls
344//////////////////////////////////////////////////////////////////////////
345
346extern void giet_procs_number( unsigned int* x_size,
347                               unsigned int* y_size,
348                               unsigned int* nprocs );
349
350extern void giet_vobj_get_vbase( char*         vspace_name, 
351                                 char*         vobj_name, 
352                                 unsigned int* vobj_vaddr);
353
354extern void giet_vobj_get_length( char*         vspace_name, 
355                                  char*         vobj_name, 
356                                  unsigned int* vobj_vaddr);
357
358extern void giet_heap_info( unsigned int* vaddr, 
359                            unsigned int* length,
360                            unsigned int  x,
361                            unsigned int  y );
362
363extern void giet_get_xy( void*          ptr, 
364                         unsigned int*  px,
365                         unsigned int*  py );
366
367#endif
368
369// Local Variables:
370// tab-width: 4
371// c-basic-offset: 4
372// c-file-offsets:((innamespace . 0)(inline-open . 0))
373// indent-tabs-mode: nil
374// End:
375// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
376
Note: See TracBrowser for help on using the repository browser.