From f48b73082863be3ea5ed5bc5ad0d84bcc16faa26 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 25 Aug 2013 00:14:14 -0700 Subject: [PATCH] Wrap sceKernelCreateFpl and fix refer status. Just initial changes to make it test properly. --- Core/HLE/sceKernel.cpp | 68 ++++++++++++++++++------------------ Core/HLE/sceKernelMemory.cpp | 35 +++++++++++-------- Core/HLE/sceKernelMemory.h | 2 +- 3 files changed, 55 insertions(+), 50 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 702679e25d..dcadc4bd48 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -758,44 +758,44 @@ const HLEFunction ThreadManForUser[] = {0x72F3C145,0,"sceKernelReleaseThreadEventHandler"}, {0x369EEB6B,0,"sceKernelReferThreadEventHandlerStatus"}, - {0x349d6d6c,sceKernelCheckCallback, "sceKernelCheckCallback"}, - {0xE81CAF8F,WrapI_CUU, "sceKernelCreateCallback"}, - {0xEDBA5844,WrapI_I, "sceKernelDeleteCallback"}, - {0xC11BA8C4,WrapI_II, "sceKernelNotifyCallback"}, - {0xBA4051D6,WrapI_I, "sceKernelCancelCallback"}, - {0x2A3D44FF,WrapI_I, "sceKernelGetCallbackCount"}, - {0x730ED8BC,WrapI_IU, "sceKernelReferCallbackStatus"}, + {0x349d6d6c,sceKernelCheckCallback, "sceKernelCheckCallback"}, + {0xE81CAF8F,WrapI_CUU, "sceKernelCreateCallback"}, + {0xEDBA5844,WrapI_I, "sceKernelDeleteCallback"}, + {0xC11BA8C4,WrapI_II, "sceKernelNotifyCallback"}, + {0xBA4051D6,WrapI_I, "sceKernelCancelCallback"}, + {0x2A3D44FF,WrapI_I, "sceKernelGetCallbackCount"}, + {0x730ED8BC,WrapI_IU, "sceKernelReferCallbackStatus"}, - {0x8125221D,WrapI_CUU, "sceKernelCreateMbx"}, - {0x86255ADA,WrapI_I, "sceKernelDeleteMbx"}, - {0xE9B3061E,WrapI_IU, "sceKernelSendMbx"}, - {0x18260574,WrapI_IUU, "sceKernelReceiveMbx"}, - {0xF3986382,WrapI_IUU, "sceKernelReceiveMbxCB"}, - {0x0D81716A,WrapI_IU, "sceKernelPollMbx"}, - {0x87D4DD36,WrapI_IU, "sceKernelCancelReceiveMbx"}, - {0xA8E8C846,WrapI_IU, "sceKernelReferMbxStatus"}, + {0x8125221D,WrapI_CUU, "sceKernelCreateMbx"}, + {0x86255ADA,WrapI_I, "sceKernelDeleteMbx"}, + {0xE9B3061E,WrapI_IU, "sceKernelSendMbx"}, + {0x18260574,WrapI_IUU, "sceKernelReceiveMbx"}, + {0xF3986382,WrapI_IUU, "sceKernelReceiveMbxCB"}, + {0x0D81716A,WrapI_IU, "sceKernelPollMbx"}, + {0x87D4DD36,WrapI_IU, "sceKernelCancelReceiveMbx"}, + {0xA8E8C846,WrapI_IU, "sceKernelReferMbxStatus"}, - {0x7C0DC2A0,WrapI_CIUUU, "sceKernelCreateMsgPipe"}, - {0xF0B7DA1C,WrapI_I, "sceKernelDeleteMsgPipe"}, - {0x876DBFAD,WrapI_IUUUUU, "sceKernelSendMsgPipe"}, - {0x7C41F2C2,WrapI_IUUUUU, "sceKernelSendMsgPipeCB"}, - {0x884C9F90,WrapI_IUUUU, "sceKernelTrySendMsgPipe"}, - {0x74829B76,WrapI_IUUUUU, "sceKernelReceiveMsgPipe"}, - {0xFBFA697D,WrapI_IUUUUU, "sceKernelReceiveMsgPipeCB"}, - {0xDF52098F,WrapI_IUUUU, "sceKernelTryReceiveMsgPipe"}, - {0x349B864D,WrapI_IUU, "sceKernelCancelMsgPipe"}, - {0x33BE4024,WrapI_IU, "sceKernelReferMsgPipeStatus"}, + {0x7C0DC2A0,WrapI_CIUUU, "sceKernelCreateMsgPipe"}, + {0xF0B7DA1C,WrapI_I, "sceKernelDeleteMsgPipe"}, + {0x876DBFAD,WrapI_IUUUUU, "sceKernelSendMsgPipe"}, + {0x7C41F2C2,WrapI_IUUUUU, "sceKernelSendMsgPipeCB"}, + {0x884C9F90,WrapI_IUUUU, "sceKernelTrySendMsgPipe"}, + {0x74829B76,WrapI_IUUUUU, "sceKernelReceiveMsgPipe"}, + {0xFBFA697D,WrapI_IUUUUU, "sceKernelReceiveMsgPipeCB"}, + {0xDF52098F,WrapI_IUUUU, "sceKernelTryReceiveMsgPipe"}, + {0x349B864D,WrapI_IUU, "sceKernelCancelMsgPipe"}, + {0x33BE4024,WrapI_IU, "sceKernelReferMsgPipeStatus"}, - {0x56C039B5,WrapI_CIUUU,"sceKernelCreateVpl"}, - {0x89B3D48C,WrapI_I,"sceKernelDeleteVpl"}, - {0xBED27435,WrapI_IUUU,"sceKernelAllocateVpl"}, - {0xEC0A693F,WrapI_IUUU,"sceKernelAllocateVplCB"}, - {0xAF36D708,WrapI_IUU,"sceKernelTryAllocateVpl"}, - {0xB736E9FF,WrapI_IU,"sceKernelFreeVpl"}, - {0x1D371B8A,WrapI_IU,"sceKernelCancelVpl"}, - {0x39810265,WrapI_IU,"sceKernelReferVplStatus"}, + {0x56C039B5,WrapI_CIUUU, "sceKernelCreateVpl"}, + {0x89B3D48C,WrapI_I, "sceKernelDeleteVpl"}, + {0xBED27435,WrapI_IUUU, "sceKernelAllocateVpl"}, + {0xEC0A693F,WrapI_IUUU, "sceKernelAllocateVplCB"}, + {0xAF36D708,WrapI_IUU, "sceKernelTryAllocateVpl"}, + {0xB736E9FF,WrapI_IU, "sceKernelFreeVpl"}, + {0x1D371B8A,WrapI_IU, "sceKernelCancelVpl"}, + {0x39810265,WrapI_IU, "sceKernelReferVplStatus"}, - {0xC07BB470,sceKernelCreateFpl,"sceKernelCreateFpl"}, + {0xC07BB470,WrapI_CUUUUU, "sceKernelCreateFpl"}, {0xED1410E0,sceKernelDeleteFpl,"sceKernelDeleteFpl"}, {0xD979E9BF,sceKernelAllocateFpl,"sceKernelAllocateFpl"}, {0xE7282CB6,sceKernelAllocateFplCB,"sceKernelAllocateFplCB"}, diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index e1a6571ca6..259db5daa9 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -51,7 +51,6 @@ struct NativeFPL { u32_le size; char name[KERNELOBJECT_MAX_NAME_LENGTH+1]; - SceUID_le mpid; u32_le attr; s32_le blocksize; @@ -195,15 +194,13 @@ void __KernelMemoryShutdown() kernelMemory.Shutdown(); } -//sceKernelCreateFpl(const char *name, SceUID mpid, SceUint attr, SceSize blocksize, int numBlocks, optparam) -void sceKernelCreateFpl() +int sceKernelCreateFpl(const char *name, u32 mpid, u32 attr, u32 blockSize, u32 numBlocks, u32 optPtr) { - const char *name = Memory::GetCharPointer(PARAM(0)); - - u32 mpid = PARAM(1); - u32 attr = PARAM(2); - u32 blockSize = PARAM(3); - u32 numBlocks = PARAM(4); + if (!name) + { + WARN_LOG_REPORT(HLE, "%08x=sceKernelCreateFpl(): invalid name", SCE_KERNEL_ERROR_NO_MEMORY); + return SCE_KERNEL_ERROR_NO_MEMORY; + } u32 totalSize = blockSize * numBlocks; @@ -214,20 +211,21 @@ void sceKernelCreateFpl() { DEBUG_LOG(HLE,"sceKernelCreateFpl(\"%s\", partition=%i, attr=%i, bsize=%i, nb=%i) FAILED - out of ram", name, mpid, attr, blockSize, numBlocks); - RETURN(SCE_KERNEL_ERROR_NO_MEMORY); - return; + return SCE_KERNEL_ERROR_NO_MEMORY; } FPL *fpl = new FPL; SceUID id = kernelObjects.Create(fpl); - strncpy(fpl->nf.name, name, 32); - fpl->nf.size = sizeof(fpl->nf); - fpl->nf.mpid = mpid; // partition + strncpy(fpl->nf.name, name, KERNELOBJECT_MAX_NAME_LENGTH); + fpl->nf.name[KERNELOBJECT_MAX_NAME_LENGTH] = 0; fpl->nf.attr = attr; + fpl->nf.size = sizeof(fpl->nf); fpl->nf.blocksize = blockSize; fpl->nf.numBlocks = numBlocks; + fpl->nf.numFreeBlocks = numBlocks; fpl->nf.numWaitThreads = 0; + fpl->blocks = new bool[fpl->nf.numBlocks]; memset(fpl->blocks, 0, fpl->nf.numBlocks * sizeof(bool)); fpl->address = address; @@ -235,7 +233,7 @@ void sceKernelCreateFpl() DEBUG_LOG(HLE,"%i=sceKernelCreateFpl(\"%s\", partition=%i, attr=%i, bsize=%i, nb=%i)", id, name, mpid, attr, blockSize, numBlocks); - RETURN(id); + return id; } void sceKernelDeleteFpl() @@ -392,6 +390,13 @@ void sceKernelReferFplStatus() FPL *fpl = kernelObjects.Get(id, error); if (fpl) { + // Refresh free block count. + fpl->nf.numFreeBlocks = 0; + for (int i = 0; i < (int)fpl->nf.numBlocks; ++i) + { + if (!fpl->blocks[i]) + ++fpl->nf.numFreeBlocks; + } Memory::WriteStruct(statusAddr, &fpl->nf); RETURN(0); } diff --git a/Core/HLE/sceKernelMemory.h b/Core/HLE/sceKernelMemory.h index b2524ecee6..0eeac818c8 100644 --- a/Core/HLE/sceKernelMemory.h +++ b/Core/HLE/sceKernelMemory.h @@ -46,7 +46,7 @@ int sceKernelFreeVpl(SceUID uid, u32 addr); int sceKernelCancelVpl(SceUID uid, u32 numWaitThreadsPtr); int sceKernelReferVplStatus(SceUID uid, u32 infoPtr); -void sceKernelCreateFpl(); +int sceKernelCreateFpl(const char *name, u32 mpid, u32 attr, u32 blocksize, u32 numBlocks, u32 optPtr); void sceKernelDeleteFpl(); void sceKernelAllocateFpl(); void sceKernelAllocateFplCB();