1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin OS Context API
3   File:     OSContext.h
4 
5   Copyright 1998-2001 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: OSContext.h,v $
14   Revision 1.3  2006/08/23 10:40:51  kawaset
15   Added OSSwitchFiberEx().
16 
17   Revision 1.2  2006/02/04 11:56:47  hashida
18   (none)
19 
20   Revision 1.1.1.1  2005/12/29 06:53:28  hiratsu
21   Initial import.
22 
23   Revision 1.1.1.1  2005/05/12 02:41:07  yasuh-to
24   Ported from dolphin source tree.
25 
26 
27     10    2002/08/12 15:17 Shiki
28     Added psf_pad field to OSContext{}.
29 
30     9     2001/03/16 16:16 Shiki
31     Clean up.
32 
33     8     2000/08/23 6:40p Shiki
34     Added OSGetStackPointer().
35 
36     7     2000/07/20 7:52p Shiki
37     Added OSSwitchStack() and OSSwitchFiber().
38 
39     6     2000/02/22 3:10p Tian
40     Removed ifdef GEKKO.  Full gekko context structure is always used.
41 
42     5     2000/01/17 6:23p Shiki
43     Replaced OSContext.fpSaved with .state for future thread support.
44 
45     4     2000/01/14 2:31p Tian
46     Fixed bugs in the #defines for the Gekko registers.
47 
48     3     1999/11/29 5:51p Tian
49     Added PSF defines, and increased size of context frame for Gekko
50 
51     2     1999/11/29 2:22p Tian
52     Added Gekko GQRs (graphics quantization registers).  Will need to
53     update frame size if we really need extra FPR array for save/restore of
54     paired singles.
55 
56     8     1999/08/03 4:13p Shiki
57     Removed #ifdef _DEBUG for OSDumpContext().
58 
59     7     1999/08/03 3:54p Shiki
60     Removed dsisr and dar from OSContext.
61 
62     6     1999/07/16 3:17p Shiki
63     Removed the definition of OS_CONTEXT_MODE_MORIBUND.
64 
65     5     1999/07/13 9:37p Shiki
66     Added fpscr_pad member in OSContext so that FPSCR register can be
67     saved/restored properly.
68 
69     4     1999/07/12 10:01p Shiki
70     Added OSFillFPUContext().
71 
72     3     1999/05/11 4:43p Shiki
73     Refreshed include tree.
74 
75     1     1999/04/30 12:49p Tianli01
76 
77     7     1999/04/21 8:06p Shiki
78     Moved to _DEBUG (avoid DEBUG)
79 
80     6     1999/04/13 5:49p Tianli01
81     Fixed FPU saving/loading APIs to conform to spec.
82 
83     5     1999/04/06 2:58p Tianli01
84     Added FPU state saving constants and routines.  Note that FPU saving
85     API is not yet to spec.
86 
87     4     1999/04/02 5:29p Tianli01
88     Changed OSContext to use array.  Added DumpNVRegisters.
89 
90     3     1999/04/01 7:53p Tianli01
91     Added floating point saved bit in OSContext
92 
93     2     1999/03/31 6:09p Tianli01
94     Fixed bugs in field offsets.  Added PPC APIs and OSDumpContext for
95     exceptions.
96 
97     1     1999/03/26 2:08p Tianli01
98     Broken up from previous OS.h.
99   $NoKeywords: $
100  *---------------------------------------------------------------------------*/
101 
102 #ifndef __OSCONTEXT_H__
103 #define __OSCONTEXT_H__
104 
105 #include <revolution/types.h>
106 
107 #ifdef __cplusplus
108 extern "C" {
109 #endif
110 
111 /*---------------------------------------------------------------------------*
112     Context API
113  *---------------------------------------------------------------------------*/
114 
115 // Floating point context modes
116 #define     OS_CONTEXT_MODE_FPU         0x01u
117 #define     OS_CONTEXT_MODE_PSFP        0x02u
118 
119 // Context status
120 #define     OS_CONTEXT_STATE_FPSAVED    0x01u   // set if FPU is saved
121 #define     OS_CONTEXT_STATE_EXC        0x02u   // set if saved by exception
122 
123 typedef struct OSContext
124 {
125     // General-purpose registers
126     u32 gpr[32];
127 
128     u32 cr;
129     u32 lr;
130     u32 ctr;
131     u32 xer;
132 
133     // Floating-point registers
134     f64 fpr[32];
135 
136     u32 fpscr_pad;
137     u32 fpscr;
138 
139     // Exception handling registers
140     u32 srr0;
141     u32 srr1;
142 
143     // Context mode
144     u16 mode;           // since UIMM is 16 bits in PPC
145     u16 state;          // OR-ed OS_CONTEXT_STATE_*
146 
147     // Place Gekko regs at the end so we have minimal changes to
148     // existing code
149     u32 gqr[8];
150     u32 psf_pad;
151     f64 psf[32];
152 
153 } OSContext;
154 
155 // Size of context frame on stack.
156 // This constant should reflect a large enough number to hold
157 // an entire context and padding for the stack frame header.
158 #define __OS_CONTEXT_FRAME  768
159 
160 #define OS_CONTEXT_R0       0
161 #define OS_CONTEXT_R1       4
162 #define OS_CONTEXT_R2       8
163 #define OS_CONTEXT_R3       12
164 #define OS_CONTEXT_R4       16
165 #define OS_CONTEXT_R5       20
166 #define OS_CONTEXT_R6       24
167 #define OS_CONTEXT_R7       28
168 #define OS_CONTEXT_R8       32
169 #define OS_CONTEXT_R9       36
170 #define OS_CONTEXT_R10      40
171 #define OS_CONTEXT_R11      44
172 #define OS_CONTEXT_R12      48
173 #define OS_CONTEXT_R13      52
174 #define OS_CONTEXT_R14      56
175 #define OS_CONTEXT_R15      60
176 #define OS_CONTEXT_R16      64
177 #define OS_CONTEXT_R17      68
178 #define OS_CONTEXT_R18      72
179 #define OS_CONTEXT_R19      76
180 #define OS_CONTEXT_R20      80
181 #define OS_CONTEXT_R21      84
182 #define OS_CONTEXT_R22      88
183 #define OS_CONTEXT_R23      92
184 #define OS_CONTEXT_R24      96
185 #define OS_CONTEXT_R25      100
186 #define OS_CONTEXT_R26      104
187 #define OS_CONTEXT_R27      108
188 #define OS_CONTEXT_R28      112
189 #define OS_CONTEXT_R29      116
190 #define OS_CONTEXT_R30      120
191 #define OS_CONTEXT_R31      124
192 
193 #define OS_CONTEXT_CR       128
194 #define OS_CONTEXT_LR       132
195 #define OS_CONTEXT_CTR      136
196 #define OS_CONTEXT_XER      140
197 
198 #define OS_CONTEXT_FPR0     144
199 #define OS_CONTEXT_FPR1     152
200 #define OS_CONTEXT_FPR2     160
201 #define OS_CONTEXT_FPR3     168
202 #define OS_CONTEXT_FPR4     176
203 #define OS_CONTEXT_FPR5     184
204 #define OS_CONTEXT_FPR6     192
205 #define OS_CONTEXT_FPR7     200
206 #define OS_CONTEXT_FPR8     208
207 #define OS_CONTEXT_FPR9     216
208 #define OS_CONTEXT_FPR10    224
209 #define OS_CONTEXT_FPR11    232
210 #define OS_CONTEXT_FPR12    240
211 #define OS_CONTEXT_FPR13    248
212 #define OS_CONTEXT_FPR14    256
213 #define OS_CONTEXT_FPR15    264
214 #define OS_CONTEXT_FPR16    272
215 #define OS_CONTEXT_FPR17    280
216 #define OS_CONTEXT_FPR18    288
217 #define OS_CONTEXT_FPR19    296
218 #define OS_CONTEXT_FPR20    304
219 #define OS_CONTEXT_FPR21    312
220 #define OS_CONTEXT_FPR22    320
221 #define OS_CONTEXT_FPR23    328
222 #define OS_CONTEXT_FPR24    336
223 #define OS_CONTEXT_FPR25    344
224 #define OS_CONTEXT_FPR26    352
225 #define OS_CONTEXT_FPR27    360
226 #define OS_CONTEXT_FPR28    368
227 #define OS_CONTEXT_FPR29    376
228 #define OS_CONTEXT_FPR30    384
229 #define OS_CONTEXT_FPR31    392
230 
231 #define OS_CONTEXT_FPSCR    400     // 8 bytes including padding
232 
233 #define OS_CONTEXT_SRR0     408
234 #define OS_CONTEXT_SRR1     412
235 
236 #define OS_CONTEXT_MODE     416     // only 2 bytes
237 #define OS_CONTEXT_STATE    418     // only 2 bytes
238 
239 #define OS_CONTEXT_GQR0     420
240 #define OS_CONTEXT_GQR1     424
241 #define OS_CONTEXT_GQR2     428
242 #define OS_CONTEXT_GQR3     432
243 #define OS_CONTEXT_GQR4     436
244 #define OS_CONTEXT_GQR5     440
245 #define OS_CONTEXT_GQR6     444
246 #define OS_CONTEXT_GQR7     448
247 #define __OSCONTEXT_PADDING 452     // double word alignment for the 64 bit psf
248 
249 #define OS_CONTEXT_PSF0     456
250 #define OS_CONTEXT_PSF1     464
251 #define OS_CONTEXT_PSF2     472
252 #define OS_CONTEXT_PSF3     480
253 #define OS_CONTEXT_PSF4     488
254 #define OS_CONTEXT_PSF5     496
255 #define OS_CONTEXT_PSF6     504
256 #define OS_CONTEXT_PSF7     512
257 #define OS_CONTEXT_PSF8     520
258 #define OS_CONTEXT_PSF9     528
259 #define OS_CONTEXT_PSF10    536
260 #define OS_CONTEXT_PSF11    544
261 #define OS_CONTEXT_PSF12    552
262 #define OS_CONTEXT_PSF13    560
263 #define OS_CONTEXT_PSF14    568
264 #define OS_CONTEXT_PSF15    576
265 #define OS_CONTEXT_PSF16    584
266 #define OS_CONTEXT_PSF17    592
267 #define OS_CONTEXT_PSF18    600
268 #define OS_CONTEXT_PSF19    608
269 #define OS_CONTEXT_PSF20    616
270 #define OS_CONTEXT_PSF21    624
271 #define OS_CONTEXT_PSF22    632
272 #define OS_CONTEXT_PSF23    640
273 #define OS_CONTEXT_PSF24    648
274 #define OS_CONTEXT_PSF25    656
275 #define OS_CONTEXT_PSF26    664
276 #define OS_CONTEXT_PSF27    672
277 #define OS_CONTEXT_PSF28    680
278 #define OS_CONTEXT_PSF29    688
279 #define OS_CONTEXT_PSF30    696
280 #define OS_CONTEXT_PSF31    704
281 
282 u32         OSGetStackPointer   ( void );
283 u32         OSSwitchStack       ( u32 newsp );
284 int         OSSwitchFiber       ( u32 pc, u32 newsp );
285 int         OSSwitchFiberEx     ( u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 pc, u32 newsp );
286 
287 void        OSSetCurrentContext ( OSContext* context );
288 OSContext*  OSGetCurrentContext ( void );
289 u32         OSSaveContext       ( OSContext* context );
290 
291 void        OSLoadContext       ( OSContext* context );
292 void        OSClearContext      ( OSContext* context );
293 void        OSInitContext       ( OSContext* context, u32 pc, u32 sp );
294 
295 void        OSLoadFPUContext    ( OSContext* context );
296 void        OSSaveFPUContext    ( OSContext* context );
297 
298 void        OSFillFPUContext    ( OSContext* context );
299 
300 void        OSDumpContext       ( OSContext* context );
301 
302 #ifdef __cplusplus
303 }
304 #endif
305 
306 #endif  // __OSCONTEXT_H__
307