#include #include #include #include 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); }