diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index 468243ad1d..351bcd19d0 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -540,6 +540,13 @@ u32 sceKernelMemcpy(u32 dst, u32 src, u32 size) return dst; } +// Returns the stack size of the current thread. +u32 sceKernelCheckThreadStack() { + int stackSize = __KernelGetCurThreadStack() - currentMIPS->r[MIPS_REG_SP]; + DEBUG_LOG(HLE, "%i = sceKernelCheckThreadStack()", stackSize); + return stackSize; +} + const HLEFunction Kernel_Library[] = { {0x092968F4,sceKernelCpuSuspendIntr,"sceKernelCpuSuspendIntr"}, @@ -555,6 +562,7 @@ const HLEFunction Kernel_Library[] = {0x15b6446b,WrapI_UI, "sceKernelUnlockLwMutex"}, {0xc1734599,WrapI_UU, "sceKernelReferLwMutexStatus"}, {0x293b45b8,sceKernelGetThreadId, "sceKernelGetThreadId"}, + {0xD13BDE95,WrapU_V, "sceKernelCheckThreadStack"}, {0x1839852A,WrapU_UUU,"sce_paf_private_memcpy"}, }; diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 6142032612..67a823af2d 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -333,6 +333,7 @@ public: // Fill the stack. Memory::Memset(stackBlock, 0xFF, stackSize); context.r[MIPS_REG_SP] = stackBlock + stackSize; + stackEnd = context.r[MIPS_REG_SP]; nt.initialStack = stackBlock; nt.stackSize = stackSize; // What's this 512? @@ -429,6 +430,7 @@ public: std::list pendingMipsCalls; u32 stackBlock; + u32 stackEnd; }; // std::vector with push_front(), remove(), etc. @@ -1832,6 +1834,14 @@ SceUID __KernelGetCurThreadModuleId() return 0; } +u32 __KernelGetCurThreadStack() +{ + Thread *t = __GetCurrentThread(); + if (t) + return t->stackEnd; + return 0; +} + void sceKernelGetThreadId() { diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 07883a7570..2f265ab51a 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -46,7 +46,7 @@ u32 sceKernelReferThreadRunStatus(u32 uid, u32 statusPtr); int sceKernelReleaseWaitThread(SceUID threadID); void sceKernelChangeCurrentThreadAttr(); int sceKernelRotateThreadReadyQueue(int priority); -void sceKernelCheckThreadStack(); +u32 sceKernelCheckThreadStack(); void sceKernelSuspendThread(); void sceKernelResumeThread(); void sceKernelWakeupThread(); @@ -116,6 +116,7 @@ KernelObject *__KernelCallbackObject(); void __KernelScheduleWakeup(int threadnumber, s64 usFromNow); SceUID __KernelGetCurThread(); +u32 __KernelGetCurThreadStack(); const char *__KernelGetThreadName(SceUID threadID); void __KernelSaveContext(ThreadContext *ctx);