uint64_t elf_vtopProgramHeader(void *elfFile, uint16_t ph, uint64_t vaddr) { uint64_t ph_phys = elf_getProgramHeaderPaddr(elfFile, ph); uint64_t ph_virt = elf_getProgramHeaderPaddr(elfFile, ph); uint64_t paddr; paddr = vaddr - ph_virt + ph_phys; return paddr; }
bool elf_loadFile(void *elfFile, bool phys, intptr_t offset) { int i; if (elf_checkFile(elfFile) != 0) { return false; } for(i=0; i < elf_getNumProgramHeaders(elfFile); i++) { /* Load that section */ uintptr_t dest, src; size_t len; if (phys) { dest = (uintptr_t) elf_getProgramHeaderPaddr(elfFile, i); } else { dest = (uintptr_t) elf_getProgramHeaderVaddr(elfFile, i); } dest += offset; len = elf_getProgramHeaderFileSize(elfFile, i); src = (uintptr_t) elfFile + elf_getProgramHeaderOffset(elfFile, i); memcpy((void*) dest, (void*) src, len); dest += len; memset((void*) dest, 0, elf_getProgramHeaderMemorySize(elfFile, i) - len); } return true; }
void elf_getProgramHeaderInfo(void *elfFile, uint16_t ph, uint64_t *p_vaddr, uint64_t *p_paddr, uint64_t *p_filesz, uint64_t *p_offset, uint64_t *p_memsz) { *p_vaddr = elf_getProgramHeaderVaddr(elfFile, ph); *p_paddr = elf_getProgramHeaderPaddr(elfFile, ph); *p_filesz = elf_getProgramHeaderFileSize(elfFile, ph); *p_offset = elf_getProgramHeaderOffset(elfFile, ph); *p_memsz = elf_getProgramHeaderMemorySize(elfFile, ph); }
bool reios_loadElf(const string& elf) { FILE* f = fopen(elf.c_str(), "rb"); if (!f) { return false; } fseek(f, 0, SEEK_END); size_t size = ftell(f); if (size > 16 * 1024 * 1024) { return false; } void* elfFile = malloc(size); memset(elfFile, 0, size); fseek(f, 0, SEEK_SET); fread(elfFile, 1, size, f); fclose(f); int i; bool phys = false; if (elf_checkFile(elfFile) != 0) { free(elfFile); return false; } for (i = 0; i < elf_getNumProgramHeaders(elfFile); i++) { /* Load that section */ uint64_t dest, src; size_t len; if (phys) { dest = elf_getProgramHeaderPaddr(elfFile, i); } else { dest = elf_getProgramHeaderVaddr(elfFile, i); } len = elf_getProgramHeaderFileSize(elfFile, i); src = (uint64_t)(uintptr_t)elfFile + elf_getProgramHeaderOffset(elfFile, i); u8* ptr = GetMemPtr(dest, len); memcpy((void*)ptr, (void*)(uintptr_t)src, len); ptr += len; memset((void*)ptr, 0, elf_getProgramHeaderMemorySize(elfFile, i) - len); } return true; }
bool elf_getMemoryBounds(void *elfFile, bool phys, uint64_t *min, uint64_t *max) { uint64_t mem_min = UINT64_MAX; uint64_t mem_max = 0; int i; if (elf_checkFile(elfFile) != 0) { return false; } for(i=0; i < elf_getNumProgramHeaders(elfFile); i++) { uint64_t sect_min, sect_max; if (elf_getProgramHeaderMemorySize(elfFile, i) == 0) { continue; } if (phys) { sect_min = elf_getProgramHeaderPaddr(elfFile, i); } else { sect_min = elf_getProgramHeaderVaddr(elfFile, i); } sect_max = sect_min + elf_getProgramHeaderMemorySize(elfFile, i); if (sect_max > mem_max) { mem_max = sect_max; } if (sect_min < mem_min) { mem_min = sect_min; } } *min = mem_min; *max = mem_max; return true; };