diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index bab5cc60bb..c1da5488d3 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -1170,7 +1170,14 @@ void __KernelReturnFromModuleFunc() { // Return from the thread as normal. __KernelReturnFromThread(); - // TODO: sceKernelGetThreadExitStatus, __KernelGetCurThreadModuleId() + + SceUID leftModuleID = __KernelGetCurThreadModuleId(); + SceUID leftThreadID = __KernelGetCurThread(); + int exitStatus = sceKernelGetThreadExitStatus(leftThreadID); + + // Reschedule immediately (to leave the thread) and delete it and its stack. + __KernelReSchedule("returned from module"); + sceKernelDeleteThread(leftThreadID); } struct GetModuleIdByAddressArg diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 15c6b8c53f..acd1c58ddc 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2010,10 +2010,6 @@ void __KernelReturnFromThread() _dbg_assert_msg_(HLE, thread != NULL, "Returned from a NULL thread."); INFO_LOG(HLE,"__KernelReturnFromThread: %d", exitStatus); - // TEMPORARY HACK: kill the stack of the root thread early: - if (!strcmp(thread->GetName(), "root")) { - thread->FreeStack(); - } thread->nt.exitStatus = exitStatus; __KernelChangeReadyState(thread, currentThread, false);