diff options
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 137 |
1 files changed, 133 insertions, 4 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index d2efbc8..2f4ad30 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -1,4 +1,5 @@ #define FOOLOS_MODULE_NAME "syscalls" + #include "lib/buffer/ringbuffer.h" #include "lib/logger/log.h" #include "lib/bool/bool.h" @@ -8,8 +9,69 @@ #include "kernel/config.h" #include <sys/stat.h> +#define EI_NIDENT 16 + + +typedef uint32_t Elf32_Addr; +typedef uint32_t Elf32_Off; +typedef uint16_t Elf32_Section; +typedef uint16_t Elf32_Versym; +typedef unsigned char Elf_Byte; +typedef uint16_t Elf32_Half; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf32_Word; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf32_Xword; +typedef struct +{ + + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; + +} +Elf32_Ehdr; + + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} +Elf32_Phdr; + int syscall_write(int file, char *buf, int len) { @@ -26,6 +88,7 @@ int syscall_write(int file, char *buf, int len) return len; } + int syscall_read(int file, char *buf, int len) { @@ -57,6 +120,7 @@ int syscall_read(int file, char *buf, int len) } + int syscall_readdir(const char *name,fs_dirent *dirs,int max) { #ifdef LOG_SYSCALLS @@ -66,22 +130,80 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) return fs_readdir(name,dirs,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 // lets first clean some area for loading our prog! - // we need this to zero-initalize bss + // we need this to zero-initalize 1mb bss and 1mb for prog for(uint32_t *addr=0x800000; addr<=0xb00000; addr++) { *addr=0; } - + //load binary ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000); + //TODO: load ELF binary and move this to own compilation unit + + Elf32_Ehdr *elf; + elf=0x800000; + + 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=0x800000+elf->e_phoff+phidx*elf->e_phentsize; + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx); + 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); + + } + /* + // iterate over section headers + for(int shidx=0;shidx<elf->e_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); + } + */ + + + while(1); + // autorun "user-space" prog asm("push $10");//argv TODO: addresse asm("push $20"); //argc TODO: real number of params! @@ -89,6 +211,7 @@ int syscall_execve(char *name, char **argv, char **env) asm("ret"); } + int syscall_open(char *name, int flags, int mode) { #ifdef LOG_SYSCALLS @@ -99,6 +222,7 @@ int syscall_open(char *name, int flags, int mode) } + //newcomers // int syscall_close(int file,int none1,int none2) @@ -110,6 +234,7 @@ int syscall_close(int file,int none1,int none2) return -1; } + int syscall_fstat(int file, struct stat *st,int none) { #ifdef LOG_SYSCALLS @@ -120,6 +245,7 @@ int syscall_fstat(int file, struct stat *st,int none) return 0; } + int syscall_isatty(int file,int none1,int none2) { #ifdef LOG_SYSCALLS @@ -129,6 +255,7 @@ int syscall_isatty(int file,int none1,int none2) return 1; } + int syscall_lseek(int file,int ptr,int dir) { @@ -143,6 +270,7 @@ int syscall_lseek(int file,int ptr,int dir) } + uint32_t syscall_sbrk(int incr, int none1, int none2) { static uint32_t alloc; @@ -194,6 +322,7 @@ uint32_t syscall_sbrk(int incr, int none1, int none2) */ } + int syscall_exit(int ret, int none1, int none2) { #ifdef LOG_SYSCALLS |
