summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-11-22 02:27:58 +0100
committerMichal Idziorek <m.i@gmx.at>2014-11-22 02:27:58 +0100
commit4ef54112ec3d3772cb97984a26c85299b8065316 (patch)
treeb9b1a8593ef1c041e2783b63966b54b96c294561 /kernel
parent904f68134bb3f6b50629ddcb6007b3a735ce4b72 (diff)
working on ELF support
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel.c9
-rw-r--r--kernel/mem.c2
-rw-r--r--kernel/syscalls.c137
-rw-r--r--kernel/vmem.c6
4 files changed, 142 insertions, 12 deletions
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 128f5dd..156ce21 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -62,6 +62,11 @@ void kernel_main(uint32_t initial_stack, int mp)
mem_init(0x7c00+1,*((uint16_t *)(0x7c00)));
//
+ // Activate Virtual Memory (paging)
+ //
+ vmem_init();
+
+ //
// init output to screen
//
console_init();
@@ -115,10 +120,6 @@ void kernel_main(uint32_t initial_stack, int mp)
//smp_start_aps(&procdata,0x80000); // starts at 0x80000
// but it will be copied over mbr
- //
- // Activate Virtual Memory (paging)
- //
- // vmem_init();
//
diff --git a/kernel/mem.c b/kernel/mem.c
index 5d3a300..b2ab6ad 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -224,7 +224,7 @@ void mem_init(uint16_t *memmap,uint16_t entries)
}
// here is somewhere our kernel stuff ;) // TODO!! better.
- pmmngr_deinit_region(0x0,0x30000);
+ pmmngr_deinit_region(0x0,0x600000);
// and here is the memory map that we JUST created!
pmmngr_deinit_region(_mmngr_memory_map,mem_array_size*4);
diff --git a/kernel/syscalls.c b/kernel/syscalls.c
index d2efbc8..2f4ad30 100644
--- a/kernel/syscalls.c
+++ b/kernel/syscalls.c
@@ -1,4 +1,5 @@
#define FOOLOS_MODULE_NAME "syscalls"
+
#include "lib/buffer/ringbuffer.h"
#include "lib/logger/log.h"
#include "lib/bool/bool.h"
@@ -8,8 +9,69 @@
#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;
+
int syscall_write(int file, char *buf, int len)
{
@@ -26,6 +88,7 @@ int syscall_write(int file, char *buf, int len)
return len;
}
+
int syscall_read(int file, char *buf, int len)
{
@@ -57,6 +120,7 @@ int syscall_read(int file, char *buf, int len)
}
+
int syscall_readdir(const char *name,fs_dirent *dirs,int max)
{
#ifdef LOG_SYSCALLS
@@ -66,22 +130,80 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max)
return fs_readdir(name,dirs,max);
}
+
int syscall_execve(char *name, char **argv, char **env)
{
- #ifdef LOG_SYSCALLS
+#ifdef LOG_SYSCALLS
log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X, argvs=0x%08X, env=0x%08X)", name,argv,env);
- #endif
+#endif
// lets first clean some area for loading our prog!
- // we need this to zero-initalize bss
+ // we need this to zero-initalize 1mb bss and 1mb for prog
for(uint32_t *addr=0x800000; addr<=0xb00000; addr++)
{
*addr=0;
}
-
+ //load binary
ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000);
+ //TODO: load ELF binary and move this to own compilation unit
+
+ Elf32_Ehdr *elf;
+ elf=0x800000;
+
+ 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=0x800000+elf->e_phoff+phidx*elf->e_phentsize;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- PROGRAMM HEADER %d --",phidx);
+ 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);
+
+ }
+ /*
+ // iterate over section headers
+ for(int shidx=0;shidx<elf->e_shnum;shidx++)
+ {
+ Elf32_Shdr *shdr=0x800000+elf->e_shoff;//+shidx*elf->e_shentsize;
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"-- SECTION HEADER %d --",shidx);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sh-name idx: %d",shdr->sh_name);
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"sh-type: %d",shdr->sh_type);
+ while(1);
+ }
+ */
+
+
+ while(1);
+
// autorun "user-space" prog
asm("push $10");//argv TODO: addresse
asm("push $20"); //argc TODO: real number of params!
@@ -89,6 +211,7 @@ int syscall_execve(char *name, char **argv, char **env)
asm("ret");
}
+
int syscall_open(char *name, int flags, int mode)
{
#ifdef LOG_SYSCALLS
@@ -99,6 +222,7 @@ int syscall_open(char *name, int flags, int mode)
}
+
//newcomers
//
int syscall_close(int file,int none1,int none2)
@@ -110,6 +234,7 @@ int syscall_close(int file,int none1,int none2)
return -1;
}
+
int syscall_fstat(int file, struct stat *st,int none)
{
#ifdef LOG_SYSCALLS
@@ -120,6 +245,7 @@ int syscall_fstat(int file, struct stat *st,int none)
return 0;
}
+
int syscall_isatty(int file,int none1,int none2)
{
#ifdef LOG_SYSCALLS
@@ -129,6 +255,7 @@ int syscall_isatty(int file,int none1,int none2)
return 1;
}
+
int syscall_lseek(int file,int ptr,int dir)
{
@@ -143,6 +270,7 @@ int syscall_lseek(int file,int ptr,int dir)
}
+
uint32_t syscall_sbrk(int incr, int none1, int none2)
{
static uint32_t alloc;
@@ -194,6 +322,7 @@ uint32_t syscall_sbrk(int incr, int none1, int none2)
*/
}
+
int syscall_exit(int ret, int none1, int none2)
{
#ifdef LOG_SYSCALLS
diff --git a/kernel/vmem.c b/kernel/vmem.c
index ceef26d..502b700 100644
--- a/kernel/vmem.c
+++ b/kernel/vmem.c
@@ -222,14 +222,14 @@ void vmem_init()
uint32_t phys_addr=0;
uint32_t virt_addr=0;
- // first 10 pages are identity mapped
- for(int i=0;i<16;i++)
+ // first pages are identity mapped
+ for(int j=0;j<20;j++)
{
ptable* table = (ptable*) pmmngr_alloc_block ();
if (!table)panic(FOOLOS_MODULE_NAME,"unable to alloc table");
- log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table);
+// log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"table: 0x%X",table);
//! idenitity mapping