diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index 69bb114d89..e3b4fde2af 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -53,7 +53,7 @@ SceUID threadAdhocID; recursive_mutex adhocEvtMtx; std::vector> adhocctlEvents; std::vector matchingEvents; -u32 dummyThreadHackAddr; +u32 dummyThreadHackAddr = 0; u32_le dummyThreadCode[3]; std::map adhocctlHandlers; @@ -84,11 +84,14 @@ void __NetAdhocShutdown() { if (netAdhocInited) { sceNetAdhocTerm(); } - kernelMemory.Free(dummyThreadHackAddr); + if (dummyThreadHackAddr) { + kernelMemory.Free(dummyThreadHackAddr); + dummyThreadHackAddr = 0; + } } void __NetAdhocDoState(PointerWrap &p) { - auto s = p.Section("sceNetAdhoc", 1); + auto s = p.Section("sceNetAdhoc", 1, 2); if (!s) return; @@ -97,12 +100,21 @@ void __NetAdhocDoState(PointerWrap &p) { p.Do(netAdhocMatchingInited); p.Do(adhocctlHandlers); - //p.Do(actionAfterMatchingMipsCall); // This could cause incompatibility with old savestate right? - //__KernelRestoreActionType(actionAfterMatchingMipsCall, AfterMatchingMipsCall::Create); + if (s >= 2) { + p.Do(actionAfterMatchingMipsCall); + __KernelRestoreActionType(actionAfterMatchingMipsCall, AfterMatchingMipsCall::Create); - //u32 blockSize = sizeof(dummyThreadCode); - //dummyThreadHackAddr = kernelMemory.Alloc(blockSize, false, "dummythreadhack"); - Memory::Memcpy(dummyThreadHackAddr, dummyThreadCode, sizeof(dummyThreadCode)); + p.Do(dummyThreadHackAddr); + } else if (p.mode == p.MODE_READ) { + // Previously, this wasn't being saved. It needs its own space. + if (strcmp("dummythreadhack", kernelMemory.GetBlockTag(dummyThreadHackAddr)) != 0) { + u32 blockSize = sizeof(dummyThreadCode); + dummyThreadHackAddr = kernelMemory.Alloc(blockSize, false, "dummythreadhack"); + } + } + if (dummyThreadHackAddr) { + Memory::Memcpy(dummyThreadHackAddr, dummyThreadCode, sizeof(dummyThreadCode)); + } } void __UpdateAdhocctlHandlers(u32 flag, u32 error) { diff --git a/Core/Util/BlockAllocator.cpp b/Core/Util/BlockAllocator.cpp index 847ac63cdd..7de62c4950 100644 --- a/Core/Util/BlockAllocator.cpp +++ b/Core/Util/BlockAllocator.cpp @@ -330,6 +330,11 @@ void BlockAllocator::CheckBlocks() const } } +const char *BlockAllocator::GetBlockTag(u32 addr) const { + const Block *b = GetBlockFromAddress(addr); + return b->tag; +} + inline BlockAllocator::Block *BlockAllocator::GetBlockFromAddress(u32 addr) { for (Block *bp = bottom_; bp != NULL; bp = bp->next) diff --git a/Core/Util/BlockAllocator.h b/Core/Util/BlockAllocator.h index 3c94db882c..48fc56bc6d 100644 --- a/Core/Util/BlockAllocator.h +++ b/Core/Util/BlockAllocator.h @@ -54,6 +54,8 @@ public: u32 GetLargestFreeBlockSize() const; u32 GetTotalFreeBytes() const; + const char *GetBlockTag(u32 addr) const; + void DoState(PointerWrap &p); private: