diff options
| author | Miguel <m.i@gmx.at> | 2018-08-17 17:51:51 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-08-17 17:51:51 +0200 |
| commit | 51d4dd040a291b62c648ff6cc0d7e0058cf4056f (patch) | |
| tree | 142b7db302ba038dba526f99e5854cfc87b5f92e /xxx/sys/syscalls.c | |
| parent | 006214f8c63189500b6ca55e0ef8f97eb35d47f5 (diff) | |
starting implicit function calls cleanup
Diffstat (limited to 'xxx/sys/syscalls.c')
| -rw-r--r-- | xxx/sys/syscalls.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/xxx/sys/syscalls.c b/xxx/sys/syscalls.c new file mode 100644 index 0000000..10e035c --- /dev/null +++ b/xxx/sys/syscalls.c @@ -0,0 +1,158 @@ +#include "kernel/syscalls.h" + +extern char **environ; +//struct _reent *_impure_ptr; + +// generic syscall interface! + +int __attribute__ ((noinline)) syscall(int call, int p1, int p2, int p3) +{ + int ebx; // will hold return value; + + // select syscall and pass params + asm("pusha"); + + asm("mov %0, %%eax"::"m"(call)); + + 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" (ebx)); + + asm("popa"); + + return ebx; +} + +// 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); +} + + |
