This commit is contained in:
Henrik Rydgård 2025-01-20 00:04:07 +01:00
parent 26547e2629
commit 16dcb9ee8a
5 changed files with 28 additions and 13 deletions

View file

@ -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) {

View file

@ -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__)

View file

@ -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");

View file

@ -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<PSPThread>(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)

View file

@ -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);
}