From 43382a0ac649958dfec234363b1448299b7703bd Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Mon, 3 Nov 2014 14:35:50 +0300 Subject: [PATCH] Something is wrong with entry points... --- rpcs3/Emu/System.cpp | 20 +++++++++++++++++--- rpcs3/Loader/ELF32.cpp | 8 ++++++-- rpcs3/Loader/ELF32.h | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index ce48b9edc5..e6c3ff9e3f 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -383,10 +383,24 @@ void Emulator::Load() } break; - default: - thread.SetEntry(l.GetEntry()); + case MACHINE_ARM: + { + u32 entry = l.GetEntry(); + + auto code = vm::psv::ptr::make(entry & ~3); + + // evil way to find entry point in .sceModuleInfo.rodata + while (code[0] != 0xffffffffu) + { + entry = code[0] + 0x81000000; + code++; + } + + thread.SetEntry(entry & ~1); thread.Run(); - break; + + break; + } } m_status = Ready; diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index b4c7d110cf..995a913ce9 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -352,7 +352,7 @@ bool ELF32Loader::LoadPhdrInfo() for(size_t i=0; i= entry && entry < phdr_arr[i].p_paddr + phdr_arr[i].p_memsz) + if(phdr_arr[i].p_offset >= entry && entry < phdr_arr[i].p_offset + phdr_arr[i].p_memsz) { entry += phdr_arr[i].p_vaddr; LOG_WARNING(LOADER, "virtual entry = 0x%x", entry); @@ -360,6 +360,10 @@ bool ELF32Loader::LoadPhdrInfo() } } } + else if (machine == MACHINE_ARM) + { + entry += 0x81000000; + } return true; } @@ -601,7 +605,7 @@ bool ELF32Loader::LoadShdrData(u64 offset) } else { - LOG_ERROR(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); + LOG_NOTICE(LOADER, "sceRefs: unknown code found (code=0x%x, code1=0x%x, code2=0x%x, code3=0x%x)", rel[j].code, rel[j].code1, rel[j].code2, rel[j].code3); } } } diff --git a/rpcs3/Loader/ELF32.h b/rpcs3/Loader/ELF32.h index 9e1a8a5948..1d573824d3 100644 --- a/rpcs3/Loader/ELF32.h +++ b/rpcs3/Loader/ELF32.h @@ -15,7 +15,7 @@ struct Elf32_Ehdr u16 e_type; u16 e_machine; u32 e_version; - u16 e_entry; + u32 e_entry; u32 e_phoff; u32 e_shoff; u32 e_flags;