From 6a3ef39feb635f529da9e36975ba77a26c1ff3b4 Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Sun, 23 Nov 2014 14:00:52 +0100 Subject: passing argv and argc to main, and fixed ELF load. --- kernel/syscalls.c | 67 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 32 deletions(-) (limited to 'kernel/syscalls.c') diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 06caf2d..9f29750 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -140,9 +140,36 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) int syscall_execve(char *name, char **argv, char **env) { -#ifdef LOG_SYSCALLS + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env); -#endif + #endif + + + char arg1[100]; + char arg2[100]; + char arg3[100]; + char arg4[100]; + char arg5[100]; + char *argvcopy[]={arg1,arg2,arg3,arg4,arg5}; + + int argc=0; + + if(argv!=NULL) + { + while(argv[argc+1]!=NULL) + { + //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg at 0x%08X: %s", argv[argc],argv[argc]); + + int i=-1; + do{ + i++; + argvcopy[argc][i]=argv[argc+1][i]; + }while(argv[argc+1][i]!=0); + + argc++; + } + } + argvcopy[argc]=NULL; //TODO: load ELF binary and move this to own compilation unit @@ -151,7 +178,6 @@ int syscall_execve(char *name, char **argv, char **env) ext2_check(EXT2_RAM_ADDRESS); ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); - Elf32_Ehdr *elf; elf=0x800000; @@ -226,39 +252,16 @@ int syscall_execve(char *name, char **argv, char **env) } + // argv / argc + asm("push %0" :: "r" (argvcopy)); + asm("push %0" :: "r" (argc)); - /* - // iterate over section headers - for(int shidx=0;shidxe_shnum;shidx++) - { - Elf32_Shdr *shdr=0x800000+elf->e_shoff;//+shidx*elf->e_shentsize; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- SECTION HEADER %d --",shidx); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sh-name idx: %d",shdr->sh_name); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sh-type: %d",shdr->sh_type); - while(1); - } - */ - - static char arg1[]="x";; - static char arg2[]="blah"; - static char arg3[]="foo"; - static char *args[]={arg1,arg2,arg3}; - - asm("push %0" :: "r" (args)); //argv - asm("push $3");//argc - - asm("push $0x800080"); + // push addr and return to it + asm("push %0"::"r"(elf->e_entry)); asm("ret"); - while(1); - /* + // this is never reached! - // autorun "user-space" prog - asm("push $10");//argv TODO: addresse - asm("push $20"); //argc TODO: real number of params! - asm("push $0x800000"); - asm("ret"); - */ } -- cgit v1.2.3