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