SceKernelThreadMgr

PSVita supports multi-threading in the non-secure kernel but not the secure kernel. There is no user/POSIX threads; all threads are implemented as kernel threads and processes are the functionally the same as threads. Threads can be specified to run on a specific core with the CPU affinity mask option when creating the thread and by default, threads can run on any core. The kernel process can also run on any core. Additionally, the secure kernel can also run on any core.

Module
This module exists only in non-secure world. The SELF can be found in.

Libraries
This module is accessible by usermode.

sceKernelGetThreadIdListForDriver
This function is used to query and obtain the number of thread within a process.

sceKernelGetThreadCpuRegistersForDriver
This function is used to get the state of the registers for a SUSPENDED thread. It returns the registers in a two part structure. It's uncertian what the difference is between the two parts. It seems like its a user/kernel separation, but it's uncertain. It could also be a current/exception difference, but it is unconvincing. In normal usage on a suspended thread it seems to be the user aspect that contains valid values. When you query a suspended thread that has no had the opportunity to start yet, the kernel side is filled.

sceKernelChangeThreadSuspendStatusForDriver
This function allows you to change the status of a suspended thread. Most of the valid suspend bits are unknown, but some can be used to prevent the kernel rethrowing exceptions or pull threads into the running/ready state.

sceKernelGetProcessIdForDriver
Returns the process ID.

sceKernelSetProcessIdToTLSForDriver
Sets given pid into TLS.

sceKernelGetProcessIdFromTLSForDriver
Gets pid from TLS.

sceKernelRegisterTimerForDriver
// seen: unk = 2 so maybe UDCD bus

sceKernelGetProcessIdForKernel
Returns the process ID.

Run Exclusively
This takes a function and runs it exclusively on the current core on its own stack.