Psmf: Use kernel memory for helper thread stack.
Also, thread stacks must be 0x200 or larger.
This commit is contained in:
parent
1d528d6f3b
commit
dd804660c9
5 changed files with 29 additions and 5 deletions
|
@ -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_);
|
||||||
|
}
|
||||||
|
|
|
@ -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_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue