diff options
| -rw-r--r-- | kernel/syscalls.c | 93 | ||||
| -rw-r--r-- | kernel/task.c | 5 | ||||
| -rw-r--r-- | kernel/vmem.c | 5 | ||||
| -rw-r--r-- | lib/string/string.c | 8 |
4 files changed, 91 insertions, 20 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index ed895b2..3ec4cfa 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -119,9 +119,54 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) return fs_readdir(name,dirs,max); } + int syscall_execve(char *name, char **argv1, char **env1) { + int temp=0x1; + + char *force_argv[]={"",NULL}; + char *force_env[]={"PS1=$","PWD=/home/miguel","PATH=/bin",NULL}; + if(argv1==NULL)argv1=force_argv; + if(env1==NULL)env1=force_env; + + int env_count=0; + do{env_count++;}while(env1[env_count]!=NULL); + + int arg_count=0; + do{arg_count++;}while(argv1[arg_count]!=NULL); + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d %d", env_count, arg_count); + char **env=temp; + temp+=sizeof(char **)*(env_count+1); + char **argv=temp; + temp+=sizeof(char **)*(arg_count+1); + + int i=0; + do{ + int l=strlen(env1[i]); + char *env_var=temp; + temp+=sizeof(char *)*(l+1); + memcpy(env_var,env1[i],l+1); + env[i]=env_var; + i++; + }while(env1[i]!=NULL); + env[i]=NULL; + + i=0; + do{ + int l=strlen(argv1[i]); + char *arg_var=temp; + temp+=sizeof(char *)*(l+1); + memcpy(arg_var,argv1[i],l+1); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg_var: 0x%08X",arg_var); + argv[i]=arg_var; + i++; + }while(argv1[i]!=NULL); + argv[i]=NULL; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d %d", env_count, arg_count); + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1); #endif @@ -137,32 +182,48 @@ int syscall_execve(char *name, char **argv1, char **env1) 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; + // TODO: avoid code duplication for argv and env!! + char **env_new=alloc; + alloc+=sizeof(char **)*(env_count+1); + + i=0; do{ - #ifdef LOG_SYSCALLS +// #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); - #endif + // #endif + int l=strlen(env[i]); + char *env_var=alloc; + alloc+=sizeof(char)*l+1; + memcpy(env_var,env[i],l+1); + env_new[i]=env_var; i++; }while(env[i]!=NULL); + env_new[i]=NULL; - int argc=0; + char **argv_new=alloc; + alloc+=sizeof(char **)*(arg_count+1); + i=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); + int l=strlen(argv[i]); + char *arg_var=alloc; + alloc+=sizeof(char)*l+1; + memcpy(arg_var,argv[i],l+1); + argv_new[i]=arg_var; +// #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,i,argv_new[i],argv_new[i]); + // #endif + i++; + }while(argv[i]!=NULL); task_set_brk(alloc); - asm("push %0" :: "r" (argv)); - asm("push %0" :: "r" (argc)); - asm("push %0" :: "r" (env)); + // TODO: why can i not put it ~0x48000 bytes higher!? + asm("mov $0x8800000,%esp"); // set stack at high end of process image + + asm("push %0" :: "r" (argv_new)); + asm("push %0" :: "r" (arg_count)); + asm("push %0" :: "r" (env_new)); // push addr and return to it asm("push %0"::"r"(entry)); diff --git a/kernel/task.c b/kernel/task.c index 586340b..866dcc2 100644 --- a/kernel/task.c +++ b/kernel/task.c @@ -154,10 +154,7 @@ void task_init(pdirectory *dir) task_list[0].vmem=dir; task_list[0].esp = 0; // will be set by next task_switch_next() call. current_task=0; - - static char *argv[]={"/bin/foolshell",NULL}; - static char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL}; - syscall_execve("/bin/init",argv,env); + syscall_execve("/bin/init",NULL,NULL); } diff --git a/kernel/vmem.c b/kernel/vmem.c index 3acb806..ddb3148 100644 --- a/kernel/vmem.c +++ b/kernel/vmem.c @@ -174,7 +174,11 @@ pt_entry* vmmngr_ptable_lookup_entry (ptable* p, virtual_addr addr) void vmem_free_dir(pdirectory *dir) { } + // vmem init and also copies all the shit for FORK +// for now it allocates always 2 * 1024 * 4096 bytes at +// virtual: 0x80480000-0x8848000. +// pdirectory* vmem_new_space_dir(pdirectory *copy_dir) { x86_paging_disable(); @@ -283,6 +287,7 @@ pdirectory* vmem_new_space_dir(pdirectory *copy_dir) virt_addr+=1024*4096; } + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"last addr (0x%08X,0x%08X)",phys_addr, virt_addr); if(copy_dir!=NULL)x86_paging_enable(); diff --git a/lib/string/string.c b/lib/string/string.c index a43210a..729c509 100644 --- a/lib/string/string.c +++ b/lib/string/string.c @@ -27,3 +27,11 @@ void* memcpy(void* restrict dstptr, const void* restrict srcptr, int size) dst[i] = src[i]; return dstptr; } + +int strlen(const char* string) +{ + int result = 0; + while ( string[result] ) + result++; + return result; +} |
