diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 2f4ad30..eb11f1b 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -72,6 +72,8 @@ typedef struct { } Elf32_Phdr; +static uint32_t alloc=0x900000; + int syscall_write(int file, char *buf, int len) { @@ -137,24 +139,22 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env); #endif - // lets first clean some area for loading our prog! - // we need this to zero-initalize 1mb bss and 1mb for prog - for(uint32_t *addr=0x800000; addr<=0xb00000; addr++) - { - *addr=0; - } + //TODO: load ELF binary and move this to own compilation unit + //load binary - ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); + ext2_check(EXT2_RAM_ADDRESS); + ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000-0x1000,0x100000); - //TODO: load ELF binary and move this to own compilation unit Elf32_Ehdr *elf; - elf=0x800000; + elf=0x800000-0x1000; 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!?"); + + /* log(FOOLOS_MODULE_NAME, FOOLOS_LOG_INFO, "elf id: class=%d, data=%d, version=%d osabi=%d abiv=%d ", elf->e_ident[4],elf->e_ident[5],elf->e_ident[6], @@ -176,19 +176,36 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-num: %d",elf->e_shnum); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-strndx: %d",elf->e_shstrndx); + */ + + // iterate over section headers for(int phidx=0;phidx<elf->e_phnum;phidx++) { - Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx); + Elf32_Phdr *phdr=0x800000-0x1000+elf->e_phoff+phidx*elf->e_phentsize; + /* + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx+1); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-type: %d",phdr->p_type); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-offset: 0x%08X",phdr->p_offset); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-vaddr: 0x%08X",phdr->p_vaddr); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-filesz: 0x%08X",phdr->p_filesz); log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"p-memsz: 0x%08X",phdr->p_memsz); + */ + + 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 zero init bss and set alloc (heap) just right after it! + for(uint32_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++) + { + *addr=0; + } + alloc=phdr->p_vaddr+phdr->p_memsz; + } + + /* // iterate over section headers for(int shidx=0;shidx<elf->e_shnum;shidx++) @@ -202,13 +219,21 @@ int syscall_execve(char *name, char **argv, char **env) */ + // autorun "user-space" prog + asm("push $10");//argv TODO: addresse + asm("push $20"); //argc TODO: real number of params! + asm("push $0x800000"); + asm("ret"); + while(1); + /* // autorun "user-space" prog asm("push $10");//argv TODO: addresse asm("push $20"); //argc TODO: real number of params! asm("push $0x800000"); asm("ret"); + */ } @@ -273,9 +298,10 @@ int syscall_lseek(int file,int ptr,int dir) uint32_t syscall_sbrk(int incr, int none1, int none2) { - static uint32_t alloc; + // fool-os-convention to set bss_end: + /* if(incr==0) { alloc=0; @@ -290,6 +316,7 @@ uint32_t syscall_sbrk(int incr, int none1, int none2) alloc=incr; return alloc; } + */ uint32_t oldalloc=alloc; alloc+=incr; |
