summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c23
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);