diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 3ca3553052..677a987632 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -280,13 +280,6 @@ void sceKernelExitGameWithStatus() Core_Stop(); } -u32 sceKernelRegisterExitCallback(u32 cbId) -{ - DEBUG_LOG(SCEKERNEL,"sceKernelRegisterExitCallback(%i)", cbId); - registeredExitCbId = cbId; - return 0; -} - u32 sceKernelDevkitVersion() { int firmwareVersion = 150; @@ -886,7 +879,7 @@ void Register_ThreadManForUser() const HLEFunction LoadExecForUser[] = { {0x05572A5F,&WrapV_V, "sceKernelExitGame"}, //() - {0x4AC57943,&WrapU_U,"sceKernelRegisterExitCallback"}, + {0x4AC57943,&WrapI_I,"sceKernelRegisterExitCallback"}, {0xBD2F1094,&WrapI_CU,"sceKernelLoadExec"}, {0x2AC9954B,&WrapV_V,"sceKernelExitGameWithStatus"}, {0x362A956B,&WrapI_V, "LoadExecForUser_362A956B"}, diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 3165aba859..2e75cef841 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -3662,6 +3662,23 @@ void __KernelChangeThreadState(SceUID threadId, ThreadStatus newStatus) __KernelChangeThreadState(t, newStatus); } +int sceKernelRegisterExitCallback(SceUID cbId) +{ + u32 error; + Callback *cb = kernelObjects.Get(cbId, error); + if (!cb) + { + WARN_LOG(SCEKERNEL, "sceKernelRegisterExitCallback(%i): invalid callback id", cbId); + if (sceKernelGetCompiledSdkVersion() >= 0x3090500) + return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; + return 0; + } + + DEBUG_LOG(SCEKERNEL, "sceKernelRegisterExitCallback(%i)", cbId); + registeredExitCbId = cbId; + return 0; +} + int LoadExecForUser_362A956B() { WARN_LOG_REPORT(SCEKERNEL, "LoadExecForUser_362A956B()"); @@ -3676,18 +3693,18 @@ int LoadExecForUser_362A956B() WARN_LOG(SCEKERNEL, "LoadExecForUser_362A956B() : invalid address for cbArg (0x%08X)", cbArg); return SCE_KERNEL_ERROR_ILLEGAL_ADDR; } - int unknown1 = Memory::Read_U32(cbArg - 8); - if (unknown1 < 0 || unknown1 >= 4) { + u32 unknown1 = Memory::Read_U32(cbArg - 8); + if (unknown1 >= 4) { WARN_LOG(SCEKERNEL, "LoadExecForUser_362A956B() : invalid value unknown1 (0x%08X)", unknown1); return SCE_KERNEL_ERROR_ILLEGAL_ARGUMENT; } - int parameterArea = Memory::Read_U32(cbArg - 4); + u32 parameterArea = Memory::Read_U32(cbArg - 4); if (!Memory::IsValidAddress(parameterArea)) { WARN_LOG(SCEKERNEL, "LoadExecForUser_362A956B() : invalid address for parameterArea on userMemory (0x%08X)", parameterArea); return SCE_KERNEL_ERROR_ILLEGAL_ADDR; } - int size = Memory::Read_U32(parameterArea); + u32 size = Memory::Read_U32(parameterArea); if (size < 12) { WARN_LOG(SCEKERNEL, "LoadExecForUser_362A956B() : invalid parameterArea size %d", size); return SCE_KERNEL_ERROR_ILLEGAL_SIZE; diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 245f792225..01bc545d8d 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -304,4 +304,6 @@ struct DebugThreadInfo std::vector GetThreadsInfo(); void __KernelChangeThreadState(SceUID threadId, ThreadStatus newStatus); + int LoadExecForUser_362A956B(); +int sceKernelRegisterExitCallback(SceUID cbId);