diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 6038c70725..3a003f6949 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -717,7 +717,7 @@ const HLEFunction ThreadManForUser[] = {0x94aa61ee,sceKernelGetThreadCurrentPriority,"sceKernelGetThreadCurrentPriority"}, {0x293b45b8,WrapI_V,"sceKernelGetThreadId"}, {0x3B183E26,WrapI_I,"sceKernelGetThreadExitStatus"}, - {0x52089CA1,sceKernelGetThreadStackFreeSize,"sceKernelGetThreadStackFreeSize"}, + {0x52089CA1,WrapI_I, "sceKernelGetThreadStackFreeSize"}, {0xFFC36A14,WrapU_UU,"sceKernelReferThreadRunStatus"}, {0x17c1684e,WrapU_UU,"sceKernelReferThreadStatus"}, {0x2C34E053,WrapI_I,"sceKernelReleaseWaitThread"}, diff --git a/Core/HLE/sceKernel.h b/Core/HLE/sceKernel.h index 846c398a43..80aedfde1e 100644 --- a/Core/HLE/sceKernel.h +++ b/Core/HLE/sceKernel.h @@ -389,7 +389,7 @@ int sceKernelDcacheWritebackAll(); int sceKernelDcacheWritebackRange(u32 addr, int size); int sceKernelDcacheWritebackInvalidateRange(u32 addr, int size); int sceKernelDcacheWritebackInvalidateAll(); -void sceKernelGetThreadStackFreeSize(); +int sceKernelGetThreadStackFreeSize(SceUID threadID); u32 sceKernelIcacheInvalidateAll(); u32 sceKernelIcacheClearAll(); int sceKernelIcacheInvalidateRange(u32 addr, int size); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 2e617e3824..06968f73fa 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1852,7 +1852,7 @@ int sceKernelCheckThreadStack() Thread *t = kernelObjects.Get(__KernelGetCurThread(), error); if (t) { u32 diff = labs((long)((s64)currentMIPS->r[MIPS_REG_SP] - (s64)t->currentStack.start)); - WARN_LOG(SCEKERNEL, "%i=sceKernelCheckThreadStack()", diff); + DEBUG_LOG(SCEKERNEL, "%i=sceKernelCheckThreadStack()", diff); return diff; } else { ERROR_LOG_REPORT(SCEKERNEL, "sceKernelCheckThreadStack() - not on thread"); @@ -2148,37 +2148,32 @@ int sceKernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr) return 0; } -void sceKernelGetThreadStackFreeSize() +int sceKernelGetThreadStackFreeSize(SceUID threadID) { - SceUID threadID = PARAM(0); - Thread *thread; - - INFO_LOG(SCEKERNEL,"sceKernelGetThreadStackFreeSize(%i)", threadID); + DEBUG_LOG(SCEKERNEL, "sceKernelGetThreadStackFreeSize(%i)", threadID); if (threadID == 0) - thread = __GetCurrentThread(); - else + threadID = currentThread; + + u32 error; + Thread *thread = kernelObjects.Get(threadID, error); + if (thread == 0) { - u32 error; - thread = kernelObjects.Get(threadID, error); - if (thread == 0) - { - ERROR_LOG(SCEKERNEL,"sceKernelGetThreadStackFreeSize: invalid thread id %i", threadID); - RETURN(error); - return; - } + ERROR_LOG(SCEKERNEL, "sceKernelGetThreadStackFreeSize: invalid thread id %i", threadID); + return error; } - // Scan the stack for 0xFF + // Scan the stack for 0xFF, starting after 0x10 (the thread id is written there.) + // Obviously this doesn't work great if PSP_THREAD_ATTR_NO_FILLSTACK is used. int sz = 0; - for (u32 addr = thread->currentStack.start; addr < thread->currentStack.start + thread->nt.stackSize; addr++) + for (u32 offset = 0x10; offset < thread->nt.stackSize; ++offset) { - if (Memory::Read_U8(addr) != 0xFF) + if (Memory::Read_U8(thread->currentStack.start + offset) != 0xFF) break; sz++; } - RETURN(sz & ~3); + return sz & ~3; } void __KernelReturnFromThread() diff --git a/Core/HLE/scePower.cpp b/Core/HLE/scePower.cpp index d16d354633..0cc8426f10 100644 --- a/Core/HLE/scePower.cpp +++ b/Core/HLE/scePower.cpp @@ -319,7 +319,7 @@ int sceKernelVolatileMemLock(int type, u32 paddr, u32 psize) { case SCE_KERNEL_ERROR_ILLEGAL_CONTEXT: { - WARN_LOG(HLE, "sceKernelVolatileMemLock(%i, %08x, %08x): dispatch disabled", type, paddr, psize); + WARN_LOG(HLE, "sceKernelVolatileMemLock(%i, %08x, %08x): in interrupt", type, paddr, psize); Memory::Write_U32(0x08400000, paddr); Memory::Write_U32(0x00400000, psize); }