From 31eeb3d50b7721024b73ff2720cdda0993b53310 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 1 Jan 2013 17:04:06 -0800 Subject: [PATCH 1/2] Make sceKernelStartModule() do something. Doesn't work right, but gets somewhere? --- Core/HLE/sceKernelModule.cpp | 4 ++++ Core/HLE/sceKernelThread.cpp | 13 ++++++++++--- Core/HLE/sceKernelThread.h | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 918c4727af..d783fa7f50 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -837,6 +837,10 @@ void sceKernelStartModule(u32 moduleId, u32 argsize, u32 argAddr, u32 returnValu entryAddr = module->nm.module_start_func; // attr = module->nm } + + SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, entryAddr, priority, stacksize, attr, 0); + sceKernelStartThread(threadID, argsize, argAddr); + sceKernelWaitThreadEnd(threadID, 0); } //SceUID threadId; diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 378ff87dbc..a67a81d99e 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1357,8 +1357,7 @@ void __KernelSetupRootThread(SceUID moduleID, int args, const char *argp, int pr Memory::Write_U8(argp[i], location + i); } - -int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr) +int __KernelCreateThread(const char *threadName, SceUID moduleID, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr) { if (threadName == NULL) { @@ -1382,13 +1381,21 @@ int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stack attr |= PSP_THREAD_ATTR_USER; SceUID id; - __KernelCreateThread(id, curModule, threadName, entry, prio, stacksize, attr); + __KernelCreateThread(id, moduleID, threadName, entry, prio, stacksize, attr); INFO_LOG(HLE, "%i = sceKernelCreateThread(name=\"%s\", entry=%08x, prio=%x, stacksize=%i)", id, threadName, entry, prio, stacksize); if (optionAddr != 0) WARN_LOG(HLE, "sceKernelCreateThread(name=\"%s\"): unsupported options parameter %08x", threadName, optionAddr); return id; } +int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr) +{ + SceUID moduleId = curModule; + if (__GetCurrentThread()) + moduleId = __GetCurrentThread()->moduleId; + return __KernelCreateThread(threadName, moduleId, entry, prio, stacksize, attr, optionAddr); +} + // int sceKernelStartThread(SceUID threadToStartID, SceSize argSize, void *argBlock) int sceKernelStartThread(SceUID threadToStartID, u32 argSize, u32 argBlockPtr) diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index c1af7d70d6..9f30374132 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -26,6 +26,7 @@ void sceKernelChangeThreadPriority(); +int __KernelCreateThread(const char *threadName, SceUID moduleID, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr); int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr); void sceKernelDelayThread(); void sceKernelDelayThreadCB(); From 9611e52c01d64a6f1d8f3e5e53f06922a9d58fdc Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 3 Jan 2013 00:56:17 -0800 Subject: [PATCH 2/2] Don't follow -1 entry points, they're bad mojo. --- Core/HLE/sceKernelModule.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index d783fa7f50..b61cd9ff9f 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -826,29 +826,35 @@ void sceKernelStartModule(u32 moduleId, u32 argsize, u32 argAddr, u32 returnValu RETURN(error); return; } else if (module->isFake) { - INFO_LOG(HLE,"sceKernelStartModule(%d,asize=%08x,aptr=%08x,retptr=%08x,%08x): faked (undecryptable module)", + INFO_LOG(HLE, "sceKernelStartModule(%d,asize=%08x,aptr=%08x,retptr=%08x,%08x): faked (undecryptable module)", moduleId,argsize,argAddr,returnValueAddr,optionAddr); } else { - ERROR_LOG(HLE,"UNIMPL sceKernelStartModule(%d,asize=%08x,aptr=%08x,retptr=%08x,%08x)", + WARN_LOG(HLE, "UNIMPL sceKernelStartModule(%d,asize=%08x,aptr=%08x,retptr=%08x,%08x)", moduleId,argsize,argAddr,returnValueAddr,optionAddr); u32 entryAddr = module->nm.entry_addr; - if (entryAddr == -1) { - entryAddr = module->nm.module_start_func; - // attr = module->nm + if (entryAddr == -1 || entryAddr == module->memoryBlockAddr - 1) { + // TODO: Do these always take effect, or do they not override optionAddr? + if (module->nm.module_start_func != 0 && module->nm.module_start_func != -1) { + entryAddr = module->nm.module_start_func; + priority = module->nm.module_start_thread_priority; + attr = module->nm.module_start_thread_attr; + stacksize = module->nm.module_start_thread_stacksize; + } else { + // TODO: Fix, check return value? Or do we call nothing? + RETURN(moduleId); + return; + } } SceUID threadID = __KernelCreateThread(module->nm.name, moduleId, entryAddr, priority, stacksize, attr, 0); sceKernelStartThread(threadID, argsize, argAddr); + // TODO: This will probably return the wrong value? sceKernelWaitThreadEnd(threadID, 0); } - //SceUID threadId; - //__KernelCreateThread(threadId, moduleId, module->nm.name, module->nm.entry_addr, priority, stacksize, attr); - - // Apparently, we need to call the entry point directly and insert the return value afterwards. This calls - // for a MipsCall and an Action. TODO - RETURN(moduleId); // TODO: Delete + // TODO: Is this the correct return value? + RETURN(moduleId); } void sceKernelStopModule(u32 moduleId, u32 argSize, u32 argAddr, u32 returnValueAddr, u32 optionAddr)