From df1f126715063b671e771d779dae613fab5795dc Mon Sep 17 00:00:00 2001 From: sum2012 Date: Mon, 17 Aug 2020 23:16:15 +0800 Subject: [PATCH 1/3] Fix sceKernelExitThread fix #13297 fix #9523 According from https://github.com/jpcsp/jpcsp/blob/master/src/jpcsp/HLE/modules/ThreadManForUser.java#L3924 --- Core/HLE/sceKernel.cpp | 4 ++-- Core/HLE/sceKernelThread.cpp | 10 +++++++++- Core/HLE/sceKernelThread.h | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 6521f3e79c..ec58221d72 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -744,7 +744,7 @@ const HLEFunction ThreadManForUser[] = {0X1181E963, &WrapI_U, "sceKernelDelaySysClockThreadCB", 'i', "P", HLE_NOT_IN_INTERRUPT | HLE_NOT_DISPATCH_SUSPENDED }, {0XCEADEB47, &WrapI_U, "sceKernelDelayThread", 'i', "x", HLE_NOT_IN_INTERRUPT | HLE_NOT_DISPATCH_SUSPENDED }, {0X68DA9E36, &WrapI_U, "sceKernelDelayThreadCB", 'i', "x", HLE_NOT_IN_INTERRUPT | HLE_NOT_DISPATCH_SUSPENDED }, - {0XAA73C935, &WrapV_I, "sceKernelExitThread", 'v', "i" }, + {0XAA73C935, &WrapI_I, "sceKernelExitThread", 'i', "i" }, {0X809CE29B, &WrapV_I, "sceKernelExitDeleteThread", 'v', "i" }, {0x94aa61ee, &WrapI_V, "sceKernelGetThreadCurrentPriority", 'i', "" }, {0X293B45B8, &WrapI_V, "sceKernelGetThreadId", 'i', "", HLE_NOT_IN_INTERRUPT }, @@ -887,7 +887,7 @@ const HLEFunction ThreadManForKernel[] = {0x446D8DE6, &WrapI_CUUIUU, "sceKernelCreateThread", 'i', "sxxixx", HLE_NOT_IN_INTERRUPT | HLE_KERNEL_SYSCALL }, {0xF475845D, &WrapI_IIU, "sceKernelStartThread", 'i', "iix", HLE_NOT_IN_INTERRUPT | HLE_KERNEL_SYSCALL }, {0X9FA03CD3, &WrapI_I, "sceKernelDeleteThread", 'i', "i", HLE_KERNEL_SYSCALL }, - {0XAA73C935, &WrapV_I, "sceKernelExitThread", 'v', "i", HLE_KERNEL_SYSCALL }, + {0XAA73C935, &WrapI_I, "sceKernelExitThread", 'i', "i", HLE_KERNEL_SYSCALL }, {0X809CE29B, &WrapV_I, "sceKernelExitDeleteThread", 'v', "i", HLE_KERNEL_SYSCALL }, {0X9944F31F, &WrapI_I, "sceKernelSuspendThread", 'i', "i", HLE_KERNEL_SYSCALL }, {0X75156E8F, &WrapI_I, "sceKernelResumeThread", 'i', "i", HLE_KERNEL_SYSCALL }, diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index e995528d02..ea397162d1 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -49,6 +49,8 @@ #include "Core/HLE/KernelWaitHelpers.h" #include "Core/HLE/ThreadQueueList.h" + + typedef struct { WaitType type; @@ -2148,11 +2150,16 @@ void __KernelReturnFromThread() // The stack will be deallocated when the thread is deleted. } -void sceKernelExitThread(int exitStatus) { +int sceKernelExitThread(int exitStatus) { + if (!__KernelIsDispatchEnabled() && sceKernelGetCompiledSdkVersion() > 0x0307FFFF) + return ERROR_KERNEL_WAIT_CAN_NOT_WAIT; PSPThread *thread = __GetCurrentThread(); _dbg_assert_msg_(thread != NULL, "Exited from a NULL thread."); INFO_LOG(SCEKERNEL, "sceKernelExitThread(%d)", exitStatus); + if (exitStatus < 0) { + exitStatus = ERROR_KERNEL_ILLEGAL_ARGUMENT; + } __KernelStopThread(currentThread, exitStatus, "thread exited"); hleReSchedule("thread exited"); @@ -2161,6 +2168,7 @@ void sceKernelExitThread(int exitStatus) { __KernelThreadTriggerEvent((thread->nt.attr & PSP_THREAD_ATTR_KERNEL) != 0, thread->GetUID(), THREADEVENT_EXIT); // The stack will be deallocated when the thread is deleted. + return 0; } void _sceKernelExitThread(int exitStatus) { diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 5c85ba661b..37d1065a20 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -41,7 +41,7 @@ void __KernelStopThread(SceUID threadID, int exitStatus, const char *reason); u32 __KernelDeleteThread(SceUID threadID, int exitStatus, const char *reason); int sceKernelDeleteThread(int threadHandle); void sceKernelExitDeleteThread(int exitStatus); -void sceKernelExitThread(int exitStatus); +int sceKernelExitThread(int exitStatus); void _sceKernelExitThread(int exitStatus); SceUID sceKernelGetThreadId(); int sceKernelGetThreadCurrentPriority(); @@ -77,6 +77,8 @@ struct SceKernelSysClock { u32_le hi; }; +static const int ERROR_KERNEL_WAIT_CAN_NOT_WAIT = 0x800201a7; +static const int ERROR_KERNEL_ILLEGAL_ARGUMENT = 0x800200d2; // TODO: Map these to PSP wait types. Most of these are wrong. // remember to update the waitTypeNames array in sceKernelThread.cpp when changing these From dfad6cd4794c04d3512dad9ed6b1f06e37b11e33 Mon Sep 17 00:00:00 2001 From: sum2012 Date: Mon, 17 Aug 2020 23:18:12 +0800 Subject: [PATCH 2/3] oop --- Core/HLE/sceKernelThread.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index ea397162d1..52ff9688a7 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -49,8 +49,6 @@ #include "Core/HLE/KernelWaitHelpers.h" #include "Core/HLE/ThreadQueueList.h" - - typedef struct { WaitType type; From 35c05ef06493eaed69ac734f380e330b88e6871a Mon Sep 17 00:00:00 2001 From: sum2012 Date: Tue, 18 Aug 2020 06:42:55 +0800 Subject: [PATCH 3/3] Use ppsspp error name --- Core/HLE/sceKernelThread.cpp | 4 ++-- Core/HLE/sceKernelThread.h | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 52ff9688a7..7e719c05e3 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2150,13 +2150,13 @@ void __KernelReturnFromThread() int sceKernelExitThread(int exitStatus) { if (!__KernelIsDispatchEnabled() && sceKernelGetCompiledSdkVersion() > 0x0307FFFF) - return ERROR_KERNEL_WAIT_CAN_NOT_WAIT; + return hleLogError(SCEKERNEL, SCE_KERNEL_ERROR_CAN_NOT_WAIT); PSPThread *thread = __GetCurrentThread(); _dbg_assert_msg_(thread != NULL, "Exited from a NULL thread."); INFO_LOG(SCEKERNEL, "sceKernelExitThread(%d)", exitStatus); if (exitStatus < 0) { - exitStatus = ERROR_KERNEL_ILLEGAL_ARGUMENT; + exitStatus = SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; } __KernelStopThread(currentThread, exitStatus, "thread exited"); diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 37d1065a20..4c11a613fe 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -77,8 +77,6 @@ struct SceKernelSysClock { u32_le hi; }; -static const int ERROR_KERNEL_WAIT_CAN_NOT_WAIT = 0x800201a7; -static const int ERROR_KERNEL_ILLEGAL_ARGUMENT = 0x800200d2; // TODO: Map these to PSP wait types. Most of these are wrong. // remember to update the waitTypeNames array in sceKernelThread.cpp when changing these