SPU loader fix

This commit is contained in:
Nekotekina 2014-11-28 21:56:16 +03:00
parent ea1bad8724
commit 936aeed0a5
2 changed files with 16 additions and 5 deletions

View file

@ -86,7 +86,16 @@ namespace loader
{ {
case MACHINE_MIPS: break; 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_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; return ok;
@ -94,6 +103,8 @@ namespace loader
handler::error_code elf32::load_data(u32 offset) 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) for (auto &phdr : m_phdrs)
{ {
u32 memsz = m_ehdr.is_le() ? phdr.data_le.p_memsz : phdr.data_be.p_memsz; 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 case 0x00000001: //LOAD
if (phdr.data_le.p_memsz) 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); LOG_ERROR(LOADER, "%s(): AllocFixed(0x%llx, 0x%x) failed", __FUNCTION__, vaddr, memsz);

View file

@ -27,7 +27,7 @@ namespace loader
u16 e_type; u16 e_type;
u16 e_machine; u16 e_machine;
u32 e_version; u32 e_version;
u16 e_entry; u32 e_entry;
u32 e_phoff; u32 e_phoff;
u32 e_shoff; u32 e_shoff;
u32 e_flags; u32 e_flags;
@ -45,7 +45,7 @@ namespace loader
be_t<u16> e_type; be_t<u16> e_type;
be_t<u16> e_machine; be_t<u16> e_machine;
be_t<u32> e_version; be_t<u32> e_version;
be_t<u16> e_entry; be_t<u32> e_entry;
be_t<u32> e_phoff; be_t<u32> e_phoff;
be_t<u32> e_shoff; be_t<u32> e_shoff;
be_t<u32> e_flags; be_t<u32> e_flags;
@ -59,7 +59,7 @@ namespace loader
}; };
bool is_le() const { return e_data == 1; } bool is_le() const { return e_data == 1; }
bool check() const { return e_magic == 0x7F454C46; } bool check() const { return e_magic == 0x464C457F; }
}; };
struct shdr struct shdr