diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 133 |
1 files changed, 13 insertions, 120 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index 7bdb639..41d77ec 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -8,9 +8,8 @@ #include "kernel/console.h" #include "kernel/config.h" #include <sys/stat.h> -#include "fs/elf.c" -static uint32_t alloc; +static uint32_t alloc; // TODO: implement on a per process basis! int syscall_unhandled(int nr) { @@ -20,7 +19,6 @@ int syscall_unhandled(int nr) int syscall_lseek(int file,int ptr,int dir) { - #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"lseek (file=%d, ptr=%d, dir=%d)", file,ptr,dir); #endif @@ -31,6 +29,8 @@ int syscall_lseek(int file,int ptr,int dir) } + +// TODO: /dev/console or /dev/tty1 - /dev/ttyN int syscall_write(int file, char *buf, int len) { @@ -50,7 +50,7 @@ int syscall_write(int file, char *buf, int len) return len; } - +// TODO: /dev/kb int syscall_read(int file, char *buf, int len) { static bool eof=false; @@ -125,20 +125,8 @@ int syscall_wait(int *wait, int none1, int none2) #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] wait ",task_get_current_pid()); #endif -} - -int syscall_fork(int none, int none2, int none3) -{ - //int pid=add_task(esp,vmem_new_space_dir()); - int pid=task_get_current_pid(); - int esp=0; - - #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] fork: current esp: 0x%08X, pid: %d ",task_get_current_pid(),esp,pid); - #endif - - return 0; + panic(FOOLOS_MODULE_NAME,"unhandled syscall"); } int syscall_execve(char *name, char **argv1, char **env1) @@ -149,96 +137,12 @@ int syscall_execve(char *name, char **argv1, char **env1) #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); #endif - - int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name); - if(inode_nr<1)return -1; - - //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,vaddr,0x100000); // load 1mb; - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"ELF File loaded to final destination."); - - Elf32_Ehdr *elf; - 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!?"); - - - /* - 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], - elf->e_ident[7],elf->e_ident[8]); - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf type: 0x%04x",elf->e_type); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf machine: 0x%04x",elf->e_machine); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf version: %d",elf->e_version); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf entry: 0x%08X",elf->e_entry); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf ph-offset: 0x%08X",elf->e_phoff); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-offset: 0x%08X",elf->e_shoff); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf flags: 0x%08X",elf->e_flags); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf eh-size (bytes): %d",elf->e_ehsize); - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf ph-ent-size(bytes): %d",elf->e_phentsize); - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf ph-num: %d",elf->e_phnum); - - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-ent-size(byte): %d",elf->e_shentsize); - 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=vaddr+elf->e_phoff+phidx*elf->e_phentsize; - - if(phidx==0) - { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"text: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); - } - - if(phidx==1) - { - - - /* - 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,"data: 0x%08X-0x%08X",phdr->p_vaddr,phdr->p_vaddr+phdr->p_filesz); - 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=vaddr+phdr->p_offset; - for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) - { - *addr=*data; - data++; - } - - // 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; - } - - + uint32_t entry=load_elf(name,&alloc); + if(!entry) + { + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve: bailing out!"); + return -1; // errror loading } @@ -261,8 +165,9 @@ int syscall_execve(char *name, char **argv1, char **env1) asm("push %0" :: "r" (env)); // push addr and return to it - asm("push %0"::"r"(elf->e_entry)); + asm("push %0"::"r"(entry)); + asm("sti"); asm("ret"); // this is never reached! @@ -276,7 +181,6 @@ int syscall_open(char *name, int flags, int mode) #endif panic(FOOLOS_MODULE_NAME,"unhandled syscall"); - } @@ -304,6 +208,7 @@ int syscall_isatty(int file,int none1,int none2) return 1; } +// TODO: per process basis! uint32_t syscall_sbrk(int incr, int none1, int none2) { uint32_t oldalloc=alloc; @@ -324,18 +229,6 @@ int syscall_exit(int ret, char **env, int none2) panic(FOOLOS_MODULE_NAME,"exit not supported yet" ); - /* - int i=0; - while(env[i]!=NULL) - { - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envvar %s (0x%08X)\n" ,env[i],env[i]); - i++; - } - - asm("mov $0x05bff,%esp"); // set stack pointer - static char *argv[]={"shell","--silent",NULL}; - syscall_execve("/bin/foolshell",argv,env); // start shell - */ } |
