Thread: Default to kernel threads from kernel.

This is an experiment.  In most cases, allowKernel will be false.
This commit is contained in:
Unknown W. Brackets 2020-05-24 00:02:34 -07:00 committed by sum2012
parent 104bf3915e
commit e8b651fbd6
3 changed files with 26 additions and 6 deletions

View file

@ -1959,9 +1959,15 @@ int __KernelCreateThread(const char *threadName, SceUID moduleID, u32 entry, u32
// Some are USB/VSH specific, probably removes when they are from the wrong module?
attr &= ~PSP_THREAD_ATTR_USER_ERASE;
// We're assuming all threads created are user threads.
if ((attr & PSP_THREAD_ATTR_KERNEL) == 0)
attr |= PSP_THREAD_ATTR_USER;
if ((attr & PSP_THREAD_ATTR_KERNEL) == 0) {
if (allowKernel && (attr & PSP_THREAD_ATTR_USER) == 0) {
WARN_LOG(SCEKERNEL, "sceKernelCreateThread: Kernel allowed, so creating as a kernel thread");
attr |= PSP_THREAD_ATTR_KERNEL;
} else {
WARN_LOG(SCEKERNEL, "sceKernelCreateThread: Kernel not allowed, so creating as a user thread");
attr |= PSP_THREAD_ATTR_USER;
}
}
SceUID id = __KernelCreateThreadInternal(threadName, moduleID, entry, prio, stacksize, attr);
if ((u32)id == SCE_KERNEL_ERROR_NO_MEMORY)
@ -1986,8 +1992,9 @@ int __KernelCreateThread(const char *threadName, SceUID moduleID, u32 entry, u32
int sceKernelCreateThread(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr) {
PSPThread *cur = __GetCurrentThread();
bool allowKernel = cur ? (cur->nt.attr & PSP_THREAD_ATTR_KERNEL) != 0 : false;
return __KernelCreateThread(threadName, __KernelGetCurThreadModuleId(), entry, prio, stacksize, attr, optionAddr, allowKernel);
SceUID module = __KernelGetCurThreadModuleId();
bool allowKernel = KernelModuleIsKernelMode(module) || hleIsKernelMode() || (cur ? (cur->nt.attr & PSP_THREAD_ATTR_KERNEL) != 0 : false);
return __KernelCreateThread(threadName, module, entry, prio, stacksize, attr, optionAddr, allowKernel);
}
int __KernelStartThread(SceUID threadToStartID, int argSize, u32 argBlockPtr, bool forceArgs) {