diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 6707ec3..3fb813e 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -17,7 +17,6 @@ #include "scheduler.h" #include "log.h" - // TODO: use includes!!! uint64_t timer_get_ms(); @@ -134,20 +133,19 @@ int syscall_write(int file, char *buf, int len) */ int syscall_read(int file, char *buf, int len) { - //file 0 = stdin , file 1 = stdout , file 2 = stderr - char c; - int l=0; - - c=fd_read(&fds[file]); - fifo_data_len[file]--; - *buf=c; - buf++; - l++; - - return l; - if(l==len)return l; - if(c=='\n')return l; - + //file 0 = stdin , file 1 = stdout , file 2 = stderr + char c; + int l=0; + + c=fd_read(&fds[file]); + fifo_data_len[file]--; + *buf=c; + buf++; + l++; + + return l; + if(l==len)return l; + if(c=='\n')return l; } //TODO: replace with dirent! @@ -217,7 +215,6 @@ int copy_args(char **in, char **out) int syscall_execve(char *name, char **argv, char **env,int pid) { - //TODO copy environment to target pages somehow// int arg_count=0; while(argv[arg_count]!=NULL)arg_count++; @@ -225,26 +222,23 @@ int syscall_execve(char *name, char **argv, char **env,int pid) char **argv1=VMEM_USER_ENV; if(argv!=NULL) { -// copy_args(argv,argv1); + copy_args(argv,argv1); } - else{ argv1=NULL; } - char **env1=VMEM_USER_ENV+1024; + char **env1=VMEM_USER_ENV+1024*2; if(env!=NULL) { -// copy_args(env,env1); + copy_args(env,env1); } - else{ env1=NULL; } uint32_t alloc; uint32_t entry_global=load_elf(name,&alloc); - task_set_brk(alloc); if(!entry_global) { @@ -255,7 +249,7 @@ int syscall_execve(char *name, char **argv, char **env,int pid) *++stack=argv1; *++stack=arg_count; *++stack=env1; - task_reset(pid,entry_global,stack); + task_reset(pid,entry_global,stack,alloc); return 0; /* try to move this to asm */ @@ -341,13 +335,13 @@ uint32_t syscall_clone(int pid) uint32_t syscall_wait(int pid) { - fixme("implement syscall_wait"); return 0; } uint32_t syscall_exit(int pid) { fixme("free allll mem"); + task_exit(pid); return 0; } @@ -368,20 +362,15 @@ int syscall_isatty(int file,int none1,int none2) return 1; } -uint32_t fuckalloc=0x8500000; // TODO: per process basis! -uint32_t syscall_sbrk(uint32_t incr, int none1, int none2) +uint32_t syscall_sbrk(uint32_t incr, int none1, int none2, uint32_t pid) { - fixme("fake syscall_sbrk! 0x%08X",incr); - uint32_t alloc=task_get_brk(); - - uint32_t oldalloc=fuckalloc; - fuckalloc+=incr; - - task_set_brk(alloc); - - + uint32_t alloc=task_get_brk(pid); + uint32_t oldalloc=alloc; + alloc+=incr; + task_set_brk(pid,alloc); + fixme("fake syscall_sbrk(0x%08X) return %08X",incr,oldalloc); return oldalloc; } @@ -394,6 +383,18 @@ int syscall_stat(const char *path, struct stat *st,int none) /// there also is task_fork, task_wait, task_exit.. which is in scheduler.c //////////////////////////////////////// +uint32_t syscall_generic_test(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) +{ + switch(nr){ + case SYSCALL_WAIT : + return !task_runs(p1); + case SYSCALL_READ : + return p3 <= fifo_data_len[p1]; + case SYSCALL_EXIT : + return 1; + } + return 1; +} uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { @@ -423,7 +424,7 @@ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint case SYSCALL_READ : return syscall_read(p1,p2,p3); case SYSCALL_SBRK : - return syscall_sbrk(p1,p2,p3); + return syscall_sbrk(p1,p2,p3,pid); case SYSCALL_STAT : return syscall_stat(p1,p2,p3); case SYSCALL_FSTAT : |
