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