1 // Copyright 2019 The Marl Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #define MARL_REG_R1 0x00
16 #define MARL_REG_R2 0x08
17 #define MARL_REG_R13 0x10
18 #define MARL_REG_R14 0x18
19 #define MARL_REG_R15 0x20
20 #define MARL_REG_R16 0x28
21 #define MARL_REG_R17 0x30
22 #define MARL_REG_R18 0x38
23 #define MARL_REG_R19 0x40
24 #define MARL_REG_R20 0x48
25 #define MARL_REG_R21 0x50
26 #define MARL_REG_R22 0x58
27 #define MARL_REG_R23 0x60
28 #define MARL_REG_R24 0x68
29 #define MARL_REG_R25 0x70
30 #define MARL_REG_R26 0x78
31 #define MARL_REG_R27 0x80
32 #define MARL_REG_R28 0x88
33 #define MARL_REG_R29 0x90
34 #define MARL_REG_R30 0x98
35 #define MARL_REG_R31 0xa0
36 
37 #define MARL_REG_R3 0xa8
38 #define MARL_REG_R4 0xb0
39 
40 #define MARL_REG_LR 0xb8
41 #define MARL_REG_CCR 0xc0
42 
43 #define MARL_REG_FPR14 0xc8
44 #define MARL_REG_FPR15 0xd0
45 #define MARL_REG_FPR16 0xd8
46 #define MARL_REG_FPR17 0xe0
47 #define MARL_REG_FPR18 0xe8
48 #define MARL_REG_FPR19 0xf0
49 #define MARL_REG_FPR20 0xf8
50 #define MARL_REG_FPR21 0x100
51 #define MARL_REG_FPR22 0x108
52 #define MARL_REG_FPR23 0x110
53 #define MARL_REG_FPR24 0x118
54 #define MARL_REG_FPR25 0x120
55 #define MARL_REG_FPR26 0x128
56 #define MARL_REG_FPR27 0x130
57 #define MARL_REG_FPR28 0x138
58 #define MARL_REG_FPR29 0x140
59 #define MARL_REG_FPR30 0x148
60 #define MARL_REG_FPR31 0x150
61 
62 #define MARL_REG_VRSAVE 0x158
63 #define MARL_REG_VMX 0x160
64 
65 #ifndef MARL_BUILD_ASM
66 
67 #include <stdint.h>
68 
69 struct marl_fiber_context {
70   // non-volatile registers
71   uintptr_t r1;
72   uintptr_t r2;
73   uintptr_t r13;
74   uintptr_t r14;
75   uintptr_t r15;
76   uintptr_t r16;
77   uintptr_t r17;
78   uintptr_t r18;
79   uintptr_t r19;
80   uintptr_t r20;
81   uintptr_t r21;
82   uintptr_t r22;
83   uintptr_t r23;
84   uintptr_t r24;
85   uintptr_t r25;
86   uintptr_t r26;
87   uintptr_t r27;
88   uintptr_t r28;
89   uintptr_t r29;
90   uintptr_t r30;
91   uintptr_t r31;
92 
93   // first two parameter registers (r3, r4)
94   uintptr_t r3;
95   uintptr_t r4;
96 
97   // special registers
98   uintptr_t lr;
99   uintptr_t ccr;
100 
101   // non-volatile floating-point registers (f14-f31)
102   uintptr_t fpr14;
103   uintptr_t fpr15;
104   uintptr_t fpr16;
105   uintptr_t fpr17;
106   uintptr_t fpr18;
107   uintptr_t fpr19;
108   uintptr_t fpr20;
109   uintptr_t fpr21;
110   uintptr_t fpr22;
111   uintptr_t fpr23;
112   uintptr_t fpr24;
113   uintptr_t fpr25;
114   uintptr_t fpr26;
115   uintptr_t fpr27;
116   uintptr_t fpr28;
117   uintptr_t fpr29;
118   uintptr_t fpr30;
119   uintptr_t fpr31;
120 
121   // non-volatile altivec registers
122   uint32_t vrsave;
123   uintptr_t vmx[12 * 2];
124 };
125 
126 // Only the ELFv2 ABI is supported for now.
127 #if !defined(_CALL_ELF) || (_CALL_ELF != 2)
128 #error "Only the ppc64 ELFv2 ABI is supported."
129 #endif
130 
131 #ifdef __cplusplus
132 #include <cstddef>
133 static_assert(offsetof(marl_fiber_context, r1) == MARL_REG_R1,
134               "Bad register offset");
135 static_assert(offsetof(marl_fiber_context, r2) == MARL_REG_R2,
136               "Bad register offset");
137 static_assert(offsetof(marl_fiber_context, r13) == MARL_REG_R13,
138               "Bad register offset");
139 static_assert(offsetof(marl_fiber_context, r15) == MARL_REG_R15,
140               "Bad register offset");
141 static_assert(offsetof(marl_fiber_context, r16) == MARL_REG_R16,
142               "Bad register offset");
143 static_assert(offsetof(marl_fiber_context, r17) == MARL_REG_R17,
144               "Bad register offset");
145 static_assert(offsetof(marl_fiber_context, r18) == MARL_REG_R18,
146               "Bad register offset");
147 static_assert(offsetof(marl_fiber_context, r19) == MARL_REG_R19,
148               "Bad register offset");
149 static_assert(offsetof(marl_fiber_context, r20) == MARL_REG_R20,
150               "Bad register offset");
151 static_assert(offsetof(marl_fiber_context, r21) == MARL_REG_R21,
152               "Bad register offset");
153 static_assert(offsetof(marl_fiber_context, r22) == MARL_REG_R22,
154               "Bad register offset");
155 static_assert(offsetof(marl_fiber_context, r23) == MARL_REG_R23,
156               "Bad register offset");
157 static_assert(offsetof(marl_fiber_context, r24) == MARL_REG_R24,
158               "Bad register offset");
159 static_assert(offsetof(marl_fiber_context, r25) == MARL_REG_R25,
160               "Bad register offset");
161 static_assert(offsetof(marl_fiber_context, r26) == MARL_REG_R26,
162               "Bad register offset");
163 static_assert(offsetof(marl_fiber_context, r27) == MARL_REG_R27,
164               "Bad register offset");
165 static_assert(offsetof(marl_fiber_context, r28) == MARL_REG_R28,
166               "Bad register offset");
167 static_assert(offsetof(marl_fiber_context, r29) == MARL_REG_R29,
168               "Bad register offset");
169 static_assert(offsetof(marl_fiber_context, r30) == MARL_REG_R30,
170               "Bad register offset");
171 static_assert(offsetof(marl_fiber_context, r31) == MARL_REG_R31,
172               "Bad register offset");
173 static_assert(offsetof(marl_fiber_context, r14) == MARL_REG_R14,
174               "Bad register offset");
175 static_assert(offsetof(marl_fiber_context, lr) == MARL_REG_LR,
176               "Bad register offset");
177 static_assert(offsetof(marl_fiber_context, ccr) == MARL_REG_CCR,
178               "Bad register offset");
179 static_assert(offsetof(marl_fiber_context, fpr14) == MARL_REG_FPR14,
180               "Bad register offset");
181 static_assert(offsetof(marl_fiber_context, fpr15) == MARL_REG_FPR15,
182               "Bad register offset");
183 static_assert(offsetof(marl_fiber_context, fpr16) == MARL_REG_FPR16,
184               "Bad register offset");
185 static_assert(offsetof(marl_fiber_context, fpr17) == MARL_REG_FPR17,
186               "Bad register offset");
187 static_assert(offsetof(marl_fiber_context, fpr18) == MARL_REG_FPR18,
188               "Bad register offset");
189 static_assert(offsetof(marl_fiber_context, fpr19) == MARL_REG_FPR19,
190               "Bad register offset");
191 static_assert(offsetof(marl_fiber_context, fpr20) == MARL_REG_FPR20,
192               "Bad register offset");
193 static_assert(offsetof(marl_fiber_context, fpr21) == MARL_REG_FPR21,
194               "Bad register offset");
195 static_assert(offsetof(marl_fiber_context, fpr22) == MARL_REG_FPR22,
196               "Bad register offset");
197 static_assert(offsetof(marl_fiber_context, fpr23) == MARL_REG_FPR23,
198               "Bad register offset");
199 static_assert(offsetof(marl_fiber_context, fpr24) == MARL_REG_FPR24,
200               "Bad register offset");
201 static_assert(offsetof(marl_fiber_context, fpr25) == MARL_REG_FPR25,
202               "Bad register offset");
203 static_assert(offsetof(marl_fiber_context, fpr26) == MARL_REG_FPR26,
204               "Bad register offset");
205 static_assert(offsetof(marl_fiber_context, fpr27) == MARL_REG_FPR27,
206               "Bad register offset");
207 static_assert(offsetof(marl_fiber_context, fpr28) == MARL_REG_FPR28,
208               "Bad register offset");
209 static_assert(offsetof(marl_fiber_context, fpr29) == MARL_REG_FPR29,
210               "Bad register offset");
211 static_assert(offsetof(marl_fiber_context, fpr30) == MARL_REG_FPR30,
212               "Bad register offset");
213 static_assert(offsetof(marl_fiber_context, fpr31) == MARL_REG_FPR31,
214               "Bad register offset");
215 static_assert((offsetof(marl_fiber_context, vmx) % 16) == 0,
216               "VMX must be quadword aligned");
217 static_assert(offsetof(marl_fiber_context, vmx) == MARL_REG_VMX,
218               "Bad register offset");
219 static_assert(offsetof(marl_fiber_context, vrsave) == MARL_REG_VRSAVE,
220               "Bad register offset");
221 #endif  // __cplusplus
222 
223 #endif  // MARL_BUILD_ASM
224