diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index 4d42baf6a9..21b1533e81 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -130,6 +130,7 @@ static void hleDelayResultFinish(u64 userdata, int cycleslate) { void HLEInit() { RegisterAllModules(); + g_stackSize = 0; delayedResultEvent = CoreTiming::RegisterEvent("HLEDelayedResult", hleDelayResultFinish); idleOp = GetSyscallOp("FakeSysCalls", NID_IDLE); } @@ -169,7 +170,6 @@ void HLEDoState(PointerWrap &p) { void HLEShutdown() { hleAfterSyscall = HLE_AFTER_NOTHING; - g_stackSize = 0; moduleDB.clear(); enqueuedMipsCalls.clear(); for (auto p : mipsCallActions) { diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index 175ef4f728..94c63ca884 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -282,8 +282,8 @@ inline R hleCallImpl(std::string_view module, std::string_view funcName, F func, #define hleLogVerbose(t, res, ...) hleLogHelper(t, HLE_LOG_LVERBOSE, res, 'x', ##__VA_ARGS__) // If res is negative, log warn/error, otherwise log debug. -#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, (int)res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__) -#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, (int)res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__) +#define hleLogSuccessOrWarn(t, res, ...) hleLogHelper(t, ((int)res < 0 ? LogLevel::LWARNING : HLE_LOG_LDEBUG), res, 'x', ##__VA_ARGS__) +#define hleLogSuccessOrError(t, res, ...) hleLogHelper(t, ((int)res < 0 ? LogLevel::LERROR : HLE_LOG_LDEBUG), res, 'x', ##__VA_ARGS__) // NOTE: hleLogDebug is equivalent to hleLogSuccessI/X. #define hleLogDebug(t, res, ...) hleLogHelper(t, HLE_LOG_LDEBUG, res, 'x', ##__VA_ARGS__) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index c634316109..c962cbee96 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2218,6 +2218,7 @@ int __KernelStartModule(SceUID moduleId, u32 argsize, u32 argAddr, u32 returnVal SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, entryAddr, priority, stacksize, attribute, 0, (module->nm.attribute & 0x1000) != 0); _dbg_assert_(threadID > 0); + // TOOD: Check the return value and bail? __KernelStartThreadValidate(threadID, argsize, argAddr); __KernelSetThreadRA(threadID, NID_MODULERETURN); @@ -2314,6 +2315,7 @@ static u32 sceKernelStopModule(u32 moduleId, u32 argSize, u32 argAddr, u32 retur { SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, stopFunc, priority, stacksize, attr, 0, (module->nm.attribute & 0x1000) != 0); _dbg_assert_(threadID > 0); + // TOOD: Check the return value and bail? __KernelStartThreadValidate(threadID, argSize, argAddr); __KernelSetThreadRA(threadID, NID_MODULERETURN); __KernelWaitCurThread(WAITTYPE_MODULE, moduleId, 1, 0, false, "stopped module"); @@ -2397,6 +2399,7 @@ u32 __KernelStopUnloadSelfModuleWithOrWithoutStatus(u32 exitCode, u32 argSize, u if (Memory::IsValidAddress(stopFunc)) { SceUID threadID = __KernelCreateThread(module->nm.name, moduleID, stopFunc, priority, stacksize, attr, 0, (module->nm.attribute & 0x1000) != 0); _dbg_assert_(threadID > 0); + // TOOD: Check the return value and bail? __KernelStartThreadValidate(threadID, argSize, argp); __KernelSetThreadRA(threadID, NID_MODULERETURN); __KernelWaitCurThread(WAITTYPE_MODULE, moduleID, 1, 0, false, "unloadstopped module"); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 6814a29718..8692640ce7 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2093,19 +2093,29 @@ int __KernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr, bo return 0; } +// This gets called from other places, so we don't use the hleLog* here. int __KernelStartThreadValidate(SceUID threadToStartID, int argSize, u32 argBlockPtr, bool forceArgs) { - if (threadToStartID == 0) - return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_THID, "thread id is 0"); - if (argSize < 0 || argBlockPtr & 0x80000000) - return hleReportError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "bad thread argument pointer/length %08x / %08x", argSize, argBlockPtr); + if (threadToStartID == 0) { + ERROR_LOG(Log::sceKernel, "thread id is 0"); + return SCE_KERNEL_ERROR_ILLEGAL_THID; + } + + if (argSize < 0 || argBlockPtr & 0x80000000) { + ERROR_LOG(Log::sceKernel, "bad thread argument pointer/length %08x / %08x", argSize, argBlockPtr); + return SCE_KERNEL_ERROR_ILLEGAL_ADDR; + } u32 error = 0; PSPThread *startThread = kernelObjects.Get(threadToStartID, error); - if (startThread == 0) - return hleLogError(Log::sceKernel, error, "thread does not exist"); + if (startThread == 0) { + ERROR_LOG(Log::sceKernel, "thread does not exist: %08x", error); + return error; + } - if (startThread->nt.status != THREADSTATUS_DORMANT) - return hleLogWarning(Log::sceKernel, SCE_KERNEL_ERROR_NOT_DORMANT, "thread already running"); + if (startThread->nt.status != THREADSTATUS_DORMANT) { + WARN_LOG(Log::sceKernel, "thread already running"); + return SCE_KERNEL_ERROR_NOT_DORMANT; + } hleEatCycles(3400); return __KernelStartThread(threadToStartID, argSize, argBlockPtr, forceArgs); @@ -2113,7 +2123,8 @@ int __KernelStartThreadValidate(SceUID threadToStartID, int argSize, u32 argBloc // int sceKernelStartThread(SceUID threadToStartID, SceSize argSize, void *argBlock) int sceKernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr) { - return hleLogSuccessInfoI(Log::sceKernel, __KernelStartThreadValidate(threadToStartID, argSize, argBlockPtr)); + int retval = __KernelStartThreadValidate(threadToStartID, argSize, argBlockPtr); + return hleLogSuccessOrError(Log::sceKernel, retval); } int sceKernelGetThreadStackFreeSize(SceUID threadID) diff --git a/Core/Util/PPGeDraw.cpp b/Core/Util/PPGeDraw.cpp index 4d8121a105..13522f6022 100644 --- a/Core/Util/PPGeDraw.cpp +++ b/Core/Util/PPGeDraw.cpp @@ -38,6 +38,7 @@ #include "GPU/GPUCommon.h" #include "Core/FileSystems/MetaFileSystem.h" #include "Core/Util/PPGeDraw.h" +#include "Core/HLE/HLE.h" #include "Core/HLE/sceKernel.h" #include "Core/HLE/sceKernelMemory.h" #include "Core/HLE/sceGe.h" @@ -469,7 +470,7 @@ void PPGeEnd() // We actually drew something gpu->EnableInterrupts(false); NotifyMemInfo(MemBlockFlags::WRITE, dlPtr, dlWritePtr - dlPtr, "PPGe ListCmds"); - u32 list = sceGeListEnQueue(dlPtr, dlWritePtr, -1, listArgs.ptr); + u32 list = hleCall(sceGe_user, u32, sceGeListEnQueue, dlPtr, dlWritePtr, -1, listArgs.ptr); DEBUG_LOG(Log::sceGe, "PPGe enqueued display list %i", list); gpu->EnableInterrupts(true); }