Psmf: Use kernel memory for helper thread stack.

Also, thread stacks must be 0x200 or larger.
This commit is contained in:
Unknown W. Brackets 2019-07-28 14:55:21 -07:00
parent 1d528d6f3b
commit dd804660c9
5 changed files with 29 additions and 5 deletions

View file

@ -55,11 +55,12 @@ HLEHelperThread::~HLEHelperThread() {
void HLEHelperThread::AllocEntry(u32 size) { void HLEHelperThread::AllocEntry(u32 size) {
entry_ = kernelMemory.Alloc(size); entry_ = kernelMemory.Alloc(size);
Memory::Memset(entry_, 0, size);
currentMIPS->InvalidateICache(entry_, size); currentMIPS->InvalidateICache(entry_, size);
} }
void HLEHelperThread::Create(const char *threadName, u32 prio, int stacksize) { void HLEHelperThread::Create(const char *threadName, u32 prio, int stacksize) {
id_ = __KernelCreateThreadInternal(threadName, __KernelGetCurThreadModuleId(), entry_, prio, stacksize, 0); id_ = __KernelCreateThreadInternal(threadName, __KernelGetCurThreadModuleId(), entry_, prio, stacksize, 0x00001000);
} }
void HLEHelperThread::DoState(PointerWrap &p) { void HLEHelperThread::DoState(PointerWrap &p) {
@ -79,3 +80,7 @@ void HLEHelperThread::Start(u32 a0, u32 a1) {
void HLEHelperThread::Terminate() { void HLEHelperThread::Terminate() {
__KernelStopThread(id_, SCE_KERNEL_ERROR_THREAD_TERMINATED, "helper terminated"); __KernelStopThread(id_, SCE_KERNEL_ERROR_THREAD_TERMINATED, "helper terminated");
} }
bool HLEHelperThread::Stopped() {
return KernelIsThreadDormant(id_);
}

View file

@ -31,6 +31,7 @@ public:
void Start(u32 a0, u32 a1); void Start(u32 a0, u32 a1);
void Terminate(); void Terminate();
bool Stopped();
private: private:
void AllocEntry(u32 size); void AllocEntry(u32 size);
@ -38,4 +39,4 @@ private:
SceUID id_; SceUID id_;
u32 entry_; u32 entry_;
}; };

View file

@ -399,8 +399,9 @@ public:
static int GetStaticIDType() { return SCE_KERNEL_TMID_Thread; } static int GetStaticIDType() { return SCE_KERNEL_TMID_Thread; }
int GetIDType() const override { return SCE_KERNEL_TMID_Thread; } int GetIDType() const override { return SCE_KERNEL_TMID_Thread; }
bool AllocateStack(u32 &stackSize) bool AllocateStack(u32 &stackSize) {
{ _assert_msg_(SCEKERNEL, stackSize >= 0x200, "thread stack should be 256 bytes or larger");
FreeStack(); FreeStack();
bool fromTop = (nt.attr & PSP_THREAD_ATTR_LOW_STACK) == 0; bool fromTop = (nt.attr & PSP_THREAD_ATTR_LOW_STACK) == 0;
@ -1183,6 +1184,14 @@ const char *__KernelGetThreadName(SceUID threadID)
return "ERROR"; return "ERROR";
} }
bool KernelIsThreadDormant(SceUID threadID) {
u32 error;
Thread *t = kernelObjects.Get<Thread>(threadID, error);
if (t)
return (t->nt.status & (THREADSTATUS_DEAD | THREADSTATUS_DORMANT)) != 0;
return 0;
}
u32 __KernelGetWaitValue(SceUID threadID, u32 &error) u32 __KernelGetWaitValue(SceUID threadID, u32 &error)
{ {
Thread *t = kernelObjects.Get<Thread>(threadID, error); Thread *t = kernelObjects.Get<Thread>(threadID, error);
@ -2352,6 +2361,13 @@ SceUID __KernelGetCurThread()
return currentThread; return currentThread;
} }
int KernelCurThreadPriority() {
Thread *t = __GetCurrentThread();
if (t)
return t->nt.currentPriority;
return 0;
}
SceUID __KernelGetCurThreadModuleId() SceUID __KernelGetCurThreadModuleId()
{ {
Thread *t = __GetCurrentThread(); Thread *t = __GetCurrentThread();

View file

@ -161,9 +161,11 @@ KernelObject *__KernelCallbackObject();
void __KernelScheduleWakeup(int threadnumber, s64 usFromNow); void __KernelScheduleWakeup(int threadnumber, s64 usFromNow);
SceUID __KernelGetCurThread(); SceUID __KernelGetCurThread();
int KernelCurThreadPriority();
u32 __KernelGetCurThreadStack(); u32 __KernelGetCurThreadStack();
u32 __KernelGetCurThreadStackStart(); u32 __KernelGetCurThreadStackStart();
const char *__KernelGetThreadName(SceUID threadID); const char *__KernelGetThreadName(SceUID threadID);
bool KernelIsThreadDormant(SceUID threadID);
void __KernelSaveContext(ThreadContext *ctx, bool vfpuEnabled); void __KernelSaveContext(ThreadContext *ctx, bool vfpuEnabled);
void __KernelLoadContext(ThreadContext *ctx, bool vfpuEnabled); void __KernelLoadContext(ThreadContext *ctx, bool vfpuEnabled);

View file

@ -220,7 +220,7 @@ public:
void ScheduleFinish(u32 handle) { void ScheduleFinish(u32 handle) {
if (!finishThread) { if (!finishThread) {
finishThread = new HLEHelperThread("scePsmfPlayer", "scePsmfPlayer", "__PsmfPlayerFinish", playbackThreadPriority, 0x100); finishThread = new HLEHelperThread("scePsmfPlayer", "scePsmfPlayer", "__PsmfPlayerFinish", playbackThreadPriority, 0x200);
finishThread->Start(handle, 0); finishThread->Start(handle, 0);
} }
} }