summaryrefslogtreecommitdiff
path: root/userspace/syscalls.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-20 04:51:23 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-20 04:51:23 +0100
commit1acde03a7c0f85aca9919e374e3df6cee6f0bd08 (patch)
tree10ae84ce2693bad62e5c7376cd0c3c40a80c93df /userspace/syscalls.c
parentbcab3c0be8ff5fe1db1fac9e01973531cc29f554 (diff)
workin on syscall interface etc..
Diffstat (limited to 'userspace/syscalls.c')
-rw-r--r--userspace/syscalls.c76
1 files changed, 25 insertions, 51 deletions
diff --git a/userspace/syscalls.c b/userspace/syscalls.c
index b5959eb..7471418 100644
--- a/userspace/syscalls.c
+++ b/userspace/syscalls.c
@@ -1,20 +1,17 @@
-//printf needs following syscalls: sbrk write close fstat isatty lseek read
-//
-
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>
-#include "../fs/fs.h"
+#include "../kernel/syscalls.h"
-static int preread;
-static int alloc;
-easywrite(char *c);
+/*
+char *__env1[]={0};
+char *__env2[]={"dupa","test"};
+char **environ={__env1,__env2};
+*/
-// init syscalls
-void syscalls_init()
+void _exit(int ret)
{
- // TODO dynamic!
- alloc=0x300000;
+while(1);
}
// generic syscall interface!
@@ -43,85 +40,62 @@ int syscall(int call, int p1, int p2, int p3)
return ebx;
}
-//
int close(int file)
{
- return -1;
+ return syscall(SYSCALL_CLOSE,file,0,0);
}
int fstat(int file, struct stat *st)
{
- st->st_mode = S_IFCHR;
- return 0;
+ return syscall(SYSCALL_FSTAT,file,st,0);
}
int isatty(int file)
{
- return 1;
+ return syscall(SYSCALL_ISATTY,file,0,0);
}
int lseek(int file, int ptr, int dir)
{
- if(dir==0)preread=ptr;
- else{ puts("other modes unsupported sorry"); while(1);}
- return preread;
+ return syscall(SYSCALL_LSEEK,file,ptr,dir);
}
int read(int file, char *ptr, int len)
{
- return syscall(62,file,ptr,len);
+
+ return syscall(SYSCALL_READ,file,ptr,len);
}
int readdir(const char *name,fs_dirent *dirs,int max)
{
- return syscall(63,name,dirs,max);
+ return syscall(SYSCALL_READDIR,name,dirs,max);
}
int open(const char *name, int flags, int mode)
{
- return name;
+ return syscall(SYSCALL_OPEN,name,flags,mode);
}
int write(int file, char *ptr, int len)
{
- return syscall(61,file,ptr,len);
+ return syscall(SYSCALL_WRITE,file,ptr,len);
}
int execve(char *name, char **argv, char **env)
{
-
- return syscall(64,name,argv,env);
+ return syscall(SYSCALL_EXECVE,name,argv,env);
}
-
caddr_t sbrk(int incr)
{
-// easywrite("syscall: sbrk!!\n");
- int oldalloc=alloc;
- alloc+=incr;
- return oldalloc;
- /*
-
- extern char end;
-// char _end;
- static char *heap_end;
- char *prev_heap_end;
-
- if (heap_end == 0) {
- heap_end = &end;
- }
- prev_heap_end = heap_end;
-
- if (heap_end + incr > stack_ptr) {
- write (1, "Heap and stack collision\n", 25);
- abort ();
- }
-
- heap_end += incr;
- return (caddr_t) prev_heap_end;
- */
+ static int alloc=0x300000; // TODO: implement properly sbrk!!!
+ int oldalloc=alloc;
+ alloc+=incr;
+ return oldalloc;
+
+ return syscall(SYSCALL_SBRK,incr,0,0);
}
-//
+