From ef5eecce560296719dc5dfecd113bc1a55dbfd2f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 20 Sep 2022 00:37:21 -0700 Subject: [PATCH] Kernel: Load volatile memblocks from save states. Otherwise they'd reset to userMemory. --- Core/HLE/sceKernelMemory.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 4bbc7ac767..1a6e16c0fa 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -529,6 +529,16 @@ static BlockAllocator *BlockAllocatorFromID(int id) { return nullptr; } +static int BlockAllocatorToID(const BlockAllocator *alloc) { + if (alloc == &kernelMemory) + return 1; + if (alloc == &userMemory) + return 2; + if (alloc == &volatileMemory) + return 5; + return 0; +} + enum SceKernelFplAttr { PSP_FPL_ATTR_FIFO = 0x0000, @@ -989,18 +999,23 @@ public: alloc->Free(address); } bool IsValid() {return address != (u32)-1;} - BlockAllocator *alloc; void DoState(PointerWrap &p) override { - auto s = p.Section("PMB", 1); + auto s = p.Section("PMB", 1, 2); if (!s) return; Do(p, address); DoArray(p, name, sizeof(name)); + if (s >= 2) { + int allocType = BlockAllocatorToID(alloc); + Do(p, allocType); + alloc = BlockAllocatorFromID(allocType); + } } + BlockAllocator *alloc; u32 address; char name[32]; };