diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 44b04bd..ed895b2 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -9,7 +9,6 @@ #include "kernel/config.h" #include <sys/stat.h> -static uint32_t alloc; // TODO: implement on a per process basis! int syscall_unhandled(int nr) { @@ -122,35 +121,45 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) int syscall_execve(char *name, char **argv1, char **env1) { - char *argv[]={"/bin/foolshell",NULL}; - char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL}; #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv,env); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1); #endif + uint32_t alloc; uint32_t entry=load_elf(name,&alloc); + if(!entry) { + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve: bailing out!"); + #endif return -1; // errror loading } + asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. + + char *argv[]={"/bin/foolshell",NULL}; + char *env[]={"PATH=/bin","TERM=xterm","PWD=/home/miguel","PS1=$ ",NULL}; int i=0; do{ + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); + #endif i++; }while(env[i]!=NULL); int argc=0; do{ + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]); + #endif argc++; }while(argv[argc]!=NULL); - asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. - + task_set_brk(alloc); + asm("push %0" :: "r" (argv)); asm("push %0" :: "r" (argc)); asm("push %0" :: "r" (env)); @@ -202,8 +211,10 @@ int syscall_isatty(int file,int none1,int none2) // TODO: per process basis! uint32_t syscall_sbrk(int incr, int none1, int none2) { + uint32_t alloc=task_get_brk(); uint32_t oldalloc=alloc; alloc+=incr; + task_set_brk(alloc); #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sbrk (incr=%d) = 0x%08X", incr,oldalloc); |
