diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 5939cff..765316b 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -106,7 +106,7 @@ int syscall_write(int file, char *buf, int len) for(int i=0;i<len;i++) { //PutConsoleChar(buf[i],0b1111111111000000); - console_put_char(buf[i]); + console_put_char_green(buf[i]); } return len; } @@ -152,7 +152,7 @@ int syscall_read(int file, char *buf, int len) *buf=c; buf++; l++; - if(c!=0x04)console_put_char_red(c); + if(c!=0x04)console_put_char_white(c); if(c=='\n')return l; if(c==0x04) { @@ -190,7 +190,7 @@ int syscall_execve(char *name, char **argv, char **env) int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); if(inode_nr<1)return -1; - +/* char arg1[100]; char arg2[100]; char arg3[100]; @@ -257,15 +257,19 @@ int syscall_execve(char *name, char **argv, char **env) } - +*/ //TODO: load ELF binary and move this to own compilation unit //load binary + uint32_t vaddr=0x08048000; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading"); ext2_check(EXT2_RAM_ADDRESS); - ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,0x800000,0x100000); + ext2_inode_content(EXT2_RAM_ADDRESS,inode_nr,vaddr,0x100000); // load 1mb; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ELF File loaded to final destination."); Elf32_Ehdr *elf; - elf=0x800000; + elf=vaddr; if(elf->e_ident[0]!=0x7f||elf->e_ident[1]!='E'||elf->e_ident[2]!='L'||elf->e_ident[3]!='F') panic(FOOLOS_MODULE_NAME,"ELF mismatch!?"); @@ -300,7 +304,7 @@ int syscall_execve(char *name, char **argv, char **env) // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { - Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize; + Elf32_Phdr *phdr=vaddr+elf->e_phoff+phidx*elf->e_phentsize; if(phidx==0) { @@ -325,7 +329,7 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz); // let's copy the rw- data block - uint32_t *data=0x800000+phdr->p_offset; + uint32_t *data=vaddr+phdr->p_offset; for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) { *addr=*data; @@ -344,18 +348,24 @@ int syscall_execve(char *name, char **argv, char **env) } - + int i=0; do{ - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envvar %d : 0x%08X : %s" ,i,environ[i],environ[i]); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); i++; - }while(environ[i]!=NULL); - + }while(env[i]!=NULL); - asm("mov $0xf00000,%esp"); // set stack pointer - asm("push %0" :: "r" (argvcopy)); + int argc=0; + do{ + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]); + argc++; + }while(argv[argc]!=NULL); + + asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. + + asm("push %0" :: "r" (argv)); asm("push %0" :: "r" (argc)); - asm("push %0" :: "r" (environ)); + asm("push %0" :: "r" (env)); // push addr and return to it asm("push %0"::"r"(elf->e_entry)); |
