From 1422c8d21bcde04f4375fab39ecddc969c7d2527 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 22 Feb 2020 04:15:13 -0800 Subject: [PATCH] Kernel: Delay better in sceKernelReferThreadStatus. Sometimes this is called in loops, so correct timing for errors. --- Core/HLE/sceKernel.cpp | 2 +- Core/HLE/sceKernelThread.cpp | 31 ++++++++++++------------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 2effbb5a26..ad571355ef 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -739,7 +739,7 @@ const HLEFunction ThreadManForUser[] = {0X3B183E26, &WrapI_I, "sceKernelGetThreadExitStatus", 'i', "i" }, {0X52089CA1, &WrapI_I, "sceKernelGetThreadStackFreeSize", 'i', "i" }, {0XFFC36A14, &WrapU_UU, "sceKernelReferThreadRunStatus", 'x', "xx" }, - {0X17C1684E, &WrapU_UU, "sceKernelReferThreadStatus", 'x', "xx" }, + {0X17C1684E, &WrapU_UU, "sceKernelReferThreadStatus", 'i', "xp" }, {0X2C34E053, &WrapI_I, "sceKernelReleaseWaitThread", 'i', "i" }, {0X75156E8F, &WrapI_I, "sceKernelResumeThread", 'i', "i" }, {0X3AD58B8C, &WrapU_V, "sceKernelSuspendDispatchThread", 'x', "", HLE_NOT_IN_INTERRUPT }, diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 5d9dd685fd..53b8895304 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1256,44 +1256,37 @@ u32 sceKernelReferThreadStatus(u32 threadID, u32 statusPtr) u32 error; Thread *t = kernelObjects.Get(threadID, error); - if (!t) - { - ERROR_LOG(SCEKERNEL, "%08x=sceKernelReferThreadStatus(%i, %08x): bad thread", error, threadID, statusPtr); - return error; + if (!t) { + hleEatCycles(700); + hleReSchedule("refer thread status"); + return hleLogError(SCEKERNEL, error, "bad thread"); } u32 wantedSize = Memory::Read_U32(statusPtr); - if (sceKernelGetCompiledSdkVersion() > 0x02060010) - { - if (wantedSize > THREADINFO_SIZE_AFTER_260) - { - ERROR_LOG(SCEKERNEL, "%08x=sceKernelReferThreadStatus(%i, %08x): bad size %d", SCE_KERNEL_ERROR_ILLEGAL_SIZE, threadID, statusPtr, wantedSize); - return SCE_KERNEL_ERROR_ILLEGAL_SIZE; + if (sceKernelGetCompiledSdkVersion() > 0x02060010) { + if (wantedSize > THREADINFO_SIZE_AFTER_260) { + hleEatCycles(1200); + hleReSchedule("refer thread status"); + return hleLogError(SCEKERNEL, SCE_KERNEL_ERROR_ILLEGAL_SIZE, "bad size %d", wantedSize); } - VERBOSE_LOG(SCEKERNEL, "sceKernelReferThreadStatus(%i, %08x)", threadID, statusPtr); - t->nt.nativeSize = THREADINFO_SIZE_AFTER_260; if (wantedSize != 0) Memory::Memcpy(statusPtr, &t->nt, std::min(wantedSize, (u32)sizeof(t->nt))); // TODO: What is this value? Basic tests show 0... if (wantedSize > sizeof(t->nt)) Memory::Memset(statusPtr + sizeof(t->nt), 0, wantedSize - sizeof(t->nt)); - } - else - { - VERBOSE_LOG(SCEKERNEL, "sceKernelReferThreadStatus(%i, %08x)", threadID, statusPtr); - + } else { t->nt.nativeSize = THREADINFO_SIZE; u32 sz = std::min(THREADINFO_SIZE, wantedSize); if (sz != 0) Memory::Memcpy(statusPtr, &t->nt, sz); } - hleEatCycles(1220); + hleEatCycles(1400); hleReSchedule("refer thread status"); - return 0; + return hleLogSuccessVerboseI(SCEKERNEL, 0); } // Thanks JPCSP