summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-22 15:46:24 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-22 15:46:24 +0100
commit795b1f7df203ae33e1d0eb13612f0ba2abf4351e (patch)
tree42c4d8f94b6e7a9815ea5b3fe52a251d004d4b87 /kernel/syscalls.c
parent4ef54112ec3d3772cb97984a26c85299b8065316 (diff)
fix / workaround for my ELF binaries
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c51
1 files changed, 39 insertions, 12 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 2f4ad30..eb11f1b 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -72,6 +72,8 @@ typedef struct {
}
Elf32_Phdr;
+static uint32_t alloc=0x900000;
+
int syscall_write(int file, char *buf, int len)
{
@@ -137,24 +139,22 @@ int syscall_execve(char *name, char **argv, char **env)
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env);
#endif
- // lets first clean some area for loading our prog!
- // we need this to zero-initalize 1mb bss and 1mb for prog
- for(uint32_t *addr=0x800000; addr<=0xb00000; addr++)
- {
- *addr=0;
- }
+ //TODO: load ELF binary and move this to own compilation unit
+
//load binary
- ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000);
+ ext2_check(EXT2_RAM_ADDRESS);
+ ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000-0x1000,0x100000);
- //TODO: load ELF binary and move this to own compilation unit
Elf32_Ehdr *elf;
- elf=0x800000;
+ elf=0x800000-0x1000;
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],
@@ -176,19 +176,36 @@ int syscall_execve(char *name, char **argv, char **env)
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);
+ Elf32_Phdr *phdr=0x800000-0x1000+elf->e_phoff+phidx*elf->e_phentsize;
+ /*
+ 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,"bss: 0x%08X-0x%08X",phdr->p_vaddr+phdr->p_filesz,phdr->p_vaddr+phdr->p_memsz);
+
+ // 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;
+
}
+
+
/*
// iterate over section headers
for(int shidx=0;shidx<elf->e_shnum;shidx++)
@@ -202,13 +219,21 @@ int syscall_execve(char *name, char **argv, char **env)
*/
+ // autorun "user-space" prog
+ asm("push $10");//argv TODO: addresse
+ asm("push $20"); //argc TODO: real number of params!
+ asm("push $0x800000");
+ asm("ret");
+
while(1);
+ /*
// autorun "user-space" prog
asm("push $10");//argv TODO: addresse
asm("push $20"); //argc TODO: real number of params!
asm("push $0x800000");
asm("ret");
+ */
}
@@ -273,9 +298,10 @@ int syscall_lseek(int file,int ptr,int dir)
uint32_t syscall_sbrk(int incr, int none1, int none2)
{
- static uint32_t alloc;
+
// fool-os-convention to set bss_end:
+ /*
if(incr==0)
{
alloc=0;
@@ -290,6 +316,7 @@ uint32_t syscall_sbrk(int incr, int none1, int none2)
alloc=incr;
return alloc;
}
+ */
uint32_t oldalloc=alloc;
alloc+=incr;