From 5a11d4d9c5efb875a3f65a52d7a5d321d8b1a8cc Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Mon, 17 Dec 2012 22:20:32 +0100 Subject: [PATCH] Implement sceKernelGetThreadmanIdList (partially) --- Core/HLE/sceAudio.cpp | 2 +- Core/HLE/sceKernel.cpp | 4 ++-- Core/HLE/sceKernelThread.cpp | 41 ++++++++++++++++++++++++------------ Core/HLE/sceKernelThread.h | 3 ++- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index ea64d027fa..bcfcb6300c 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -226,7 +226,7 @@ u32 sceAudioSetChannelDataLen(u32 chan, u32 len) } else { - INFO_LOG(HLE, "sceAudioSetChannelDataLen(%i, %i)", chan, len); + DEBUG_LOG(HLE, "sceAudioSetChannelDataLen(%i, %i)", chan, len); chans[chan].sampleCount = len; return 0; } diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 3740e35070..9e8fd755db 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -385,8 +385,8 @@ const HLEFunction ThreadManForUser[] = {0x840E8133,sceKernelWaitThreadEndCB,"sceKernelWaitThreadEndCB"}, {0xd13bde95,sceKernelCheckThreadStack,"sceKernelCheckThreadStack"}, - {0x94416130,0,"sceKernelGetThreadmanIdList"}, - {0x57CF62DD,sceKernelGetThreadmanIdType,"sceKernelGetThreadmanIdType"}, + {0x94416130,WrapU_UUUU,"sceKernelGetThreadmanIdList"}, + {0x57CF62DD,WrapU_U,"sceKernelGetThreadmanIdType"}, {0x20fff560,sceKernelCreateVTimer,"sceKernelCreateVTimer"}, {0x328F9E52,0,"sceKernelDeleteVTimer"}, diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 8f0fbdf9eb..b6ad2c7a00 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -522,20 +522,35 @@ void sceKernelGetThreadExitStatus() } } -void sceKernelGetThreadmanIdType() +u32 sceKernelGetThreadmanIdType(u32 uid) { + int type; + if (kernelObjects.GetIDType(uid, &type)) { + DEBUG_LOG(HLE, "%i=sceKernelGetThreadmanIdType(%i)", type, uid); + return type; + } else { + ERROR_LOG(HLE, "sceKernelGetThreadmanIdType(%i) - FAILED", uid); + return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + } +} + +u32 sceKernelGetThreadmanIdList(u32 type, u32 readBufPtr, u32 readBufSize, u32 idCountPtr) { - SceUID uid = PARAM(0); - int type; - if (kernelObjects.GetIDType(uid, &type)) - { - RETURN(type); - DEBUG_LOG(HLE, "%i=sceKernelGetThreadmanIdType(%i)", type, uid); - } - else - { - ERROR_LOG(HLE, "sceKernelGetThreadmanIdType(%i) - FAILED", uid); - RETURN(SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT); - } + DEBUG_LOG(HLE, "sceKernelGetThreadmanIdList(%i, %08x, %i, %08x)", + type, readBufPtr, readBufSize, idCountPtr); + if (!Memory::IsValidAddress(readBufPtr)) + return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + + if (type != SCE_KERNEL_TMID_Thread) { + ERROR_LOG(HLE, "sceKernelGetThreadmanIdList only implemented for threads"); + return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + } + + for (size_t i = 0; i < std::min(readBufSize, threadqueue.size()); i++) + { + Memory::Write_U32(threadqueue[i]->GetUID(), readBufPtr + i * 4); + } + Memory::Write_U32(threadqueue.size(), idCountPtr); + return 0; } // Saves the current CPU context diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index bf9a3631a5..eb99e239e4 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -51,7 +51,8 @@ int sceKernelTerminateDeleteThread(int threadno); int sceKernelTerminateThread(u32 threadID); void sceKernelWaitThreadEndCB(); void sceKernelGetThreadExitStatus(); -void sceKernelGetThreadmanIdType(); +u32 sceKernelGetThreadmanIdType(u32); +u32 sceKernelGetThreadmanIdList(u32 type, u32 readBufPtr, u32 readBufSize, u32 idCountPtr); enum WaitType //probably not the real values