diff options
Diffstat (limited to 'syscalls.c')
| -rw-r--r-- | syscalls.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/syscalls.c b/syscalls.c new file mode 100644 index 0000000..c4bd549 --- /dev/null +++ b/syscalls.c @@ -0,0 +1,232 @@ +#include <sys/time.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdint.h> + +typedef struct fs_dirent_struct +{ + uint32_t inode; + uint32_t offset; + uint16_t length; + uint8_t type; + char name[256]; +}fs_dirent; + +//fool-os syscalls +#define SYSCALL_READDIR 63 +#define SYSCALL_HAS_DATA 80 +#define SYSCALL_TUNE 81 + +//syscalls required by newlib +#define SYSCALL_EXIT 60 +#define SYSCALL_WRITE 61 +#define SYSCALL_READ 62 +#define SYSCALL_EXECVE 64 +#define SYSCALL_OPEN 65 +#define SYSCALL_CLOSE 66 +#define SYSCALL_FSTAT 67 +#define SYSCALL_ISATTY 68 +#define SYSCALL_LSEEK 69 +#define SYSCALL_SBRK 70 +#define SYSCALL_STAT 74 +#define SYSCALL_LSTAT 79 + +// stubs only so far! +#define SYSCALL_GETTIMEOFDAY 71 +#define SYSCALL_FORK 72 +#define SYSCALL_KILL 73 +#define SYSCALL_LINK 73 +#define SYSCALL_TIMES 75 +#define SYSCALL_UNLINK 76 +#define SYSCALL_WAIT 77 +#define SYSCALL_GETPID 78 + +/* +int syscall_execve(char *name, char **argv, char **env); +int syscall_write(int file, char *buf, int len); + +int syscall_readdir(const char *name,struct fs_dirent *dirs,int max); + +int syscall_exit(int ret, int none1, int none2); +int syscall_open(char *name, int flags, int len); +int syscall_read(int file, char *buf, int len); +int syscall_close(int file,int none1,int none2); +int syscall_fstat(int file, struct stat *st,int none); +int syscall_isatty(int file,int none1,int none2); +int syscall_lseek(int file,int ptr,int dir); +int syscall_stat(char *file, struct stat *st); +int syscall_sbrk(int incr, int none1, int none2); +// +int syscall_gettimeofday(struct timeval *tv, struct timezone *tz); +int syscall_fork(void); +int syscall_getpid(void); +int syscall_kill(int pid, int sig); +int syscall_link(char *old, char *ne); +int syscall_times(struct tms *buf); +int syscall_unlink(char *name); +int syscall_wait(int *status); +// +int syscall_unhandled(int nr); +*/ + +extern char **environ; +//struct _reent *_impure_ptr; + +// generic syscall interface! +/*int volatile __attribute__ ((noinline)) syscall(int call, int p1, int p2, int p3) +{ + int ebx; // persist over func call( a,c,d are scratch) + int ret; // will hold return val + + asm("mov %%ebx, %0": "=b" (ebx)); + +// asm("pusha"); + + // select syscall + asm("mov %0, %%eax"::"m"(call)); + + // pass params + asm("mov %0,%%edx"::"m"(p1)); + asm("mov %0,%%ecx"::"m"(p2)); + asm("mov %0,%%ebx"::"m"(p3)); + + // interrrupt + asm("int $0x80"); + + // get return value + asm("mov %%ebx, %0": "=b" (ret)); + + // restore + asm("mov %0,%%ebx"::"m"(ebx)); + +// asm("popa"); + + return ret; +} +*/ + +// fool os custom +int readdir(const char *name,fs_dirent *dirs,int max) +{ + + return syscall(SYSCALL_READDIR,name,dirs,max); +} + +int has_data_waiting() +{ + + return syscall(SYSCALL_HAS_DATA,0,0,0); +} + +int fool_tune(int v1, int v2, int v3) +{ + + return syscall(SYSCALL_TUNE,v1,v2,v3); +} + +void _exit(int ret) +{ + _exit2(ret,environ); +} + +void _exit2(int ret,char **environ) +{ + return syscall(SYSCALL_EXIT,ret,environ,0); +} + +//required by newlibc +int _close(int file) +{ + return syscall(SYSCALL_CLOSE,file,0,0); +} + +int _isatty(int file) +{ + return syscall(SYSCALL_ISATTY,file,0,0); +} + +int _lseek(int file, int ptr, int dir) +{ + return syscall(SYSCALL_LSEEK,file,ptr,dir); +} + +int _read(int file, char *ptr, int len) +{ + + return syscall(SYSCALL_READ,file,ptr,len); +} + +int _open(const char *name, int flags, int mode) +{ + return syscall(SYSCALL_OPEN,name,flags,mode); +} + +int _write(int file, char *ptr, int len) +{ + return syscall(SYSCALL_WRITE,file,ptr,len); +} + +int _execve(char *name, char **argv, char **env) +{ + return syscall(SYSCALL_EXECVE,name,argv,env); +} + +uint32_t _sbrk(int incr) +{ + return syscall(SYSCALL_SBRK,incr,0,0); +} + +int _gettimeofday(struct timeval *tv, void *tz) +{ + return syscall(SYSCALL_GETTIMEOFDAY,tv,tz,0); +} + +int _fork(void) +{ + return syscall(SYSCALL_FORK,0,0,0); +} + +int _getpid(void) +{ + return syscall(SYSCALL_GETPID,0,0,0); +} + +int _kill(int pid, int sig) +{ + return syscall(SYSCALL_KILL,pid,sig,0); +} + +int _link(char *old, char *ne) +{ + return syscall(SYSCALL_LINK,old,ne,0); +} + +int _unlink(char *name) +{ + return syscall(SYSCALL_UNLINK,name,0,0); +} + +int _times(struct tms *buf) +{ + return syscall(SYSCALL_TIMES,buf,0,0); +} + +int _wait(int *status) +{ + return syscall(SYSCALL_WAIT,status,0,0); +} + +int _stat(const char *file, struct stat *st) +{ + return syscall(SYSCALL_STAT,file,st,0); +} + +int _lstat(const char *file, struct stat *st) +{ + return syscall(SYSCALL_LSTAT,file,st,0); +} + +int _fstat(int file, struct stat *st) +{ + return syscall(SYSCALL_FSTAT,file,st,0); +} |
