57 lines
1.1 KiB
C++
57 lines
1.1 KiB
C++
#include "reios.h"
|
|
|
|
#include "deps/libelf/elf.h"
|
|
|
|
#include "hw/sh4/sh4_mem.h"
|
|
|
|
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;
|
|
} |