diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 11731cd72c..a1663778b8 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -700,10 +700,10 @@ const HLEFunction ThreadManForUser[] = {0x71bc9871,WrapI_II,"sceKernelChangeThreadPriority"}, {0x446D8DE6,WrapI_CUUIUU,"sceKernelCreateThread"}, {0x9fa03cd3,WrapI_I,"sceKernelDeleteThread"}, - {0xBD123D9E,sceKernelDelaySysClockThread,"sceKernelDelaySysClockThread"}, - {0x1181E963,sceKernelDelaySysClockThreadCB,"sceKernelDelaySysClockThreadCB"}, - {0xceadeb47,WrapI_U,"sceKernelDelayThread", HLE_NOT_DISPATCH_SUSPENDED}, - {0x68da9e36,WrapI_U,"sceKernelDelayThreadCB", HLE_NOT_DISPATCH_SUSPENDED}, + {0xBD123D9E,WrapI_U, "sceKernelDelaySysClockThread", HLE_NOT_DISPATCH_SUSPENDED}, + {0x1181E963,WrapI_U, "sceKernelDelaySysClockThreadCB", HLE_NOT_DISPATCH_SUSPENDED}, + {0xceadeb47,WrapI_U, "sceKernelDelayThread", HLE_NOT_DISPATCH_SUSPENDED}, + {0x68da9e36,WrapI_U, "sceKernelDelayThreadCB", HLE_NOT_DISPATCH_SUSPENDED}, {0xaa73c935,WrapV_I,"sceKernelExitThread"}, {0x809ce29b,WrapV_I,"sceKernelExitDeleteThread"}, {0x94aa61ee,sceKernelGetThreadCurrentPriority,"sceKernelGetThreadCurrentPriority"}, diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index dd87b449e6..5e9237e775 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2410,44 +2410,42 @@ int sceKernelDelayThread(u32 usec) return 0; } -void sceKernelDelaySysClockThreadCB() +int sceKernelDelaySysClockThreadCB(u32 sysclockAddr) { - u32 sysclockAddr = PARAM(0); - if (!Memory::IsValidAddress(sysclockAddr)) { - ERROR_LOG(HLE, "sceKernelDelaySysClockThread(%08x) - bad pointer", sysclockAddr); - RETURN(-1); - return; + PSPPointer sysclock; + sysclock = sysclockAddr; + if (!sysclock.IsValid()) { + ERROR_LOG(HLE, "sceKernelDelaySysClockThreadCB(%08x) - bad pointer", sysclockAddr); + return -1; } - SceKernelSysClock sysclock; - Memory::ReadStruct(sysclockAddr, &sysclock); // TODO: Which unit? - u64 usec = sysclock.lo | ((u64)sysclock.hi << 32); - DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec); + u64 usec = sysclock->lo | ((u64)sysclock->hi << 32); + DEBUG_LOG(HLE, "sceKernelDelaySysClockThreadCB(%08x (%llu))", sysclockAddr, usec); SceUID curThread = __KernelGetCurThread(); __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed"); + return 0; } -void sceKernelDelaySysClockThread() +int sceKernelDelaySysClockThread(u32 sysclockAddr) { - u32 sysclockAddr = PARAM(0); - if (!Memory::IsValidAddress(sysclockAddr)) { + PSPPointer sysclock; + sysclock = sysclockAddr; + if (!sysclock.IsValid()) { ERROR_LOG(HLE, "sceKernelDelaySysClockThread(%08x) - bad pointer", sysclockAddr); - RETURN(-1); - return; + return -1; } - SceKernelSysClock sysclock; - Memory::ReadStruct(sysclockAddr, &sysclock); // TODO: Which unit? - u64 usec = sysclock.lo | ((u64)sysclock.hi << 32); + u64 usec = sysclock->lo | ((u64)sysclock->hi << 32); DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec); SceUID curThread = __KernelGetCurThread(); __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed"); + return 0; } u32 __KernelGetThreadPrio(SceUID id) diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index b52f1b9f66..aece5716d7 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -29,8 +29,8 @@ int __KernelCreateThread(const char *threadName, SceUID moduleID, u32 entry, u32 int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr); int sceKernelDelayThread(u32 usec); int sceKernelDelayThreadCB(u32 usec); -void sceKernelDelaySysClockThread(); -void sceKernelDelaySysClockThreadCB(); +int sceKernelDelaySysClockThread(u32 sysclockAddr); +int sceKernelDelaySysClockThreadCB(u32 sysclockAddr); int sceKernelDeleteThread(int threadHandle); void sceKernelExitDeleteThread(int exitStatus); void sceKernelExitThread(int exitStatus);