From 292a9ea567992bd781fc6f259ae16067db414827 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 13 Jul 2014 20:25:50 -0700 Subject: [PATCH] Clear module text and bss on unload. Text is set to break instructions, data/bss to -1. Matches results on a PSP. --- Core/HLE/sceKernelModule.cpp | 16 ++++++++++++++-- Core/HLE/sceKernelThread.cpp | 2 +- Core/MIPS/MIPSCodeUtils.h | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 8159b41be1..8b15f2ef93 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -31,6 +31,7 @@ #include "Core/Host.h" #include "Core/MIPS/MIPS.h" #include "Core/MIPS/MIPSAnalyst.h" +#include "Core/MIPS/MIPSCodeUtils.h" #include "Core/ELF/ElfReader.h" #include "Core/ELF/PBPReader.h" #include "Core/ELF/PrxDecrypter.h" @@ -733,6 +734,14 @@ void Module::Cleanup() { for (auto it = exportedFuncs.begin(), end = exportedFuncs.end(); it != end; ++it) { UnexportFuncSymbol(*it); } + + if (memoryBlockAddr != 0 && nm.text_addr != 0 && memoryBlockSize >= nm.data_size + nm.bss_size + nm.text_size) { + DEBUG_LOG(HLE, "Zeroing out module %s memory: %08x - %08x", nm.name, memoryBlockAddr, memoryBlockAddr + memoryBlockSize); + for (u32 i = 0; i < (u32)(nm.text_size + 3); i += 4) { + Memory::Write_U32(MIPS_MAKE_BREAK(1), nm.text_addr + i); + } + Memory::Memset(nm.text_addr + nm.text_size, -1, nm.data_size + nm.bss_size); + } } void __SaveDecryptedEbootToStorageMedia(const u8 *decryptedEbootDataPtr, const u32 length) { @@ -981,15 +990,18 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro } #endif } + } else { + module->nm.text_addr = 0; + module->nm.text_size = 0; } SectionID bssSection = reader.GetSectionByName(".bss"); if (bssSection != -1) { module->nm.bss_size = reader.GetSectionSize(bssSection); - module->nm.data_size = reader.GetTotalDataSize() - module->nm.bss_size; } else { - module->nm.data_size = reader.GetTotalDataSize(); + module->nm.bss_size = 0; } + module->nm.data_size = reader.GetTotalDataSize() - module->nm.bss_size; INFO_LOG(LOADER, "Module %s: %08x %08x %08x", modinfo->name, modinfo->gp, modinfo->libent, modinfo->libstub); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 4b4e09a8b6..c2cb8c0258 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1153,7 +1153,7 @@ void __KernelThreadingInit() MIPS_MAKE_JR_RA(), //MIPS_MAKE_SYSCALL("ThreadManForUser", "sceKernelDelayThread"), MIPS_MAKE_SYSCALL("FakeSysCalls", "_sceKernelIdle"), - MIPS_MAKE_BREAK(), + MIPS_MAKE_BREAK(0), }; // If you add another func here, don't forget __KernelThreadingDoState() below. diff --git a/Core/MIPS/MIPSCodeUtils.h b/Core/MIPS/MIPSCodeUtils.h index 2ad6309984..06445a615a 100644 --- a/Core/MIPS/MIPSCodeUtils.h +++ b/Core/MIPS/MIPSCodeUtils.h @@ -32,7 +32,7 @@ #define MIPS_MAKE_LUI(reg, immval) (0x3c000000 | ((reg) << 16) | (immval)) #define MIPS_MAKE_LW(rt, rs, immval) (0x8c000000 | ((rs) << 21) | ((rt) << 16) | (immval)) #define MIPS_MAKE_SYSCALL(module, function) GetSyscallOp(module, GetNibByName(module, function)) -#define MIPS_MAKE_BREAK() (13) // ! :) +#define MIPS_MAKE_BREAK(n) (((n) << 6) | 13) // ! :) #define MIPS_GET_OP(op) ((op>>26) & 0x3F) #define MIPS_GET_FUNC(op) (op & 0x3F)