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