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