diff --git a/Common/Thread/ThreadPool.cpp b/Common/Thread/ThreadPool.cpp index 01d6220b67..2624252a25 100644 --- a/Common/Thread/ThreadPool.cpp +++ b/Common/Thread/ThreadPool.cpp @@ -133,3 +133,10 @@ void ThreadPool::ParallelMemcpy(void *dest, const void *src, int size) { memmove((uint8_t *)dest + l, (const uint8_t *)src + l, h - l); }, 0, size, MIN_SIZE); } + +void ThreadPool::ParallelMemset(void *dest, uint8_t val, int size) { + static const int MIN_SIZE = 128 * 1024; + ParallelLoop([&](int l, int h) { + memset((uint8_t *)dest + l, val, h - l); + }, 0, size, MIN_SIZE); +} diff --git a/Common/Thread/ThreadPool.h b/Common/Thread/ThreadPool.h index a410c2964d..ceac3c39c6 100644 --- a/Common/Thread/ThreadPool.h +++ b/Common/Thread/ThreadPool.h @@ -62,6 +62,7 @@ public: void ParallelLoop(const std::function &loop, int lower, int upper, int minSize); void ParallelMemcpy(void *dest, const void *src, int sz); + void ParallelMemset(void *dest, uint8_t val, int sz); private: int numThreads_; diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index fa8a80b61f..634eb43f58 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -24,10 +24,11 @@ #include "Core/Debugger/MemBlockInfo.h" #include "Core/HLE/HLE.h" #include "Core/HLE/FunctionWrappers.h" -#include "Core/System.h" #include "Core/MIPS/MIPS.h" #include "Core/MemMapHelpers.h" #include "Core/Reporting.h" +#include "Core/System.h" +#include "Core/ThreadPools.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" #include "Common/Serialize/SerializeMap.h" @@ -430,8 +431,8 @@ void __KernelMemoryInit() MemBlockInfoInit(); kernelMemory.Init(PSP_GetKernelMemoryBase(), PSP_GetKernelMemoryEnd() - PSP_GetKernelMemoryBase(), false); userMemory.Init(PSP_GetUserMemoryBase(), PSP_GetUserMemoryEnd() - PSP_GetUserMemoryBase(), false); - Memory::Memset(PSP_GetKernelMemoryBase(), 0, PSP_GetKernelMemoryEnd() - PSP_GetKernelMemoryBase(), "MemInit"); - Memory::Memset(PSP_GetUserMemoryBase(), 0, PSP_GetUserMemoryEnd() - PSP_GetUserMemoryBase(), "MemInit"); + GlobalThreadPool::Memset(Memory::GetPointer(PSP_GetKernelMemoryBase()), 0, PSP_GetUserMemoryEnd() - PSP_GetKernelMemoryBase()); + NotifyMemInfo(MemBlockFlags::WRITE, PSP_GetKernelMemoryBase(), PSP_GetUserMemoryEnd() - PSP_GetKernelMemoryBase(), "MemInit"); INFO_LOG(SCEKERNEL, "Kernel and user memory pools initialized"); vplWaitTimer = CoreTiming::RegisterEvent("VplTimeout", __KernelVplTimeout); diff --git a/Core/MemMap.cpp b/Core/MemMap.cpp index e12cb8af39..1dda153cb3 100644 --- a/Core/MemMap.cpp +++ b/Core/MemMap.cpp @@ -391,15 +391,6 @@ void Shutdown() { DEBUG_LOG(MEMMAP, "Memory system shut down."); } -void Clear() { - if (m_pPhysicalRAM) - memset(GetPointerUnchecked(PSP_GetKernelMemoryBase()), 0, g_MemorySize); - if (m_pPhysicalScratchPad) - memset(m_pPhysicalScratchPad, 0, SCRATCHPAD_SIZE); - if (m_pPhysicalVRAM1) - memset(m_pPhysicalVRAM1, 0, VRAM_SIZE); -} - bool IsActive() { return base != nullptr; } diff --git a/Core/ThreadPools.cpp b/Core/ThreadPools.cpp index 0159392328..e4eb7b5b9d 100644 --- a/Core/ThreadPools.cpp +++ b/Core/ThreadPools.cpp @@ -16,6 +16,11 @@ void GlobalThreadPool::Memcpy(void *dest, const void *src, int size) { pool->ParallelMemcpy(dest, src, size); } +void GlobalThreadPool::Memset(void *dest, uint8_t val, int size) { + std::call_once(init_flag, Inititialize); + pool->ParallelMemset(dest, val, size); +} + void GlobalThreadPool::Inititialize() { pool = make_unique(g_Config.iNumWorkerThreads); } diff --git a/Core/ThreadPools.h b/Core/ThreadPools.h index 6912996435..86af0afdad 100644 --- a/Core/ThreadPools.h +++ b/Core/ThreadPools.h @@ -8,6 +8,7 @@ public: // in parallel on the global thread pool static void Loop(const std::function& loop, int lower, int upper, int minSize = -1); static void Memcpy(void *dest, const void *src, int size); + static void Memset(void *dest, uint8_t val, int size); private: static std::unique_ptr pool;