1 /*---------------------------------------------------------------------------* 2 Project: OS Context API 3 File: KernelOSContext.h 4 5 Copyright (C) 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 *---------------------------------------------------------------------------*/ 14 15 #ifndef __KERNELOSCONTEXT_H__ 16 #define __KERNELOSCONTEXT_H__ 17 18 #define OSCONTEXT_TXT_TAG1 0x4F53436F 19 #define OSCONTEXT_TXT_TAG2 0x6E747874 20 21 #ifndef _ASSEMBLER 22 #include <types.h> 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 #endif // _ASSEMBLER 28 29 /*---------------------------------------------------------------------------* 30 Context API 31 *---------------------------------------------------------------------------*/ 32 33 // Context status 34 #define OS_CONTEXT_STATE_EXC 0x02 // set if saved by exception 35 #define OS_CONTEXT_STATE_PMCSAVED 0x04 // set if saved PMC registers 36 #define OS_CONTEXT_STATE_OSCALLBACK 0x08 // set if OSLoadContext must be 37 // cleared first 38 #define OS_CONTEXT_STATE_USERMODE_SAVED 0x10 // Context was saved by user-mode OSSaveContext 39 40 #define OS_CONTEXT_STATE_EXC_BIT 30 41 #define OS_CONTEXT_STATE_PMCSAVED_BIT 29 42 #define OS_CONTEXT_STATE_OSCALLBACK_BIT 28 43 #define OS_CONTEXT_STATE_USERMODE_SAVED_BIT 27 44 45 // Context attributes 46 #define OS_CONTEXT_ATTR_AFFINITY_NONE 0x00000007 // no affinity: run on any core 47 #define OS_CONTEXT_ATTR_AFFINITY_CORE0 0x00000001 // run only on core0 48 #define OS_CONTEXT_ATTR_AFFINITY_CORE1 0x00000002 // run only on core1 49 #define OS_CONTEXT_ATTR_AFFINITY_CORE2 0x00000004 // run only on core2 50 51 #define OS_CONTEXT_ATTR_AFFINITY_CORE0_BIT 31 52 #define OS_CONTEXT_ATTR_AFFINITY_CORE1_BIT 30 53 #define OS_CONTEXT_ATTR_AFFINITY_CORE2_BIT 29 54 55 #ifndef _ASSEMBLER 56 57 FORWARD_DECLARE_STRUCT_TYPE(OSContext) 58 SET_STRUCT_ALIGN(8) 59 struct OSContext 60 { 61 u32 txtTag1; // 'OSCo' 0x4F53436F - crashdump markers 62 u32 txtTag2; // 'ntxt' 0x6E747874 63 64 // General-purpose registers 65 u32 gpr[32]; 66 67 u32 cr; 68 u32 lr; 69 u32 ctr; 70 u32 xer; 71 72 // Exception handling registers 73 u32 srr0; 74 u32 srr1; 75 76 // Only valid during DSI exception 77 u32 exception_specific0; // Contains DSISR during DSI 78 u32 exception_specific1; // Contains DAR during DSI 79 80 u32 crash_exception_type; 81 u32 os_reserved; 82 83 u32 fpscr_pad; 84 u32 fpscr; 85 86 // Floating-point registers 87 f64 fpr[32]; 88 89 // Context mode 90 u16 spinLockCount; // the number of spinlock that this thread is holding. 91 u16 state; // OR-ed OS_CONTEXT_STATE_* 92 93 // Place Gecko regs at the end so we have minimal changes to 94 // existing code 95 u32 gqr[8]; 96 u32 pir; 97 f64 psf[32]; 98 // placed coretime here so it is 64-bit aligned 99 // TODO: wanted to use a define like SYSTEM_MAX_CORES 100 // but it was too entangled (also will not fix the defines) 101 u64 coretime[3]; // cumulative run times of this context 102 u64 starttime; // time context started executing last 103 104 u32 error; // per-thread OS error. 105 u32 attributes; // per-context affinity, etc. 106 107 u32 pmc1; // per-thread PMC and MMCRs 108 u32 pmc2; 109 u32 pmc3; 110 u32 pmc4; 111 u32 mmcr0; 112 u32 mmcr1; 113 }; 114 SET_STRUCT_ALIGN(1) 115 #endif // _ASSEMBLER 116 117 #define OS_CONTEXT_TXTTAG1 0 118 #define OS_CONTEXT_TXTTAG2 4 119 120 #define OS_CONTEXT_R0 8 121 #define OS_CONTEXT_R1 12 122 #define OS_CONTEXT_R2 16 123 #define OS_CONTEXT_R3 20 124 #define OS_CONTEXT_R4 24 125 #define OS_CONTEXT_R5 28 126 #define OS_CONTEXT_R6 32 127 #define OS_CONTEXT_R7 36 128 #define OS_CONTEXT_R8 40 129 #define OS_CONTEXT_R9 44 130 #define OS_CONTEXT_R10 48 131 #define OS_CONTEXT_R11 52 132 #define OS_CONTEXT_R12 56 133 #define OS_CONTEXT_R13 60 134 #define OS_CONTEXT_R14 64 135 #define OS_CONTEXT_R15 68 136 #define OS_CONTEXT_R16 72 137 #define OS_CONTEXT_R17 76 138 #define OS_CONTEXT_R18 80 139 #define OS_CONTEXT_R19 84 140 #define OS_CONTEXT_R20 88 141 #define OS_CONTEXT_R21 92 142 #define OS_CONTEXT_R22 96 143 #define OS_CONTEXT_R23 100 144 #define OS_CONTEXT_R24 104 145 #define OS_CONTEXT_R25 108 146 #define OS_CONTEXT_R26 112 147 #define OS_CONTEXT_R27 116 148 #define OS_CONTEXT_R28 120 149 #define OS_CONTEXT_R29 124 150 #define OS_CONTEXT_R30 128 151 #define OS_CONTEXT_R31 132 152 153 #define OS_CONTEXT_CR 136 154 #define OS_CONTEXT_LR 140 155 #define OS_CONTEXT_CTR 144 156 #define OS_CONTEXT_XER 148 157 158 #define OS_CONTEXT_SRR0 152 159 #define OS_CONTEXT_SRR1 156 160 161 #define OS_CONTEXT_EXCEPTION_SPECIFIC0 160 // Holds DSISR for DSI 162 #define OS_CONTEXT_EXCEPTION_SPECIFIC1 164 // Holds DAR for DSI 163 164 #define OS_CONTEXT_OS_RESERVED0 168 165 #define OS_CONTEXT_OS_RESERVED1 172 166 167 #define OS_CONTEXT_FPSCR 176 // 8 bytes including padding 168 169 #define OS_CONTEXT_FPR0 184 170 #define OS_CONTEXT_FPR1 192 171 #define OS_CONTEXT_FPR2 200 172 #define OS_CONTEXT_FPR3 208 173 #define OS_CONTEXT_FPR4 216 174 #define OS_CONTEXT_FPR5 224 175 #define OS_CONTEXT_FPR6 232 176 #define OS_CONTEXT_FPR7 240 177 #define OS_CONTEXT_FPR8 248 178 #define OS_CONTEXT_FPR9 256 179 #define OS_CONTEXT_FPR10 264 180 #define OS_CONTEXT_FPR11 272 181 #define OS_CONTEXT_FPR12 280 182 #define OS_CONTEXT_FPR13 288 183 #define OS_CONTEXT_FPR14 296 184 #define OS_CONTEXT_FPR15 304 185 #define OS_CONTEXT_FPR16 312 186 #define OS_CONTEXT_FPR17 320 187 #define OS_CONTEXT_FPR18 328 188 #define OS_CONTEXT_FPR19 336 189 #define OS_CONTEXT_FPR20 344 190 #define OS_CONTEXT_FPR21 352 191 #define OS_CONTEXT_FPR22 360 192 #define OS_CONTEXT_FPR23 368 193 #define OS_CONTEXT_FPR24 376 194 #define OS_CONTEXT_FPR25 384 195 #define OS_CONTEXT_FPR26 392 196 #define OS_CONTEXT_FPR27 400 197 #define OS_CONTEXT_FPR28 408 198 #define OS_CONTEXT_FPR29 416 199 #define OS_CONTEXT_FPR30 424 200 #define OS_CONTEXT_FPR31 432 201 202 #define OS_CONTEXT_SPINLOCKCOUNT 440 // only 2 bytes 203 #define OS_CONTEXT_STATE 442 // only 2 bytes 204 205 #define OS_CONTEXT_GQR0 444 206 #define OS_CONTEXT_GQR1 448 207 #define OS_CONTEXT_GQR2 452 208 #define OS_CONTEXT_GQR3 456 209 #define OS_CONTEXT_GQR4 460 210 #define OS_CONTEXT_GQR5 464 211 #define OS_CONTEXT_GQR6 468 212 #define OS_CONTEXT_GQR7 472 213 #define OS_CONTEXT_PIR 476 // double word alignment for the 64-bit psf 214 215 #define OS_CONTEXT_PSF0 480 216 #define OS_CONTEXT_PSF1 488 217 #define OS_CONTEXT_PSF2 496 218 #define OS_CONTEXT_PSF3 504 219 #define OS_CONTEXT_PSF4 512 220 #define OS_CONTEXT_PSF5 520 221 #define OS_CONTEXT_PSF6 528 222 #define OS_CONTEXT_PSF7 536 223 #define OS_CONTEXT_PSF8 544 224 #define OS_CONTEXT_PSF9 552 225 #define OS_CONTEXT_PSF10 560 226 #define OS_CONTEXT_PSF11 568 227 #define OS_CONTEXT_PSF12 576 228 #define OS_CONTEXT_PSF13 584 229 #define OS_CONTEXT_PSF14 592 230 #define OS_CONTEXT_PSF15 600 231 #define OS_CONTEXT_PSF16 608 232 #define OS_CONTEXT_PSF17 616 233 #define OS_CONTEXT_PSF18 624 234 #define OS_CONTEXT_PSF19 632 235 #define OS_CONTEXT_PSF20 640 236 #define OS_CONTEXT_PSF21 648 237 #define OS_CONTEXT_PSF22 656 238 #define OS_CONTEXT_PSF23 664 239 #define OS_CONTEXT_PSF24 672 240 #define OS_CONTEXT_PSF25 680 241 #define OS_CONTEXT_PSF26 688 242 #define OS_CONTEXT_PSF27 696 243 #define OS_CONTEXT_PSF28 704 244 #define OS_CONTEXT_PSF29 712 245 #define OS_CONTEXT_PSF30 720 246 #define OS_CONTEXT_PSF31 728 247 248 #define OS_CONTEXT_CORETIME0 736 249 #define OS_CONTEXT_CORETIME1 744 250 #define OS_CONTEXT_CORETIME2 752 251 #define OS_CONTEXT_STARTTIME 760 252 253 #define OS_CONTEXT_ERROR 768 254 #define OS_CONTEXT_ATTRIBUTES 772 255 256 #define OS_CONTEXT_PMC1 776 257 #define OS_CONTEXT_PMC2 780 258 #define OS_CONTEXT_PMC3 784 259 #define OS_CONTEXT_PMC4 788 260 #define OS_CONTEXT_MMCR0 792 261 #define OS_CONTEXT_MMCR1 796 262 263 #define OS_CONTEXT_SIZE 800 264 265 // The locations that rfi must carefully touch (low and high context) to 266 // guarantee that there will not be a DBAT LRR reload DSI after both 267 // of the loads. These values are chosen to maximize the cache locality. 268 269 #if OS_CONTEXT_R3 < OS_CONTEXT_SRR0 270 #define OS_CONTEXT_RFI_TOUCH_LOW OS_CONTEXT_R3 271 #define OS_CONTEXT_RFI_TOUCH_HIGH OS_CONTEXT_SRR1 272 #else 273 #define OS_CONTEXT_RFI_TOUCH_LOW OS_CONTEXT_SRR0 274 #define OS_CONTEXT_RFI_TOUCH_HIGH OS_CONTEXT_R4 275 #endif 276 277 // Safety nets in case the assumptions of the: 278 // #if OS_CONTEXT_R3 < OS_CONTEXT_SRR0 279 // above are broken by changes. 280 281 #if OS_CONTEXT_R3 > OS_CONTEXT_R4 282 #error "order of r3 and r4 is wrong" 283 #endif 284 #if OS_CONTEXT_SRR0 > OS_CONTEXT_SRR1 285 #error "order of srr0 and srr1 is wrong" 286 #endif 287 288 #ifdef __cplusplus 289 } 290 #endif 291 292 #endif // __KERNELOSCONTEXT_H__ 293 294