summaryrefslogtreecommitdiff
path: root/include/PR/os_thread.h
blob: 95f01fb2b1a04ca0fb694119f347a3238b8af116 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#ifndef PR_OS_THREAD_H
#define PR_OS_THREAD_H

#define OS_STATE_STOPPED    (1 << 0)
#define OS_STATE_RUNNABLE   (1 << 1)
#define OS_STATE_RUNNING    (1 << 2)
#define OS_STATE_WAITING    (1 << 3)

#define OS_PRIORITY_IDLE          0
#define OS_PRIORITY_MAIN         10
#define OS_PRIORITY_GRAPH        11
#define OS_PRIORITY_AUDIOMGR     12
#define OS_PRIORITY_PADMGR       14
#define OS_PRIORITY_SCHED        15
#define OS_PRIORITY_DMAMGR       16
#define OS_PRIORITY_IRQMGR       17
#define OS_PRIORITY_PIMGR        150
#define OS_PRIORITY_FAULTCLIENT  126
#define OS_PRIORITY_FAULT        127
#define OS_PRIORITY_APPMAX       127
#define OS_PRIORITY_RMONSPIN     200
#define OS_PRIORITY_RMON         250
#define OS_PRIORITY_VIMGR        254
#define OS_PRIORITY_MAX          255

#define OS_FLAG_CPU_BREAK   1
#define OS_FLAG_FAULT       2

#ifdef _LANGUAGE_C

#include "ultratypes.h"

typedef s32 OSPri;
typedef s32 OSId;

typedef union {
    struct {
        /* 0x0 */ f32 f_odd;
        /* 0x4 */ f32 f_even;
    } f;
} __OSfp; // size = 0x8

typedef struct {
    /* 0x000 */ u64 at, v0, v1, a0, a1, a2, a3;
    /* 0x038 */ u64 t0, t1, t2, t3, t4, t5, t6, t7;
    /* 0x078 */ u64 s0, s1, s2, s3, s4, s5, s6, s7;
    /* 0x0B8 */ u64 t8, t9, gp, sp, s8, ra;
    /* 0x0E8 */ u64 lo, hi;
    /* 0x0F8 */ u32 sr, pc, cause, badvaddr, rcp;
    /* 0x10C */ u32 fpcsr;
    /* 0x110 */ __OSfp  fp0,  fp2,  fp4,  fp6,  fp8, fp10, fp12, fp14;
    /* 0x150 */ __OSfp fp16, fp18, fp20, fp22, fp24, fp26, fp28, fp30;
} __OSThreadContext; // size = 0x190

typedef struct {
    /* 0x0 */ u32 flag;
    /* 0x4 */ u32 count;
    /* 0x8 */ u64 time;
} __OSThreadprofile; // size = 0x10

typedef struct OSThread {
    /* 0x00 */ struct OSThread* next;
    /* 0x04 */ OSPri priority;
    /* 0x08 */ struct OSThread** queue;
    /* 0x0C */ struct OSThread* tlnext;
    /* 0x10 */ u16 state;
    /* 0x12 */ u16 flags;
    /* 0x14 */ OSId id;
    /* 0x18 */ s32 fp;
    /* 0x1C */ __OSThreadprofile* thprof;
    /* 0x20 */ __OSThreadContext context;
} OSThread; // size = 0x1B0

void osCreateThread(OSThread* thread, OSId id, void* entry, void* arg, void* sp, OSPri p);
void osDestroyThread(OSThread* t);
void osYieldThread(void);
void osStartThread(OSThread* t);
void osStopThread(OSThread* t);
OSId osGetThreadId(OSThread* t);
void osSetThreadPri(OSThread* thread, OSPri p);
OSPri osGetThreadPri(OSThread* t);

// internal
OSThread* __osGetActiveQueue(void);

#else

/* OSThread struct member offsets */

