summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c73
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 :