////////////////////////////////////////////////////////////////////////////////// // File : stdio.h // Date : 01/04/2010 // Author : alain greiner & Joel Porquet // Copyright (c) UPMC-LIP6 /////////////////////////////////////////////////////////////////////////////////// // The stdio.c and stdio.h files are part of the GIET_VM nano-kernel. // This library contains all user-level functions that contain a system call // to access protected or shared ressources. /////////////////////////////////////////////////////////////////////////////////// #ifndef _STDIO_H #define _STDIO_H // These define must be synchronised with // the _syscall_vector defined in file sys_handler.c #define SYSCALL_PROC_XYP 0x00 #define SYSCALL_PROC_TIME 0x01 #define SYSCALL_TTY_WRITE 0x02 #define SYSCALL_TTY_READ 0x03 #define SYSCALL_TTY_ALLOC 0x04 #define SYSCALL_TTY_GET_LOCK 0x05 #define SYSCALL_TTY_RELEASE_LOCK 0x06 #define SYSCALL_HEAP_INFO 0x07 #define SYSCALL_LOCAL_TASK_ID 0x08 #define SYSCALL_GLOBAL_TASK_ID 0x09 #define SYSCALL_FBF_CMA_ALLOC 0x0A #define SYSCALL_FBF_CMA_START 0x0B #define SYSCALL_FBF_CMA_DISPLAY 0x0C #define SYSCALL_FBF_CMA_STOP 0x0D #define SYSCALL_EXIT 0x0E #define SYSCALL_PROC_NUMBER 0x0F #define SYSCALL_FBF_SYNC_WRITE 0x10 #define SYSCALL_FBF_SYNC_READ 0x11 #define SYSCALL_THREAD_ID 0x12 // 0x13 #define SYSCALL_TIM_ALLOC 0x14 #define SYSCALL_TIM_START 0x15 #define SYSCALL_TIM_STOP 0x16 // 0x17 // 0x18 #define SYSCALL_CTX_SWITCH 0x19 #define SYSCALL_VOBJ_GET_VBASE 0x1A #define SYSCALL_VOBJ_GET_LENGTH 0x1B #define SYSCALL_GET_XY 0x1C #define SYSCALL_NIC_ALLOC 0x1D #define SYSCALL_NIC_SYNC_SEND 0x1E #define SYSCALL_NIC_SYNC_RECEIVE 0x1F #define SYSCALL_FAT_OPEN 0x20 #define SYSCALL_FAT_READ 0x21 #define SYSCALL_FAT_WRITE 0x22 #define SYSCALL_FAT_LSEEK 0x23 #define SYSCALL_FAT_FSTAT 0x24 #define SYSCALL_FAT_CLOSE 0x25 // 0x26 // 0x27 // 0x28 // 0x29 // 0x2A // 0x2B // 0x2C // 0x2D // 0x2E // 0x2F ////////////////////////////////////////////////////////////////////////////////// // NULL pointer definition ////////////////////////////////////////////////////////////////////////////////// #define NULL (void *)0 ////////////////////////////////////////////////////////////////////////////////// // This generic C function is used to implement all system calls. // It writes the system call arguments in the proper registers, // and tells GCC what has been modified by system call execution. // Returns -1 to signal an error. ////////////////////////////////////////////////////////////////////////////////// static inline int sys_call( int call_no, int arg_0, int arg_1, int arg_2, int arg_3 ) { register int reg_no_and_output asm("v0") = call_no; register int reg_a0 asm("a0") = arg_0; register int reg_a1 asm("a1") = arg_1; register int reg_a2 asm("a2") = arg_2; register int reg_a3 asm("a3") = arg_3; asm volatile( "syscall" : "+r" (reg_no_and_output), /* input/output argument */ "+r" (reg_a0), "+r" (reg_a1), "+r" (reg_a2), "+r" (reg_a3), "+r" (reg_no_and_output) : /* input arguments */ : "memory", /* These persistant registers will be saved on the stack by the * compiler only if they contain relevant data. */ "at", "v1", "ra", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9" ); return (volatile int)reg_no_and_output; } ////////////////////////////////////////////////////////////////////////// // MIPS32 related system calls ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// extern void giet_proc_xyp( unsigned int* cluster_x, unsigned int* cluster_y, unsigned int* lpid ); extern unsigned int giet_proctime(); extern unsigned int giet_rand(); ////////////////////////////////////////////////////////////////////////// // Task context system calls ////////////////////////////////////////////////////////////////////////// extern unsigned int giet_proc_task_id(); extern unsigned int giet_global_task_id(); extern unsigned int giet_thread_id(); ////////////////////////////////////////////////////////////////////////// // TTY device related system calls ////////////////////////////////////////////////////////////////////////// extern void giet_tty_alloc(); extern void giet_tty_printf( char* format, ... ); extern void giet_shr_printf( char* format, ... ); extern void giet_tty_getc( char* byte ); extern void giet_tty_gets( char* buf, unsigned int bufsize ); extern void giet_tty_getw( unsigned int* val ); ////////////////////////////////////////////////////////////////////////// // TIMER device related system calls ////////////////////////////////////////////////////////////////////////// extern void giet_timer_alloc(); extern void giet_timer_start( unsigned int period ); extern void giet_timer_stop(); ////////////////////////////////////////////////////////////////////////// // Frame buffer device related system calls ////////////////////////////////////////////////////////////////////////// extern void giet_fbf_cma_alloc(); extern void giet_fbf_cma_start( void* buf0, void* buf1, unsigned int length ); extern void giet_fbf_cma_display( unsigned int buffer ); extern void giet_fbf_cma_stop(); extern void giet_fbf_sync_read( unsigned int offset, void* buffer, unsigned int length ); extern void giet_fbf_sync_write( unsigned int offset, void* buffer, unsigned int length ); ////////////////////////////////////////////////////////////////////////// // NIC related system calls ////////////////////////////////////////////////////////////////////////// extern void giet_nic_alloc(); extern void giet_nic_sync_send( void* buffer); extern void giet_nic_sync_receive( void* buffer ); ////////////////////////////////////////////////////////////////////////// // FAT related system calls ////////////////////////////////////////////////////////////////////////// extern int giet_fat_open( const char* pathname, unsigned int flags ); extern void giet_fat_read( unsigned int fd, void* buffer, unsigned int count, unsigned int offset ); extern void giet_fat_write( unsigned int fd, void* buffer, unsigned int count, unsigned int offset ); extern void giet_fat_lseek( unsigned int fd, unsigned int offset, unsigned int whence ); extern void giet_fat_fstat( unsigned int fd ); extern void giet_fat_close( unsigned int fd ); ////////////////////////////////////////////////////////////////////////// // Miscelaneous system calls ////////////////////////////////////////////////////////////////////////// extern void giet_exit( char* string ); extern void giet_assert( unsigned int condition, char* string ); extern void giet_context_switch(); extern void giet_procnumber( unsigned int cluster_xy, unsigned int buffer ); extern void giet_vobj_get_vbase( char* vspace_name, char* vobj_name, unsigned int* vobj_vaddr); extern void giet_vobj_get_length( char* vspace_name, char* vobj_name, unsigned int* vobj_vaddr); extern void giet_heap_info( unsigned int* vaddr, unsigned int* length, unsigned int x, unsigned int y ); extern void giet_get_xy( void* ptr, unsigned int* px, unsigned int* py ); #endif // Local Variables: // tab-width: 4 // c-basic-offset: 4 // c-file-offsets:((innamespace . 0)(inline-open . 0)) // indent-tabs-mode: nil // End: // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4