summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c92
1 files changed, 21 insertions, 71 deletions
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 <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;
+#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;phidx<elf->e_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!