From d8331335ff1720ce28eba45afe1a02814b38b033 Mon Sep 17 00:00:00 2001 From: Michal Idziorek Date: Mon, 1 Dec 2014 21:49:22 +0100 Subject: finally implemented fork() syscall --- kernel/syscalls.c | 92 +++++++++++++------------------------------------------ 1 file changed, 21 insertions(+), 71 deletions(-) (limited to 'kernel/syscalls.c') diff --git a/kernel/syscalls.c b/kernel/syscalls.c index f328248..7bdb639 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -8,69 +8,7 @@ #include "kernel/console.h" #include "kernel/config.h" #include - -#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; +#include "fs/elf.c" static uint32_t alloc; @@ -98,7 +36,7 @@ int syscall_write(int file, char *buf, int len) //x86_int_disable(); #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"write(file=%d, buf=0x%08X, len=%d)", file,buf,len); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"[%d] write(file=%d, buf=0x%08X, len=%d)", task_get_current_pid(),file,buf,len); #endif if(file!=1&&file!=2) panic(FOOLOS_MODULE_NAME,"unhandled syscall"); @@ -174,6 +112,7 @@ int syscall_read(int file, char *buf, int len) //TODO: replace with dirent! int syscall_readdir(const char *name,fs_dirent *dirs,int max) { + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"readdir(name=0x%08X, dirs=0x%08X, %d)", name,dirs,max); #endif @@ -181,18 +120,31 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) return fs_readdir(name,dirs,max); } -int syscall_wait() +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 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; + } -int syscall_execve(char *name, char **argv, char **env) +int syscall_execve(char *name, char **argv1, char **env1) { - //x86_int_disable(); - // watchout this is called with esp in virtual memory of running process! + char *argv[]={"/bin/foolshell",NULL}; + char *env[]={"PATH=/bin","PWD=/home/miguel","PS1=$ ",NULL}; #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); @@ -242,7 +194,6 @@ int syscall_execve(char *name, char **argv, char **env) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"elf sh-strndx: %d",elf->e_shstrndx); */ - // iterate over section headers for(int phidx=0;phidxe_phnum;phidx++) { @@ -312,7 +263,6 @@ int syscall_execve(char *name, char **argv, char **env) // push addr and return to it asm("push %0"::"r"(elf->e_entry)); -// x86_int_enable(); asm("ret"); // this is never reached! -- cgit v1.2.3