diff --git a/Core/ELF/ElfReader.cpp b/Core/ELF/ElfReader.cpp index 043c95e215..9d47e8ce5e 100644 --- a/Core/ELF/ElfReader.cpp +++ b/Core/ELF/ElfReader.cpp @@ -51,7 +51,7 @@ void addrToHiLo(u32 addr, u16 &hi, s16 &lo) } -bool ElfReader::LoadInto(u32 vaddr) +bool ElfReader::LoadInto(u32 loadAddress) { DEBUG_LOG(LOADER,"String section: %i", header->e_shstrndx); @@ -89,8 +89,8 @@ bool ElfReader::LoadInto(u32 vaddr) } } u32 totalSize = totalEnd - totalStart; - if (vaddr) - vaddr = userMemory.AllocAt(vaddr, totalSize, "ELF"); + if (loadAddress) + vaddr = userMemory.AllocAt(loadAddress, totalSize, "ELF"); else vaddr = userMemory.Alloc(totalSize, false, "ELF"); @@ -110,7 +110,6 @@ bool ElfReader::LoadInto(u32 vaddr) for (int i=0; ie_phnum; i++) { Elf32_Phdr *p = segments + i; - INFO_LOG(LOADER, "p = %p", p); DEBUG_LOG(LOADER, "Type: %i Vaddr: %08x Filesz: %i Memsz: %i ", (int)p->p_type, (u32)p->p_vaddr, (int)p->p_filesz, (int)p->p_memsz); if (p->p_type == PT_LOAD) diff --git a/Core/ELF/ElfReader.h b/Core/ELF/ElfReader.h index 4fe8b6e32f..9290cc22b5 100644 --- a/Core/ELF/ElfReader.h +++ b/Core/ELF/ElfReader.h @@ -41,6 +41,7 @@ class ElfReader u32 *sectionAddrs; bool bRelocate; u32 entryPoint; + u32 vaddr; public: ElfReader(void *ptr) { @@ -107,6 +108,12 @@ public: bool DidRelocate() { return bRelocate; } + + u32 GetVaddr() + { + return vaddr; + } + // More indepth stuff:) bool LoadInto(u32 vaddr); bool LoadSymbols(); diff --git a/Core/ELF/PrxDecrypter.cpp b/Core/ELF/PrxDecrypter.cpp index ed7a0f3ab3..69aa9681df 100644 --- a/Core/ELF/PrxDecrypter.cpp +++ b/Core/ELF/PrxDecrypter.cpp @@ -600,11 +600,6 @@ static int DecryptPRX2(const u8 *inbuf, u8 *outbuf, u32 size, u32 tag) return -2; } - if (((size_t)(void*)outbuf & 0x3F)) - { - return -3; - } - if ((size - 0x150) < retsize) { return -4; diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 871fb9cf05..46d43637e7 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -145,20 +145,28 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro u8 *newptr = 0; if (*(u32*)ptr == 0x5053507e) { // "~PSP" - // Decrypt module! YAY! - INFO_LOG(HLE, "Decrypting ~PSP file"); - PSP_Header *head = (PSP_Header*)ptr; - const u8 *in = ptr; - newptr = new u8[std::max(head->elf_size, head->psp_size) + 0x40]; - ptr = (u8*)(((size_t)(newptr + 0x3F) & ~0x3F)); - pspDecryptPRX(in, (u8*)ptr, head->psp_size); + // Decrypt module! YAY! + INFO_LOG(HLE, "Decrypting ~PSP file"); + PSP_Header *head = (PSP_Header*)ptr; + const u8 *in = ptr; + u32 size = head->elf_size; + if (head->psp_size > size) + { + size = head->psp_size; + } + newptr = new u8[head->elf_size + head->psp_size]; + ptr = newptr; + pspDecryptPRX(in, (u8*)ptr, head->psp_size); } if (*(u32*)ptr != 0x464c457f) { ERROR_LOG(HLE, "Wrong magic number %08x",*(u32*)ptr); *error_string = "File corrupt"; - delete [] newptr; + if (newptr) + { + delete [] newptr; + } kernelObjects.Destroy(module->GetUID()); return 0; } @@ -168,7 +176,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro if (!reader.LoadInto(loadAddress)) { ERROR_LOG(HLE, "LoadInto failed"); - delete [] newptr; + if (newptr) + { + delete [] newptr; + } kernelObjects.Destroy(module->GetUID()); return 0; } @@ -203,34 +214,37 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro if (sceModuleInfoSection != -1) modinfo = (PspModuleInfo *)Memory::GetPointer(reader.GetSectionAddr(sceModuleInfoSection)); else - modinfo = (PspModuleInfo *)reader.GetPtr(reader.GetSegmentPaddr(0) + reader.GetSegmentOffset(0)); + modinfo = (PspModuleInfo *)Memory::GetPointer(reader.GetVaddr() + (reader.GetSegmentPaddr(0) & 0x7FFFFFFF) - reader.GetSegmentOffset(0)); bool hasSymbols = false; bool dontadd = false; SectionID textSection = reader.GetSectionByName(".text"); - u32 textStart = reader.GetSectionAddr(textSection); - u32 textSize = reader.GetSectionSize(textSection); + if (textSection != -1) + { + u32 textStart = reader.GetSectionAddr(textSection); + u32 textSize = reader.GetSectionSize(textSection); - if (!host->AttemptLoadSymbolMap()) - { - hasSymbols = reader.LoadSymbols(); - if (!hasSymbols) + if (!host->AttemptLoadSymbolMap()) { - symbolMap.ResetSymbolMap(); - MIPSAnalyst::ScanForFunctions(textStart, textStart+textSize); + hasSymbols = reader.LoadSymbols(); + if (!hasSymbols) + { + symbolMap.ResetSymbolMap(); + MIPSAnalyst::ScanForFunctions(textStart, textStart+textSize); + } + } + else + { + dontadd = true; } - } - else - { - dontadd = true; } module->gp_value = modinfo->gp; strncpy(module->name, modinfo->name, 28); - DEBUG_LOG(LOADER,"Module %s: %08x %08x %08x", modinfo->name, modinfo->gp, modinfo->libent,modinfo->libstub); + INFO_LOG(LOADER,"Module %s: %08x %08x %08x", modinfo->name, modinfo->gp, modinfo->libent,modinfo->libstub); struct PspLibStubEntry { @@ -343,7 +357,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro module->entry_addr = reader.GetEntryPoint(); - delete [] newptr; + if (newptr) + { + delete [] newptr; + } return module; }