Implement sceKernelCheckThreadStack

This commit is contained in:
Henrik Rydgard 2013-03-23 14:26:54 +01:00
parent 60189663db
commit 6a4ae5bb51
3 changed files with 20 additions and 1 deletions

View file

@ -540,6 +540,13 @@ u32 sceKernelMemcpy(u32 dst, u32 src, u32 size)
return dst; 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[] = const HLEFunction Kernel_Library[] =
{ {
{0x092968F4,sceKernelCpuSuspendIntr,"sceKernelCpuSuspendIntr"}, {0x092968F4,sceKernelCpuSuspendIntr,"sceKernelCpuSuspendIntr"},
@ -555,6 +562,7 @@ const HLEFunction Kernel_Library[] =
{0x15b6446b,WrapI_UI<sceKernelUnlockLwMutex>, "sceKernelUnlockLwMutex"}, {0x15b6446b,WrapI_UI<sceKernelUnlockLwMutex>, "sceKernelUnlockLwMutex"},
{0xc1734599,WrapI_UU<sceKernelReferLwMutexStatus>, "sceKernelReferLwMutexStatus"}, {0xc1734599,WrapI_UU<sceKernelReferLwMutexStatus>, "sceKernelReferLwMutexStatus"},
{0x293b45b8,sceKernelGetThreadId, "sceKernelGetThreadId"}, {0x293b45b8,sceKernelGetThreadId, "sceKernelGetThreadId"},
{0xD13BDE95,WrapU_V<sceKernelCheckThreadStack>, "sceKernelCheckThreadStack"},
{0x1839852A,WrapU_UUU<sceKernelMemcpy>,"sce_paf_private_memcpy"}, {0x1839852A,WrapU_UUU<sceKernelMemcpy>,"sce_paf_private_memcpy"},
}; };

View file

@ -333,6 +333,7 @@ public:
// Fill the stack. // Fill the stack.
Memory::Memset(stackBlock, 0xFF, stackSize); Memory::Memset(stackBlock, 0xFF, stackSize);
context.r[MIPS_REG_SP] = stackBlock + stackSize; context.r[MIPS_REG_SP] = stackBlock + stackSize;
stackEnd = context.r[MIPS_REG_SP];
nt.initialStack = stackBlock; nt.initialStack = stackBlock;
nt.stackSize = stackSize; nt.stackSize = stackSize;
// What's this 512? // What's this 512?
@ -429,6 +430,7 @@ public:
std::list<u32> pendingMipsCalls; std::list<u32> pendingMipsCalls;
u32 stackBlock; u32 stackBlock;
u32 stackEnd;
}; };
// std::vector<SceUID> with push_front(), remove(), etc. // std::vector<SceUID> with push_front(), remove(), etc.
@ -1832,6 +1834,14 @@ SceUID __KernelGetCurThreadModuleId()
return 0; return 0;
} }
u32 __KernelGetCurThreadStack()
{
Thread *t = __GetCurrentThread();
if (t)
return t->stackEnd;
return 0;
}
void sceKernelGetThreadId() void sceKernelGetThreadId()
{ {

View file

@ -46,7 +46,7 @@ u32 sceKernelReferThreadRunStatus(u32 uid, u32 statusPtr);
int sceKernelReleaseWaitThread(SceUID threadID); int sceKernelReleaseWaitThread(SceUID threadID);
void sceKernelChangeCurrentThreadAttr(); void sceKernelChangeCurrentThreadAttr();
int sceKernelRotateThreadReadyQueue(int priority); int sceKernelRotateThreadReadyQueue(int priority);
void sceKernelCheckThreadStack(); u32 sceKernelCheckThreadStack();
void sceKernelSuspendThread(); void sceKernelSuspendThread();
void sceKernelResumeThread(); void sceKernelResumeThread();
void sceKernelWakeupThread(); void sceKernelWakeupThread();
@ -116,6 +116,7 @@ KernelObject *__KernelCallbackObject();
void __KernelScheduleWakeup(int threadnumber, s64 usFromNow); void __KernelScheduleWakeup(int threadnumber, s64 usFromNow);
SceUID __KernelGetCurThread(); SceUID __KernelGetCurThread();
u32 __KernelGetCurThreadStack();
const char *__KernelGetThreadName(SceUID threadID); const char *__KernelGetThreadName(SceUID threadID);
void __KernelSaveContext(ThreadContext *ctx); void __KernelSaveContext(ThreadContext *ctx);