uOFW
Reverse engineered PSP kernel 6.60.
Loading...
Searching...
No Matches
threadman_kernel.h
1/* Copyright (C) 2011 - 2015 The uOFW team
2 See the file COPYING for copying permission.
3*/
4
5#ifndef THREADMAN_KERNEL_H
6#define THREADMAN_KERNEL_H
7
8#include "common_header.h"
9#include "threadman_user.h"
10
11/* Threads */
12
13typedef s32 (*SceKernelThreadEntry)(SceSize args, void *argp);
14
15typedef s32 (*SceKernelRebootKernelThreadEntry)(s32 arg1, u32 arg2, s32 arg3, s32 arg4);
16
17typedef struct {
18 SceSize size;
19 SceUID stackMpid;
20} SceKernelThreadOptParam;
21
22#define SCE_KERNEL_THREAD_ID_SELF (0) /* UID representing calling thread. */
23
27#define SCE_KERNEL_INVALID_PRIORITY (0)
28#define SCE_KERNEL_HIGHEST_PRIORITY_KERNEL (1)
29#define SCE_KERNEL_HIGHEST_PRIORITY_USER (16)
30#define SCE_KERNEL_MODULE_INIT_PRIORITY (32)
31#define SCE_KERNEL_LOWEST_PRIORITY_USER (111)
32#define SCE_KERNEL_LOWEST_PRIORITY_KERNEL (126)
33
34/* thread size */
35#define SCE_KERNEL_TH_KERNEL_DEFAULT_STACKSIZE (4 * 1024) /* 4 KB */
36#define SCE_KERNEL_TH_USER_DEFAULT_STACKSIZE (256 * 1024) /* 256 KB */
37
38/* thread attributes */
39#define SCE_KERNEL_TH_VSH_MODE (0xC0000000) /* Thread runs in VSH mode. */
40#define SCE_KERNEL_TH_APP_MODE (0xB0000000) /* Thread runs in Application mode. */
41#define SCE_KERNEL_TH_USB_WLAN_MODE (0xA0000000) /* Thread runs in USB_WLAN mode. */
42#define SCE_KERNEL_TH_MS_MODE (0x90000000) /* Thread runs in MS mode. */
43#define SCE_KERNEL_TH_USER_MODE (0x80000000) /* Thread runs in User mode. */
44#define SCE_KERNEL_TH_NO_FILLSTACK (0x00100000)
45#define SCE_KERNEL_TH_CLEAR_STACK (0x00200000) /* Specifies that thread memory area should be cleared to 0 when deleted. */
46#define SCE_KERNEL_TH_LOW_STACK (0x00400000) /* Specifies that the stack area is allocated from the lower addresses in memory, not the higher ones. */
47#define SCE_KERNEL_TH_UNK_800000 (0x00800000)
48#define SCE_KERNEL_TH_USE_VFPU (0x00004000) /* Specifies that the VFPU is available. */
49#define SCE_KERNEL_TH_NEVERUSE_FPU (0x00002000)
50
51#define SCE_KERNEL_TH_DEFAULT_ATTR (0)
52
53#define SCE_KERNEL_AT_THFIFO (0x00000000) /* Waiting threads are queued on a FIFO basis. */
54#define SCE_KERNEL_AT_THPRI (0x00000100) /* Waiting threads are queued based on priority. */
55
56SceUID sceKernelCreateThread(const char *name, SceKernelThreadEntry entry, s32 initPriority,
57 SceSize stackSize, SceUInt attr, SceKernelThreadOptParam *option);
58int sceKernelDeleteThread(SceUID thid);
59int sceKernelStartThread(SceUID thid, SceSize arglen, void *argp);
60int sceKernelSuspendThread(SceUID thid);
61int sceKernelExitThread(s32 status);
62s32 sceKernelExitDeleteThread(s32 exitStatus);
63int sceKernelTerminateDeleteThread(SceUID thid);
64int sceKernelDelayThread(SceUInt delay);
65int sceKernelChangeThreadPriority(SceUID thid, int priority);
66int sceKernelGetThreadCurrentPriority(void);
67s32 sceKernelGetThreadId(void);
68int sceKernelIsUserModeThread(void);
69int sceKernelWaitThreadEnd(SceUID thid, SceUInt *timeout);
70int sceKernelWaitThreadEndCB(SceUID thid, SceUInt *timeout);
71int sceKernelReleaseWaitThread(SceUID thid);
72int sceKernelSuspendAllUserThreads(void);
73
74int sceKernelExtendKernelStack(int type, s32 (*cb)(void*), void *arg);
75
76unsigned int sceKernelGetSystemTimeLow(void);
77
78enum SceUserLevel {
79 SCE_USER_LEVEL_MS = 1,
80 SCE_USER_LEVEL_USBWLAN = 2,
81 SCE_USER_LEVEL_APP = 3,
82 SCE_USER_LEVEL_VSH = 4,
83};
84int sceKernelGetUserLevel(void);
85
86typedef enum {
87 SCE_KERNEL_TMID_Thread = 1,
88 SCE_KERNEL_TMID_Semaphore = 2,
89 SCE_KERNEL_TMID_EventFlag = 3,
90 SCE_KERNEL_TMID_Mbox = 4,
91 SCE_KERNEL_TMID_Vpl = 5,
92 SCE_KERNEL_TMID_Fpl = 6,
93 SCE_KERNEL_TMID_Mpipe = 7,
94 SCE_KERNEL_TMID_Callback = 8,
95 SCE_KERNEL_TMID_ThreadEventHandler = 9,
96 SCE_KERNEL_TMID_Alarm = 10,
97 SCE_KERNEL_TMID_VTimer = 11,
98 SCE_KERNEL_TMID_SleepThread = 64,
99 SCE_KERNEL_TMID_DelayThread = 65,
100 SCE_KERNEL_TMID_SuspendThread = 66,
101 SCE_KERNEL_TMID_DormantThread = 67,
102} SceKernelIdListType;
103
104SceKernelIdListType sceKernelGetThreadmanIdType(SceUID uid);
105
106/* Mutexes */
107
108typedef struct {
109 SceSize size;
110} SceKernelMutexOptParam;
111
112typedef struct {
113 SceSize size;
114 char name[SCE_UID_NAME_LEN + 1];
115 SceUInt attr;
116 s32 initCount;
117 s32 currentCount;
118 SceUID currentOwner;
119 s32 numWaitThreads;
120} SceKernelMutexInfo;
121
122/* Mutex attributes */
123#define SCE_KERNEL_MUTEX_ATTR_TH_FIFO (SCE_KERNEL_AT_THFIFO)
124#define SCE_KERNEL_MUTEX_ATTR_TH_PRI (SCE_KERNEL_AT_THPRI)
125#define SCE_KERNEL_MUTEX_ATTR_RECURSIVE (0x0200) /*Allow recursive locks by threads that own the mutex. */
126
127s32 sceKernelCreateMutex(char *name, s32 attr, s32 initCount, const SceKernelMutexOptParam *pOption);
128s32 sceKernelDeleteMutex(SceUID mutexId);
129s32 sceKernelLockMutex(SceUID mutexId, s32 lockCount, u32 *pTimeout);
130s32 sceKernelLockMutexCB(SceUID mutexId, s32 lockCount, u32 *pTimeout);
131s32 sceKernelTryLockMutex(SceUID mutexId, s32 lockCount);
132s32 sceKernelUnlockMutex(SceUID mutexId, s32 unlockCount);
133s32 sceKernelCancelMutex(SceUID mutexId, s32 newLockCount, s32 *pNumWaitThreads);
134s32 sceKernelReferMutexStatus(SceUID mutexId, SceKernelMutexInfo *pInfo);
135
136/* Event flags */
137
138typedef struct {
139 SceSize size;
140 char name[SCE_UID_NAME_LEN + 1];
141 SceUInt attr;
142 SceUInt initPattern;
143 SceUInt currentPattern;
144 int numWaitThreads;
145} SceKernelEventFlagInfo;
146
147typedef struct {
148 SceSize size;
149} SceKernelEventFlagOptParam;
150
151/* Event flag attributes. */
152#define SCE_KERNEL_EA_SINGLE (0x0000)
153#define SCE_KERNEL_EA_MULTI (0x0200)
155/* Event flag wait modes. */
156#define SCE_KERNEL_EW_AND (0x00)
157#define SCE_KERNEL_EW_OR (0x01)
158#define SCE_KERNEL_EW_CLEAR_ALL (0x10)
159#define SCE_KERNEL_EW_CLEAR_PAT (0x20)
160#define SCE_KERNEL_EW_CLEAR SCE_KERNEL_EW_CLEAR_ALL
161
162SceUID sceKernelCreateEventFlag(const char *name, int attr, int bits, SceKernelEventFlagOptParam *opt);
163int sceKernelSetEventFlag(SceUID evid, u32 bits);
164int sceKernelClearEventFlag(SceUID evid, u32 bits);
165int sceKernelPollEventFlag(int evid, u32 bits, u32 wait, u32 *outBits);
166int sceKernelWaitEventFlag(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
167int sceKernelWaitEventFlagCB(int evid, u32 bits, u32 wait, u32 *outBits, SceUInt *timeout);
168int sceKernelCancelEventFlag(SceUID evid, SceUInt setpattern, s32 *numWaitThreads);
169int sceKernelDeleteEventFlag(int evid);
170int sceKernelReferEventFlagStatus(SceUID event, SceKernelEventFlagInfo *status);
171
172/* MsgPipe */
173SceUID sceKernelCreateMsgPipe(const char *name, int part, int attr, void *unk1, void *opt);
174int sceKernelDeleteMsgPipe(SceUID uid);
175int sceKernelSendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
176int sceKernelSendMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
177int sceKernelTrySendMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
178int sceKernelReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
179int sceKernelReceiveMsgPipeCB(SceUID uid, void *message, unsigned int size, int unk1, void *unk2, unsigned int *timeout);
180int sceKernelTryReceiveMsgPipe(SceUID uid, void *message, unsigned int size, int unk1, void *unk2);
181int sceKernelCancelMsgPipe(SceUID uid, int *psend, int *precv);
182
183typedef struct {
184 SceSize size;
185 char name[SCE_UID_NAME_LEN + 1];
186 SceUInt attr;
187 int bufSize;
188 int freeSize;
189 int numSendWaitThreads;
190 int numReceiveWaitThreads;
191} SceKernelMppInfo;
192
193int sceKernelReferMsgPipeStatus(SceUID uid, SceKernelMppInfo *info);
194
195/* Semaphores */
196
197typedef struct {
198 SceSize size;
199} SceKernelSemaOptParam;
200
201typedef struct {
202 SceSize size;
203 char name[SCE_UID_NAME_LEN + 1];
204 SceUInt attr;
205 int initCount;
206 int currentCount;
207 int maxCount;
208 int numWaitThreads;
209} SceKernelSemaInfo;
210
211#define SCE_KERNEL_SA_THFIFO (0x0000) /* A FIFO queue is used for the waiting thread */
212#define SCE_KERNEL_SA_THPRI (0x0100) /* The waiting thread is queued by its thread priority */
213
214SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);
215int sceKernelDeleteSema(SceUID semaid);
216int sceKernelSignalSema(SceUID semaid, int signal);
217int sceKernelWaitSema(SceUID semaid, int signal, SceUInt *timeout);
218int sceKernelWaitSemaCB(SceUID semaid, int signal, SceUInt *timeout);
219int sceKernelPollSema(SceUID semaid, int signal);
220int sceKernelReferSemaStatus(SceUID semaid, SceKernelSemaInfo *info);
221
222/* KTLS */
223int sceKernelAllocateKTLS(int id, int (*cb)(unsigned int *size, void *arg), void *arg);
224int sceKernelFreeKTLS(int id);
225void *sceKernelGetKTLS(int id);
226void *sceKernelGetThreadKTLS(int id, SceUID thid, int mode);
227
228/* Alarms. */
229
230typedef SceUInt (*SceKernelAlarmHandler)(void *common);
231
232typedef struct {
233 SceUInt32 low;
234 SceUInt32 hi;
235} SceKernelSysClock;
236
237typedef struct {
238 SceSize size;
239 SceKernelSysClock schedule;
240 SceKernelAlarmHandler handler;
241 void *common;
242} SceKernelAlarmInfo;
243
244SceUID sceKernelSetAlarm(SceUInt clock, SceKernelAlarmHandler handler, void *common);
245SceUID sceKernelSetSysClockAlarm(SceKernelSysClock *clock, SceKernelAlarmHandler handler, void *common);
246int sceKernelCancelAlarm(SceUID alarmid);
247int sceKernelReferAlarmStatus(SceUID alarmid, SceKernelAlarmInfo *info);
248
249/* Callbacks */
250typedef s32 (*SceKernelCallbackFunction)(s32 arg1, s32 arg2, void *arg);
251
252typedef struct {
253 SceSize size;
254 char name[SCE_UID_NAME_LEN + 1];
255 SceUID threadId;
256 SceKernelCallbackFunction callback;
257 void *common;
258 s32 notifyCount;
259 s32 notifyArg;
260} SceKernelCallbackInfo;
261
262int sceKernelNotifyCallback(SceUID cb, int arg2);
263int sceKernelReferCallbackStatus(SceUID cb, SceKernelCallbackInfo *status);
264
265/* VPL Functions */
266
267typedef struct {
268 SceSize size;
269} SceKernelVplOptParam;
270
271
272SceUID sceKernelCreateVpl(const char *name, int part, int attr, unsigned int size, SceKernelVplOptParam *opt);
273
274int sceKernelDeleteVpl(SceUID uid);
275int sceKernelAllocateVpl(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
276int sceKernelAllocateVplCB(SceUID uid, unsigned int size, void **data, unsigned int *timeout);
277int sceKernelTryAllocateVpl(SceUID uid, unsigned int size, void **data);
278int sceKernelFreeVpl(SceUID uid, void *data);
279int sceKernelCancelVpl(SceUID uid, int *pnum);
280
281typedef struct {
282 SceSize size;
283 char name[SCE_UID_NAME_LEN + 1];
284 SceUInt attr;
285 int poolSize;
286 int freeSize;
287 int numWaitThreads;
288} SceKernelVplInfo;
289
290int sceKernelReferVplStatus(SceUID uid, SceKernelVplInfo *info);
291
292/* FPL Functions */
293
294typedef struct {
295 SceSize size;
296} SceKernelFplOptParam;
297
298int sceKernelCreateFpl(const char *name, int part, int attr, unsigned int size, unsigned int blocks, SceKernelFplOptParam *opt);
299int sceKernelDeleteFpl(SceUID uid);
300int sceKernelAllocateFpl(SceUID uid, void **data, unsigned int *timeout);
301int sceKernelAllocateFplCB(SceUID uid, void **data, unsigned int *timeout);
302int sceKernelTryAllocateFpl(SceUID uid, void **data);
303int sceKernelFreeFpl(SceUID uid, void *data);
304int sceKernelCancelFpl(SceUID uid, int *pnum);
305
306typedef struct {
307 SceSize size;
308 char name[SCE_UID_NAME_LEN + 1];
309 SceUInt attr;
310 int blockSize;
311 int numBlocks;
312 int freeBlocks;
313 int numWaitThreads;
314} SceKernelFplInfo;
315
316int sceKernelReferFplStatus(SceUID uid, SceKernelFplInfo *info);
317
318s64 sceKernelGetSystemTimeWide(void);
319
320#endif /* THREADMAN_KERNEL_H */
321