diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-04 23:30:15 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-04 23:30:15 +0100 |
| commit | 41c3e0bc640f570831bd6c18fbfb8c7cec23a43d (patch) | |
| tree | 487ff1379ad74fa5f610c5b18bcb573faa3f44ba /kernel/syscalls.c | |
| parent | 53a61ec0f257930c2c5eb2ba20cac53d7862c92b (diff) | |
struggling with gcc -O , and other stuff
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 43 |
1 files changed, 26 insertions, 17 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index d57fe80..6925b87 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -124,6 +124,8 @@ int syscall_execve(char *name, char **argv1, char **env1) { int temp=0x1; + uint32_t *entry=temp; + temp+=4; char *force_argv[]={"",NULL}; char *force_env[]={"PS1=$","PWD=/home/miguel","PATH=/bin",NULL}; @@ -168,8 +170,6 @@ int syscall_execve(char *name, char **argv1, char **env1) 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) { @@ -179,21 +179,27 @@ int syscall_execve(char *name, char **argv1, char **env1) return -1; // errror loading } + /* try to move this to asm */ + //asm volatile("jmp ."); + asm volatile("mov $0x8fff000,%esp"); // set stack at high end of process image + uint32_t alloc; + *entry=load_elf(name,&alloc); + // TODO: avoid code duplication for argv and env!! char **env_new=alloc; alloc+=sizeof(char **)*(env_count+1); i=0; do{ - #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); - #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; + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env_new[i],env_new[i]); + #endif i++; }while(env[i]!=NULL); env_new[i]=NULL; @@ -207,31 +213,34 @@ int syscall_execve(char *name, char **argv1, char **env1) 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 + #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); + + #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"argc: %d" ,arg_count); + #endif + task_set_brk(alloc); - // 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)); + asm volatile ("push %0" :: "r" (argv_new)); + asm volatile ("push %0" :: "r" (arg_count)); + asm volatile ("push %0" :: "r" (env_new)); // push addr and return to it - asm("push %0"::"r"(entry)); + asm volatile ("push %0"::"r"(*entry)); - asm("sti"); - asm("ret"); + asm volatile ("sti"); + asm volatile ("ret"); + // this is never reached! } - int syscall_open(char *name, int flags, int mode) { #ifdef LOG_SYSCALLS |
