mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-09 00:11:24 +12:00
Removed old / unnecessary code
* Removed Plugins.h file as I assume setting up a plugin hell is a bad idea (does anyone disagree?). * Removed FnIdGenerator, and moved FnIdGenerator::GenerateFnId to getFunctionId in Modules.cpp * Disabled RSX Debugger and Memory Viewer when the emulator is stopped. * ELF64Loader::LoadPhdrData refactored.
This commit is contained in:
parent
08d61163ea
commit
0002cc0af3
23 changed files with 175 additions and 696 deletions
|
@ -210,31 +210,27 @@ bool ELF64Loader::LoadEhdrData(u64 offset)
|
|||
|
||||
bool ELF64Loader::LoadPhdrData(u64 offset)
|
||||
{
|
||||
for(u32 i=0; i<phdr_arr.size(); ++i)
|
||||
for(auto& phdr: phdr_arr)
|
||||
{
|
||||
phdr_arr[i].Show();
|
||||
phdr.Show();
|
||||
|
||||
if(phdr_arr[i].p_vaddr < min_addr)
|
||||
if (phdr.p_vaddr < min_addr)
|
||||
{
|
||||
min_addr = phdr_arr[i].p_vaddr;
|
||||
min_addr = phdr.p_vaddr;
|
||||
}
|
||||
|
||||
if(phdr_arr[i].p_vaddr + phdr_arr[i].p_memsz > max_addr)
|
||||
if (phdr.p_vaddr + phdr.p_memsz > max_addr)
|
||||
{
|
||||
max_addr = phdr_arr[i].p_vaddr + phdr_arr[i].p_memsz;
|
||||
max_addr = phdr.p_vaddr + phdr.p_memsz;
|
||||
}
|
||||
|
||||
if(phdr_arr[i].p_vaddr != phdr_arr[i].p_paddr)
|
||||
if (phdr.p_vaddr != phdr.p_paddr)
|
||||
{
|
||||
LOG_WARNING
|
||||
(
|
||||
LOADER,
|
||||
"ElfProgram different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x",
|
||||
phdr_arr[i].p_paddr, phdr_arr[i].p_vaddr
|
||||
);
|
||||
LOG_WARNING(LOADER, "ElfProgram different load addrs: paddr=0x%8.8x, vaddr=0x%8.8x",
|
||||
phdr.p_paddr, phdr.p_vaddr);
|
||||
}
|
||||
|
||||
if(!Memory.MainMem.IsInMyRange(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_memsz))
|
||||
if(!Memory.MainMem.IsInMyRange(offset + phdr.p_vaddr, phdr.p_memsz))
|
||||
{
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_WARNING(LOADER, "Skipping...");
|
||||
|
@ -243,57 +239,48 @@ bool ELF64Loader::LoadPhdrData(u64 offset)
|
|||
continue;
|
||||
}
|
||||
|
||||
switch(phdr_arr[i].p_type)
|
||||
switch(phdr.p_type)
|
||||
{
|
||||
case 0x00000001: //LOAD
|
||||
if(phdr_arr[i].p_memsz)
|
||||
if(phdr.p_memsz)
|
||||
{
|
||||
Memory.MainMem.AllocFixed(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_memsz);
|
||||
Memory.MainMem.AllocFixed(offset + phdr.p_vaddr, phdr.p_memsz);
|
||||
|
||||
if(phdr_arr[i].p_filesz)
|
||||
if(phdr.p_filesz)
|
||||
{
|
||||
elf64_f.Seek(phdr_arr[i].p_offset);
|
||||
elf64_f.Read(&Memory[offset + phdr_arr[i].p_vaddr], phdr_arr[i].p_filesz);
|
||||
Emu.GetSFuncManager().StaticAnalyse(&Memory[offset + phdr_arr[i].p_vaddr], phdr_arr[i].p_filesz, phdr_arr[i].p_vaddr);
|
||||
elf64_f.Seek(phdr.p_offset);
|
||||
elf64_f.Read(&Memory[offset + phdr.p_vaddr], phdr.p_filesz);
|
||||
Emu.GetSFuncManager().StaticAnalyse(&Memory[offset + phdr.p_vaddr], phdr.p_filesz, phdr.p_vaddr);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x00000007: //TLS
|
||||
Emu.SetTLSData(offset + phdr_arr[i].p_vaddr, phdr_arr[i].p_filesz, phdr_arr[i].p_memsz);
|
||||
Emu.SetTLSData(offset + phdr.p_vaddr, phdr.p_filesz, phdr.p_memsz);
|
||||
break;
|
||||
|
||||
case 0x60000001: //LOOS+1
|
||||
{
|
||||
if(!phdr_arr[i].p_filesz) break;
|
||||
if(!phdr.p_filesz)
|
||||
break;
|
||||
|
||||
const sys_process_param& proc_param = *(sys_process_param*)&Memory[offset + phdr_arr[i].p_vaddr];
|
||||
const sys_process_param& proc_param = *(sys_process_param*)&Memory[offset + phdr.p_vaddr];
|
||||
|
||||
if(re(proc_param.size) < sizeof(sys_process_param))
|
||||
{
|
||||
LOG_WARNING(LOADER, "Bad proc param size! [0x%x : 0x%x]", re(proc_param.size), sizeof(sys_process_param));
|
||||
if (proc_param.size < sizeof(sys_process_param)) {
|
||||
LOG_WARNING(LOADER, "Bad proc param size! [0x%x : 0x%x]", proc_param.size, sizeof(sys_process_param));
|
||||
}
|
||||
|
||||
if(re(proc_param.magic) != 0x13bcc5f6)
|
||||
{
|
||||
LOG_ERROR(LOADER, "Bad magic! [0x%x]", Memory.Reverse32(proc_param.magic));
|
||||
if (proc_param.magic != 0x13bcc5f6) {
|
||||
LOG_ERROR(LOADER, "Bad magic! [0x%x]", proc_param.magic);
|
||||
}
|
||||
else
|
||||
{
|
||||
sys_process_param_info& info = Emu.GetInfo().GetProcParam();
|
||||
info.sdk_version = re(proc_param.info.sdk_version);
|
||||
info.primary_prio = re(proc_param.info.primary_prio);
|
||||
info.primary_stacksize = re(proc_param.info.primary_stacksize);
|
||||
info.malloc_pagesize = re(proc_param.info.malloc_pagesize);
|
||||
info.ppc_seg = re(proc_param.info.ppc_seg);
|
||||
//info.crash_dump_param_addr = re(proc_param.info.crash_dump_param_addr);
|
||||
else {
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version);
|
||||
LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio);
|
||||
LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize);
|
||||
LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize);
|
||||
LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg);
|
||||
//LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr);
|
||||
sys_process_param_info& info = Emu.GetInfo().GetProcParam();
|
||||
LOG_NOTICE(LOADER, "*** sdk version: 0x%x", info.sdk_version.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** primary prio: %d", info.primary_prio.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** primary stacksize: 0x%x", info.primary_stacksize.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** malloc pagesize: 0x%x", info.malloc_pagesize.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** ppc seg: 0x%x", info.ppc_seg.ToLE());
|
||||
//LOG_NOTICE(LOADER, "*** crash dump param addr: 0x%x", info.crash_dump_param_addr.ToLE());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -301,113 +288,89 @@ bool ELF64Loader::LoadPhdrData(u64 offset)
|
|||
|
||||
case 0x60000002: //LOOS+2
|
||||
{
|
||||
if(!phdr_arr[i].p_filesz) break;
|
||||
if(!phdr.p_filesz)
|
||||
break;
|
||||
|
||||
sys_proc_prx_param proc_prx_param = *(sys_proc_prx_param*)&Memory[offset + phdr_arr[i].p_vaddr];
|
||||
sys_proc_prx_param proc_prx_param = *(sys_proc_prx_param*)&Memory[offset + phdr.p_vaddr];
|
||||
|
||||
proc_prx_param.size = re(proc_prx_param.size);
|
||||
proc_prx_param.magic = re(proc_prx_param.magic);
|
||||
proc_prx_param.version = re(proc_prx_param.version);
|
||||
proc_prx_param.libentstart = re(proc_prx_param.libentstart);
|
||||
proc_prx_param.libentend = re(proc_prx_param.libentend);
|
||||
proc_prx_param.libstubstart = re(proc_prx_param.libstubstart);
|
||||
proc_prx_param.libstubend = re(proc_prx_param.libstubend);
|
||||
proc_prx_param.ver = re(proc_prx_param.ver);
|
||||
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "*** size: 0x%x", proc_prx_param.size);
|
||||
LOG_NOTICE(LOADER, "*** magic: 0x%x", proc_prx_param.magic);
|
||||
LOG_NOTICE(LOADER, "*** version: 0x%x", proc_prx_param.version);
|
||||
LOG_NOTICE(LOADER, "*** libentstart: 0x%x", proc_prx_param.libentstart);
|
||||
LOG_NOTICE(LOADER, "*** libentend: 0x%x", proc_prx_param.libentend);
|
||||
LOG_NOTICE(LOADER, "*** libstubstart: 0x%x", proc_prx_param.libstubstart);
|
||||
LOG_NOTICE(LOADER, "*** libstubend: 0x%x", proc_prx_param.libstubend);
|
||||
LOG_NOTICE(LOADER, "*** ver: 0x%x", proc_prx_param.ver);
|
||||
LOG_NOTICE(LOADER, "*** size: 0x%x", proc_prx_param.size.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** magic: 0x%x", proc_prx_param.magic.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** version: 0x%x", proc_prx_param.version.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** libentstart: 0x%x", proc_prx_param.libentstart.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** libentend: 0x%x", proc_prx_param.libentend.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** libstubstart: 0x%x", proc_prx_param.libstubstart.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** libstubend: 0x%x", proc_prx_param.libstubend.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** ver: 0x%x", proc_prx_param.ver.ToLE());
|
||||
#endif
|
||||
|
||||
if(proc_prx_param.magic != 0x1b434cec)
|
||||
{
|
||||
LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic);
|
||||
if (proc_prx_param.magic != 0x1b434cec) {
|
||||
LOG_ERROR(LOADER, "Bad magic! (0x%x)", proc_prx_param.magic.ToLE());
|
||||
break;
|
||||
}
|
||||
else
|
||||
|
||||
for(u32 s=proc_prx_param.libstubstart; s<proc_prx_param.libstubend; s+=sizeof(Elf64_StubHeader))
|
||||
{
|
||||
for(u32 s=proc_prx_param.libstubstart; s<proc_prx_param.libstubend; s+=sizeof(Elf64_StubHeader))
|
||||
{
|
||||
Elf64_StubHeader stub = *(Elf64_StubHeader*)Memory.GetMemFromAddr(offset + s);
|
||||
Elf64_StubHeader stub = *(Elf64_StubHeader*)Memory.GetMemFromAddr(offset + s);
|
||||
|
||||
stub.s_size = re(stub.s_size);
|
||||
stub.s_version = re(stub.s_version);
|
||||
stub.s_unk0 = re(stub.s_unk0);
|
||||
stub.s_unk1 = re(stub.s_unk1);
|
||||
stub.s_imports = re(stub.s_imports);
|
||||
stub.s_modulename = re(stub.s_modulename);
|
||||
stub.s_nid = re(stub.s_nid);
|
||||
stub.s_text = re(stub.s_text);
|
||||
|
||||
const std::string& module_name = Memory.ReadString(stub.s_modulename);
|
||||
Module* module = Emu.GetModuleManager().GetModuleByName(module_name);
|
||||
if(module)
|
||||
{
|
||||
//module->SetLoaded();
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str());
|
||||
}
|
||||
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "");
|
||||
LOG_NOTICE(LOADER, "*** size: 0x%x", stub.s_size);
|
||||
LOG_NOTICE(LOADER, "*** version: 0x%x", stub.s_version);
|
||||
LOG_NOTICE(LOADER, "*** unk0: 0x%x", stub.s_unk0);
|
||||
LOG_NOTICE(LOADER, "*** unk1: 0x%x", stub.s_unk1);
|
||||
LOG_NOTICE(LOADER, "*** imports: %d", stub.s_imports);
|
||||
LOG_NOTICE(LOADER, "*** module name: %s [0x%x]", module_name.c_str(), stub.s_modulename);
|
||||
LOG_NOTICE(LOADER, "*** nid: 0x%x", stub.s_nid);
|
||||
LOG_NOTICE(LOADER, "*** text: 0x%x", stub.s_text);
|
||||
#endif
|
||||
static const u32 section = 4 * 3;
|
||||
u64 tbl = Memory.MainMem.AllocAlign(stub.s_imports * 4 * 2);
|
||||
u64 dst = Memory.MainMem.AllocAlign(stub.s_imports * section);
|
||||
|
||||
for(u32 i=0; i<stub.s_imports; ++i)
|
||||
{
|
||||
const u32 nid = Memory.Read32(stub.s_nid + i*4);
|
||||
const u32 text = Memory.Read32(stub.s_text + i*4);
|
||||
|
||||
if(module)
|
||||
{
|
||||
if(!module->Load(nid))
|
||||
{
|
||||
LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str());
|
||||
}
|
||||
}
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "import %d:", i+1);
|
||||
LOG_NOTICE(LOADER, "*** nid: 0x%x (0x%x)", nid, stub.s_nid + i*4);
|
||||
LOG_NOTICE(LOADER, "*** text: 0x%x (0x%x)", text, stub.s_text + i*4);
|
||||
#endif
|
||||
Memory.Write32(stub.s_text + i*4, tbl + i*8);
|
||||
|
||||
mem32_ptr_t out_tbl(tbl + i*8);
|
||||
out_tbl += dst + i*section;
|
||||
out_tbl += Emu.GetModuleManager().GetFuncNumById(nid);
|
||||
|
||||
mem32_ptr_t out_dst(dst + i*section);
|
||||
out_dst += OR(11, 2, 2, 0);
|
||||
out_dst += SC(2);
|
||||
out_dst += BCLR(0x10 | 0x04, 0, 0, 0);
|
||||
}
|
||||
const std::string& module_name = Memory.ReadString(stub.s_modulename);
|
||||
Module* module = Emu.GetModuleManager().GetModuleByName(module_name);
|
||||
if (module) {
|
||||
//module->SetLoaded();
|
||||
}
|
||||
else {
|
||||
LOG_WARNING(LOADER, "Unknown module '%s'", module_name.c_str());
|
||||
}
|
||||
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, " ");
|
||||
LOG_NOTICE(LOADER, "");
|
||||
LOG_NOTICE(LOADER, "*** size: 0x%x", stub.s_size);
|
||||
LOG_NOTICE(LOADER, "*** version: 0x%x", stub.s_version.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** unk0: 0x%x", stub.s_unk0);
|
||||
LOG_NOTICE(LOADER, "*** unk1: 0x%x", stub.s_unk1.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** imports: %d", stub.s_imports.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** module name: %s [0x%x]", module_name.c_str(), stub.s_modulename.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** nid: 0x%016llx [0x%x]", Memory.Read64(stub.s_nid), stub.s_nid.ToLE());
|
||||
LOG_NOTICE(LOADER, "*** text: 0x%x", stub.s_text.ToLE());
|
||||
#endif
|
||||
static const u32 section = 4 * 3;
|
||||
u64 tbl = Memory.MainMem.AllocAlign(stub.s_imports * 4 * 2);
|
||||
u64 dst = Memory.MainMem.AllocAlign(stub.s_imports * section);
|
||||
|
||||
for(u32 i=0; i<stub.s_imports; ++i)
|
||||
{
|
||||
const u32 nid = Memory.Read32(stub.s_nid + i*4);
|
||||
const u32 text = Memory.Read32(stub.s_text + i*4);
|
||||
|
||||
if (module && !module->Load(nid)) {
|
||||
LOG_WARNING(LOADER, "Unimplemented function '%s' in '%s' module", SysCalls::GetHLEFuncName(nid).c_str(), module_name.c_str());
|
||||
}
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "import %d:", i+1);
|
||||
LOG_NOTICE(LOADER, "*** nid: 0x%x (0x%x)", nid, stub.s_nid + i*4);
|
||||
LOG_NOTICE(LOADER, "*** text: 0x%x (0x%x)", text, stub.s_text + i*4);
|
||||
#endif
|
||||
Memory.Write32(stub.s_text + i*4, tbl + i*8);
|
||||
|
||||
mem32_ptr_t out_tbl(tbl + i*8);
|
||||
out_tbl += dst + i*section;
|
||||
out_tbl += Emu.GetModuleManager().GetFuncNumById(nid);
|
||||
|
||||
mem32_ptr_t out_dst(dst + i*section);
|
||||
out_dst += OR(11, 2, 2, 0);
|
||||
out_dst += SC(2);
|
||||
out_dst += BCLR(0x10 | 0x04, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, "");
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
#ifdef LOADER_DEBUG
|
||||
LOG_NOTICE(LOADER, " ");
|
||||
LOG_NOTICE(LOADER, "");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -461,7 +424,7 @@ bool ELF64Loader::LoadShdrData(u64 offset)
|
|||
switch(shdr.sh_type)
|
||||
{
|
||||
case SHT_NOBITS:
|
||||
//ConLog.Warning("SHT_NOBITS: addr=0x%llx, size=0x%llx", offset + addr, size);
|
||||
//LOG_WARNING(LOADER, "SHT_NOBITS: addr=0x%llx, size=0x%llx", offset + addr, size);
|
||||
//memset(&Memory[offset + addr], 0, size);
|
||||
break;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue