summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-27 00:29:45 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-27 00:29:45 +0100
commit0e402637492f34a4d0e1302fbe34344e19bc4813 (patch)
tree6c42e23b23f5bb703d27700e96444224e2eb87e2 /kernel/syscalls.c
parent7393db6692c861bc66164c0dd9b83f23a554775b (diff)
Progs at vmem=0x8048000 and Improved Console Ouput
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index 5939cff..765316b 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -106,7 +106,7 @@ int syscall_write(int file, char *buf, int len)
for(int i=0;i<len;i++)
{
//PutConsoleChar(buf[i],0b1111111111000000);
- console_put_char(buf[i]);
+ console_put_char_green(buf[i]);
}
return len;
}
@@ -152,7 +152,7 @@ int syscall_read(int file, char *buf, int len)
*buf=c;
buf++;
l++;
- if(c!=0x04)console_put_char_red(c);
+ if(c!=0x04)console_put_char_white(c);
if(c=='\n')return l;
if(c==0x04)
{
@@ -190,7 +190,7 @@ int syscall_execve(char *name, char **argv, char **env)
int inode_nr=ext2_filename_to_inode(EXT2_RAM_ADDRESS,name);
if(inode_nr<1)return -1;
-
+/*
char arg1[100];
char arg2[100];
char arg3[100];
@@ -257,15 +257,19 @@ int syscall_execve(char *name, char **argv, char **env)
}
-
+*/
//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,0x800000,0x100000);
+ 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=0x800000;
+ 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!?");
@@ -300,7 +304,7 @@ int syscall_execve(char *name, char **argv, char **env)
// iterate over section headers
for(int phidx=0;phidx<elf->e_phnum;phidx++)
{
- Elf32_Phdr *phdr=0x800000+elf->e_phoff+phidx*elf->e_phentsize;
+ Elf32_Phdr *phdr=vaddr+elf->e_phoff+phidx*elf->e_phentsize;
if(phidx==0)
{
@@ -325,7 +329,7 @@ int syscall_execve(char *name, char **argv, char **env)
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=0x800000+phdr->p_offset;
+ uint32_t *data=vaddr+phdr->p_offset;
for(uint32_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++)
{
*addr=*data;
@@ -344,18 +348,24 @@ int syscall_execve(char *name, char **argv, char **env)
}
-
+
int i=0;
do{
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envvar %d : 0x%08X : %s" ,i,environ[i],environ[i]);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]);
i++;
- }while(environ[i]!=NULL);
-
+ }while(env[i]!=NULL);
- asm("mov $0xf00000,%esp"); // set stack pointer
- asm("push %0" :: "r" (argvcopy));
+ int argc=0;
+ do{
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]);
+ argc++;
+ }while(argv[argc]!=NULL);
+
+ asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start.
+
+ asm("push %0" :: "r" (argv));
asm("push %0" :: "r" (argc));
- asm("push %0" :: "r" (environ));
+ asm("push %0" :: "r" (env));
// push addr and return to it
asm("push %0"::"r"(elf->e_entry));