diff options
| author | Michal Idziorek <m.i@gmx.at> | 2015-05-25 17:46:54 +0200 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2015-05-25 17:46:54 +0200 |
| commit | ce50b0f007b8d71078a03d2a83ad8e35b0931dab (patch) | |
| tree | e26d2f3272cdd4d90661345af4f3ac08ed5f55d7 /fs | |
| parent | 2c8cefb3a269d66a6a705bcb4912b0657379273c (diff) | |
fixed critical but in ELF loader and finally got tput etc.. (ncurses) working
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/elf.c | 16 | ||||
| -rw-r--r-- | fs/ext2.c | 1 |
2 files changed, 11 insertions, 6 deletions
@@ -81,7 +81,7 @@ uint32_t load_elf(char *name, uint32_t *alloc) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"loading %s",name); ext2_check(ext2_ramimage); - ext2_inode_content(ext2_ramimage,inode_nr,vaddr,0x100000); // load 1mb; + ext2_inode_content(ext2_ramimage,inode_nr,vaddr,0x100000); // max ignored?? log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"ELF File loaded to final destination."); @@ -144,15 +144,20 @@ uint32_t load_elf(char *name, uint32_t *alloc) log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"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++) + // from right to left so we not overwrite ourselves!! + + //for(uint8_t *addr=phdr->p_vaddr; addr<=phdr->p_vaddr+phdr->p_filesz; addr++) // this was wrong! + //uint8_t *data=vaddr+phdr->p_offset; + uint8_t *data=vaddr+phdr->p_offset+phdr->p_filesz-1; + + for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz-1; addr>=phdr->p_vaddr; addr--) { *addr=*data; - 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++) + for(uint8_t *addr=phdr->p_vaddr+phdr->p_filesz; addr<=phdr->p_vaddr+phdr->p_memsz; addr++) { *addr=0; } @@ -162,6 +167,7 @@ uint32_t load_elf(char *name, uint32_t *alloc) } + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_DEBUG,"heap starts at: 0x%08X",*alloc); return elf->e_entry; @@ -184,7 +184,6 @@ void* ext2_get_indirectstart_double(void *start, uint32_t block_size, uint32_t i int idx=block_idx%(block_size/4); //log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"bl: %d : %d / %d",block_idx,indirect1_idx, idx); - return ext2_get_indirectstart(start,block_size,dil[indirect1_idx],idx); } |
