summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c133
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
- */
}