summaryrefslogtreecommitdiff
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
parent4ef54112ec3d3772cb97984a26c85299b8065316 (diff)
fix / workaround for my ELF binaries
-rw-r--r--Makefile1
-rw-r--r--boot2/disk_load_16.asm2
-rw-r--r--boot2/stage2.asm6
-rw-r--r--fs/ext2.h1
-rw-r--r--kernel/kernel.c2
-rw-r--r--kernel/syscalls.c51
-rw-r--r--userspace/Makefile6
-rw-r--r--userspace/linker.ld28
8 files changed, 79 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index 91e04e9..61b9df6 100644
--- a/Makefile
+++ b/Makefile
@@ -32,6 +32,7 @@ CC=i686-foolos-gcc
############ compiler flags ############
CFLAGS=
+CFLAGS=-w
CFLAGS+=-ffreestanding
CFLATS+=-Wall
CFLAGS+=-Wextra
diff --git a/boot2/disk_load_16.asm b/boot2/disk_load_16.asm
index 52912f4..f326bec 100644
--- a/boot2/disk_load_16.asm
+++ b/boot2/disk_load_16.asm
@@ -90,7 +90,7 @@ disk_load_lba:
add bx,0x0800
mov ax,[LBA]
- add ax,64 ; 64 sectors = 0x2000*4 bytes ;16 sectors this is 0x200*0x10 butes
+ add ax,64 ; 64 sectors = 0x2000*4 bytes
mov [LBA],ax
cmp bx,0x9000
diff --git a/boot2/stage2.asm b/boot2/stage2.asm
index ad1e4ea..3a469e8 100644
--- a/boot2/stage2.asm
+++ b/boot2/stage2.asm
@@ -42,6 +42,7 @@ MEMMAP_OFFSET equ 0x7c01
VESA_MODES equ 0x9300 ; do NOT overwrite yourself! be careful!
VESA_MODE_INFO equ 0x9400
VESA_MODE_SELECT equ 0x4114
+CHUNKS_TO_LOAD equ 0x0a ;number of 0x8000 * 512 byte chunks to load into ram
;
jmp boot_16 ;start boot process
@@ -145,7 +146,7 @@ kernel_load:
; init vesa on last iteration!
mov ax,[KERNEL_CHUNK]
- cmp ax,0x5
+ cmp ax,(CHUNKS_TO_LOAD-1)
jne skip_vesa_init
%ifndef FOOLOS_CONSOLE
@@ -177,7 +178,8 @@ boot_32_pm:
mov [KERNEL_CHUNK],ax
;check if all chunkgs loaded (hardcoded to 0x6 for a start)
- cmp ax,0x6
+ ;each chunk is 0x8000 * 15 bytes
+ cmp ax,CHUNKS_TO_LOAD
je finish_load
; show KERNEL CHUNK value
diff --git a/fs/ext2.h b/fs/ext2.h
index e74d55f..a5f46b3 100644
--- a/fs/ext2.h
+++ b/fs/ext2.h
@@ -2,3 +2,4 @@
int ext2_check(uint8_t *ram);
int ext2_inode_content(char *ram,int inode_nr,uint8_t *ramdest,int max);
int ext2_read_dir(uint8_t *ram, int inode_nr,fs_dirent *dirs,int max);
+
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 156ce21..45c8fbb 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -64,7 +64,7 @@ void kernel_main(uint32_t initial_stack, int mp)
//
// Activate Virtual Memory (paging)
//
- vmem_init();
+ //vmem_init();
//
// init output to screen
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;
diff --git a/userspace/Makefile b/userspace/Makefile
index 0797db2..a0817e3 100644
--- a/userspace/Makefile
+++ b/userspace/Makefile
@@ -1,9 +1,11 @@
CC=i686-foolos-gcc
+CFLAGS=-w
+LDFLAGS=-T linker.ld
PROGS=shell simple brainfuck add
ext2.img: $(PROGS)
- dd if=/dev/zero of=ext2.img bs=512 count=2000
+ dd if=/dev/zero of=ext2.img bs=512 count=5000
sudo mkfs.ext2 -O none ext2.img -F
mkdir mnt
sudo mount ext2.img mnt
@@ -11,7 +13,7 @@ ext2.img: $(PROGS)
mkdir mnt/miguel
echo "hello one" > mnt/miguel/test1.txt
echo "hello two" > mnt/test2.txt
- cp $< mnt
+ cp $^ mnt
# cp shell.bin mnt
cp ~/temp/fool-os-stuff/binutils-fool-build/binutils/elfedit mnt
sync
diff --git a/userspace/linker.ld b/userspace/linker.ld
new file mode 100644
index 0000000..99ae573
--- /dev/null
+++ b/userspace/linker.ld
@@ -0,0 +1,28 @@
+/* OUTPUT_FORMAT(binary) */
+
+SECTIONS
+{
+ . = 0x800000;
+
+ /*
+
+ .text : ALIGN(0x1000) {
+ _TEXT_START_ = .;
+ *(.text)
+ _TEXT_END_ = .;
+ }
+
+ .data : ALIGN(0x1000) {
+ _DATA_START_ = .;
+ *(.data)
+ _DATA_END_ = .;
+ }
+
+ .bss : ALIGN(0x1000) {
+ _BSS_START_ = .;
+ *(.bss)
+ _BSS_END_ = .;
+ }
+ */
+
+}