#define THREAD_NEXT     0x00
#define THREAD_PRI      0x04
#define THREAD_QUEUE    0x08
#define THREAD_TLNEXT   0x0C
#define THREAD_STATE    0x10
#define THREAD_FLAGS    0x12
#define THREAD_ID       0x14
#define THREAD_FP       0x18
#define THREAD_PROFILE  0x1C
#define THREAD_CONTEXT  0x20
#define THREAD_AT       (THREAD_CONTEXT + 0x000)
#define THREAD_V0       (THREAD_CONTEXT + 0x008)
#define THREAD_V1       (THREAD_CONTEXT + 0x010)
#define THREAD_A0       (THREAD_CONTEXT + 0x018)
#define THREAD_A1       (THREAD_CONTEXT + 0x020)
#define THREAD_A2       (THREAD_CONTEXT + 0x028)
#define THREAD_A3       (THREAD_CONTEXT + 0x030)
#define THREAD_T0       (THREAD_CONTEXT + 0x038)
#define THREAD_T1       (THREAD_CONTEXT + 0x040)
#define THREAD_T2       (THREAD_CONTEXT + 0x048)
#define THREAD_T3       (THREAD_CONTEXT + 0x050)
#define THREAD_T4       (THREAD_CONTEXT + 0x058)
#define THREAD_T5       (THREAD_CONTEXT + 0x060)
#define THREAD_T6       (THREAD_CONTEXT + 0x068)
#define THREAD_T7       (THREAD_CONTEXT + 0x070)
#define THREAD_S0       (THREAD_CONTEXT + 0x078)
#define THREAD_S1       (THREAD_CONTEXT + 0x080)
#define THREAD_S2       (THREAD_CONTEXT + 0x088)
#define THREAD_S3       (THREAD_CONTEXT + 0x090)
#define THREAD_S4       (THREAD_CONTEXT + 0x098)
#define THREAD_S5       (THREAD_CONTEXT + 0x0A0)
#define THREAD_S6       (THREAD_CONTEXT + 0x0A8)
#define THREAD_S7       (THREAD_CONTEXT + 0x0B0)
#define THREAD_T8       (THREAD_CONTEXT + 0x0B8)
#define THREAD_T9       (THREAD_CONTEXT + 0x0C0)
#define THREAD_GP       (THREAD_CONTEXT + 0x0C8)
#define THREAD_SP       (THREAD_CONTEXT + 0x0D0)
#define THREAD_S8       (THREAD_CONTEXT + 0x0D8)
#define THREAD_RA       (THREAD_CONTEXT + 0x0E0)
#define THREAD_LO       (THREAD_CONTEXT + 0x0E8)
#define THREAD_HI       (THREAD_CONTEXT + 0x0F0)
#define THREAD_SR       (THREAD_CONTEXT + 0x0F8)
#define THREAD_PC       (THREAD_CONTEXT + 0x0FC)
#define THREAD_CAUSE    (THREAD_CONTEXT + 0x100)
#define THREAD_BADVADDR (THREAD_CONTEXT + 0x104)
#define THREAD_RCP      (THREAD_CONTEXT + 0x108)
#define THREAD_FPCSR    (THREAD_CONTEXT + 0x10C)
#define THREAD_FP0      (THREAD_CONTEXT + 0x110)
#define THREAD_FP2      (THREAD_CONTEXT + 0x118)
#define THREAD_FP4      (THREAD_CONTEXT + 0x120)
#define THREAD_FP6      (THREAD_CONTEXT + 0x128)
#define THREAD_FP8      (THREAD_CONTEXT + 0x130)
#define THREAD_FP10     (THREAD_CONTEXT + 0x138)
#define THREAD_FP12     (THREAD_CONTEXT + 0x140)
#define THREAD_FP14     (THREAD_CONTEXT + 0x148)
#define THREAD_FP16     (THREAD_CONTEXT + 0x150)
#define THREAD_FP18     (THREAD_CONTEXT + 0x158)
#define THREAD_FP20     (THREAD_CONTEXT + 0x160)
#define THREAD_FP22     (THREAD_CONTEXT + 0x168)
#define THREAD_FP24     (THREAD_CONTEXT + 0x170)
#define THREAD_FP26     (THREAD_CONTEXT + 0x178)
#define THREAD_FP28     (THREAD_CONTEXT + 0x180)
#define THREAD_FP30     (THREAD_CONTEXT + 0x188)

#endif

#endif