From fb95f07c5d7220a66cd7eb055910c3e005dec09d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 25 Aug 2013 12:49:49 -0700 Subject: [PATCH] Implement cancel and delete for fpls. --- Core/HLE/sceKernel.cpp | 4 ++-- Core/HLE/sceKernelMemory.cpp | 35 +++++++++++++++++++++-------------- Core/HLE/sceKernelMemory.h | 4 ++-- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index dcadc4bd4..7dd0c4b7c 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -796,12 +796,12 @@ const HLEFunction ThreadManForUser[] = {0x39810265,WrapI_IU, "sceKernelReferVplStatus"}, {0xC07BB470,WrapI_CUUUUU, "sceKernelCreateFpl"}, - {0xED1410E0,sceKernelDeleteFpl,"sceKernelDeleteFpl"}, + {0xED1410E0,WrapI_I, "sceKernelDeleteFpl"}, {0xD979E9BF,sceKernelAllocateFpl,"sceKernelAllocateFpl"}, {0xE7282CB6,sceKernelAllocateFplCB,"sceKernelAllocateFplCB"}, {0x623AE665,sceKernelTryAllocateFpl,"sceKernelTryAllocateFpl"}, {0xF6414A71,sceKernelFreeFpl,"sceKernelFreeFpl"}, - {0xA8AA591F,sceKernelCancelFpl,"sceKernelCancelFpl"}, + {0xA8AA591F,WrapI_IU, "sceKernelCancelFpl"}, {0xD8199E4C,sceKernelReferFplStatus,"sceKernelReferFplStatus"}, {0x20fff560,WrapU_CU,"sceKernelCreateVTimer"}, diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index fe74c4af8..b1a1533a6 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -371,24 +371,25 @@ int sceKernelCreateFpl(const char *name, u32 mpid, u32 attr, u32 blockSize, u32 return id; } -void sceKernelDeleteFpl() +int sceKernelDeleteFpl(SceUID uid) { - SceUID id = PARAM(0); u32 error; - FPL *fpl = kernelObjects.Get(id, error); + FPL *fpl = kernelObjects.Get(uid, error); if (fpl) { + DEBUG_LOG(HLE, "sceKernelDeleteFpl(%i)", uid); + bool wokeThreads = __KernelClearFplThreads(fpl, SCE_KERNEL_ERROR_WAIT_DELETE); if (wokeThreads) hleReSchedule("fpl deleted"); userMemory.Free(fpl->address); - DEBUG_LOG(HLE,"sceKernelDeleteFpl(%i)", id); - RETURN(kernelObjects.Destroy(id)); + return kernelObjects.Destroy(uid); } else { - RETURN(error); + DEBUG_LOG(HLE, "sceKernelDeleteFpl(%i): invalid fpl", uid); + return error; } } @@ -570,23 +571,26 @@ retry: } } -void sceKernelCancelFpl() +int sceKernelCancelFpl(SceUID uid, u32 numWaitThreadsPtr) { - SceUID id = PARAM(0); - DEBUG_LOG(HLE,"UNIMPL: sceKernelCancelFpl(%i)", id); u32 error; - FPL *fpl = kernelObjects.Get(id, error); + FPL *fpl = kernelObjects.Get(uid, error); if (fpl) { - // TODO: numWaitThreads param? - RETURN(0); + DEBUG_LOG(HLE, "sceKernelCancelFpl(%i, %08x)", uid, numWaitThreadsPtr); + fpl->nf.numWaitThreads = (int) fpl->waitingThreads.size(); + if (Memory::IsValidAddress(numWaitThreadsPtr)) + Memory::Write_U32(fpl->nf.numWaitThreads, numWaitThreadsPtr); + bool wokeThreads = __KernelClearFplThreads(fpl, SCE_KERNEL_ERROR_WAIT_CANCEL); if (wokeThreads) hleReSchedule("fpl canceled"); + return 0; } else { - RETURN(error); + DEBUG_LOG(HLE, "sceKernelCancelFpl(%i, %08x): invalid fpl", uid, numWaitThreadsPtr); + return error; } } @@ -1423,11 +1427,11 @@ retry: int sceKernelCancelVpl(SceUID uid, u32 numWaitThreadsPtr) { - DEBUG_LOG(HLE, "sceKernelCancelVpl(%i, %08x)", uid, numWaitThreadsPtr); u32 error; VPL *vpl = kernelObjects.Get(uid, error); if (vpl) { + DEBUG_LOG(HLE, "sceKernelCancelVpl(%i, %08x)", uid, numWaitThreadsPtr); vpl->nv.numWaitThreads = (int) vpl->waitingThreads.size(); if (Memory::IsValidAddress(numWaitThreadsPtr)) Memory::Write_U32(vpl->nv.numWaitThreads, numWaitThreadsPtr); @@ -1439,7 +1443,10 @@ int sceKernelCancelVpl(SceUID uid, u32 numWaitThreadsPtr) return 0; } else + { + DEBUG_LOG(HLE, "sceKernelCancelVpl(%i, %08x): invalid vpl", uid, numWaitThreadsPtr); return error; + } } int sceKernelReferVplStatus(SceUID uid, u32 infoPtr) diff --git a/Core/HLE/sceKernelMemory.h b/Core/HLE/sceKernelMemory.h index 0eeac818c..1ad510e64 100644 --- a/Core/HLE/sceKernelMemory.h +++ b/Core/HLE/sceKernelMemory.h @@ -47,12 +47,12 @@ int sceKernelCancelVpl(SceUID uid, u32 numWaitThreadsPtr); int sceKernelReferVplStatus(SceUID uid, u32 infoPtr); int sceKernelCreateFpl(const char *name, u32 mpid, u32 attr, u32 blocksize, u32 numBlocks, u32 optPtr); -void sceKernelDeleteFpl(); +int sceKernelDeleteFpl(SceUID uid); void sceKernelAllocateFpl(); void sceKernelAllocateFplCB(); void sceKernelTryAllocateFpl(); void sceKernelFreeFpl(); -void sceKernelCancelFpl(); +int sceKernelCancelFpl(SceUID uid, u32 numWaitThreadsPtr); void sceKernelReferFplStatus(); int sceKernelGetCompiledSdkVersion();