diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 7dd0c4b7c9..f393223d33 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -802,7 +802,7 @@ const HLEFunction ThreadManForUser[] = {0x623AE665,sceKernelTryAllocateFpl,"sceKernelTryAllocateFpl"}, {0xF6414A71,sceKernelFreeFpl,"sceKernelFreeFpl"}, {0xA8AA591F,WrapI_IU, "sceKernelCancelFpl"}, - {0xD8199E4C,sceKernelReferFplStatus,"sceKernelReferFplStatus"}, + {0xD8199E4C,WrapI_IU, "sceKernelReferFplStatus"}, {0x20fff560,WrapU_CU,"sceKernelCreateVTimer"}, {0x328F9E52,WrapU_U,"sceKernelDeleteVTimer"}, diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index b1a1533a6b..f469c10da0 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -594,16 +594,14 @@ int sceKernelCancelFpl(SceUID uid, u32 numWaitThreadsPtr) } } -void sceKernelReferFplStatus() +int sceKernelReferFplStatus(SceUID uid, u32 statusPtr) { - SceUID id = PARAM(0); - u32 statusAddr = PARAM(1); - DEBUG_LOG(HLE,"sceKernelReferFplStatus(%i, %08x)", id, statusAddr); u32 error; - FPL *fpl = kernelObjects.Get(id, error); + FPL *fpl = kernelObjects.Get(uid, error); if (fpl) { - // Refresh free block count. + DEBUG_LOG(HLE, "sceKernelReferFplStatus(%i, %08x)", uid, statusPtr); + // Refresh waiting threads and free block count. fpl->nf.numWaitThreads = (int) fpl->waitingThreads.size(); fpl->nf.numFreeBlocks = 0; for (int i = 0; i < (int)fpl->nf.numBlocks; ++i) @@ -611,12 +609,14 @@ void sceKernelReferFplStatus() if (!fpl->blocks[i]) ++fpl->nf.numFreeBlocks; } - Memory::WriteStruct(statusAddr, &fpl->nf); - RETURN(0); + if (Memory::Read_U32(statusPtr) != 0) + Memory::WriteStruct(statusPtr, &fpl->nf); + return 0; } else { - RETURN(error); + DEBUG_LOG(HLE, "sceKernelReferFplStatus(%i, %08x): invalid fpl", uid, statusPtr); + return error; } } diff --git a/Core/HLE/sceKernelMemory.h b/Core/HLE/sceKernelMemory.h index 1ad510e64e..b2fba15895 100644 --- a/Core/HLE/sceKernelMemory.h +++ b/Core/HLE/sceKernelMemory.h @@ -53,7 +53,7 @@ void sceKernelAllocateFplCB(); void sceKernelTryAllocateFpl(); void sceKernelFreeFpl(); int sceKernelCancelFpl(SceUID uid, u32 numWaitThreadsPtr); -void sceKernelReferFplStatus(); +int sceKernelReferFplStatus(SceUID uid, u32 statusPtr); int sceKernelGetCompiledSdkVersion();