diff options
| author | Miguel <m.i@gmx.at> | 2018-10-18 06:23:26 +0200 |
|---|---|---|
| committer | Miguel <m.i@gmx.at> | 2018-10-18 06:23:26 +0200 |
| commit | e2a6ca9d03a3c0743384f0955609650f2cdce9bb (patch) | |
| tree | 09da82ba6fbb51c9492d05bd94a3d7b044492061 /kernel/syscalls.c | |
| parent | 4d1a149531bc5d672cdf4a5a3e010662f9611d61 (diff) | |
struggling with new syscalls
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index aa27ed8..23c88a7 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -391,6 +391,8 @@ int copy_args(char **in, char **out) // int execve(const char *filename, char *const argv[], char *const envp[]); int syscall_execve(const char *name, char *const argv[], char *const env[], int pid) { + uint32_t alloc; + uint32_t entry_global=load_elf(name,&alloc); fixme("not overwrite yourself?"); int arg_count=0; @@ -404,9 +406,6 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int if(env!=NULL)copy_args(env,env1); else env1=NULL; - uint32_t alloc; - uint32_t entry_global=load_elf(name,&alloc); - if(!entry_global){ set_errno(ENOENT); return -1; @@ -416,8 +415,8 @@ int syscall_execve(const char *name, char *const argv[], char *const env[], int *--stack=argv1; *--stack=arg_count; *--stack=env1; - task_reset(pid,entry_global,stack,alloc); task_set_name(pid,name); + task_reset(pid,entry_global,stack,alloc); return 0; } @@ -618,14 +617,17 @@ uint32_t syscall_gui_win(uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) uint32_t fdn=nextfd(pid); fds[pid][fdn]=fd_from_ringbuffer(); tty[pid]=fdn; - invl[pid]=ringbuffer_init(4); + invl[pid]=ringbuffer_init(1); task_add_win(pid,&invl[pid]); return 1; } -/** Generics */ +/** Generics . prep before we reenable interrupts*/ uint32_t syscall_generic_prep(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { +#ifdef LOG_SYSCALLS + klog("prep syscall [%s] for pid:%d",syscall_get_name(nr),pid); +#endif struct timeval *tv=p2; switch(nr){ @@ -647,9 +649,12 @@ uint32_t syscall_generic_prep(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, return 1; } -/** Generics */ -uint32_t syscall_generic_test(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) +/** Generics. test if we can continue.. reschedule otherwise */ +volatile uint32_t syscall_generic_test(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { +#ifdef LOG_SYSCALLS + klog("testing syscall [%s] for pid:%d",syscall_get_name(nr),pid); +#endif switch(nr){ case SYSCALL_WAIT : return !task_runs(p1); @@ -664,7 +669,7 @@ uint32_t syscall_generic_test(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, return 1;//other syscalls never block for now. } -/** Generics */ +/** Generics. finally do the work! */ uint32_t syscall_generic(uint32_t nr,uint32_t p1, uint32_t p2, uint32_t p3, uint32_t pid) { |
