summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-04 23:30:15 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-04 23:30:15 +0100
commit41c3e0bc640f570831bd6c18fbfb8c7cec23a43d (patch)
tree487ff1379ad74fa5f610c5b18bcb573faa3f44ba /kernel/syscalls.c
parent53a61ec0f257930c2c5eb2ba20cac53d7862c92b (diff)
struggling with gcc -O , and other stuff
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c43
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