summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-04 00:21:20 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-04 00:21:20 +0100
commit427613498108fda93f7cbfcb3a9417da50a23958 (patch)
treee6bbe4f4cf597b2d96d9adf99e254fe263ddd5df
parentb5d9da88991592d35d39dcae3829d2498b4e47e4 (diff)
finally hacked env and argv!
-rw-r--r--kernel/syscalls.c93
-rw-r--r--kernel/task.c5
-rw-r--r--kernel/vmem.c5
-rw-r--r--lib/string/string.c8
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;
+}