diff --git a/rpcs3/Loader/ELF32.cpp b/rpcs3/Loader/ELF32.cpp index 377ab7f5ae..3e68915494 100644 --- a/rpcs3/Loader/ELF32.cpp +++ b/rpcs3/Loader/ELF32.cpp @@ -86,7 +86,16 @@ namespace loader { case MACHINE_MIPS: break; case MACHINE_ARM: arm7_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; - case MACHINE_SPU: spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); break; + case MACHINE_SPU: + { + if (!Emu.IsStopped()) + { + break; + } + + spu_thread(m_ehdr.is_le() ? m_ehdr.data_le.e_entry : m_ehdr.data_be.e_entry, "main_thread").args({ Emu.GetPath()/*, "-emu"*/ }).run(); + break; + } } return ok; @@ -94,6 +103,8 @@ namespace loader handler::error_code elf32::load_data(u32 offset) { + Elf_Machine machine = (Elf_Machine)(u16)(m_ehdr.is_le() ? m_ehdr.data_le.e_machine : m_ehdr.data_be.e_machine); + for (auto &phdr : m_phdrs) { u32 memsz = m_ehdr.is_le() ? phdr.data_le.p_memsz : phdr.data_be.p_memsz; @@ -106,7 +117,7 @@ namespace loader case 0x00000001: //LOAD if (phdr.data_le.p_memsz) { - if (!vm::alloc(vaddr, memsz, vm::main)) + if (machine != MACHINE_SPU && !vm::alloc(vaddr, memsz, vm::main)) { LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, vaddr, memsz); diff --git a/rpcs3/Loader/ELF32.h b/rpcs3/Loader/ELF32.h index dc37dd5f0b..d3d37f543c 100644 --- a/rpcs3/Loader/ELF32.h +++ b/rpcs3/Loader/ELF32.h @@ -27,7 +27,7 @@ namespace loader u16 e_type; u16 e_machine; u32 e_version; - u16 e_entry; + u32 e_entry; u32 e_phoff; u32 e_shoff; u32 e_flags; @@ -45,7 +45,7 @@ namespace loader be_t e_type; be_t e_machine; be_t e_version; - be_t e_entry; + be_t e_entry; be_t e_phoff; be_t e_shoff; be_t e_flags; @@ -59,7 +59,7 @@ namespace loader }; bool is_le() const { return e_data == 1; } - bool check() const { return e_magic == 0x7F454C46; } + bool check() const { return e_magic == 0x464C457F; } }; struct shdr