1//===-- RegisterInfos_ppc64.h -----------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifdef DECLARE_REGISTER_INFOS_PPC64_STRUCT
10
11#include <cstddef>
12
13// Computes the offset of the given GPR_PPC64 in the user data area.
14#define GPR_PPC64_OFFSET(regname) (offsetof(GPR_PPC64, regname))
15#define FPR_PPC64_OFFSET(regname) (offsetof(FPR_PPC64, regname) \
16 + sizeof(GPR_PPC64))
17#define VMX_PPC64_OFFSET(regname) (offsetof(VMX_PPC64, regname) \
18 + sizeof(GPR_PPC64) + sizeof(FPR_PPC64))
19#define GPR_PPC64_SIZE(regname) (sizeof(((GPR_PPC64 *)NULL)->regname))
20
21#include "Utility/PPC64_DWARF_Registers.h"
22#include "lldb-ppc64-register-enums.h"
23
24// Note that the size and offset will be updated by platform-specific classes.
25#define DEFINE_GPR_PPC64(reg, alt, lldb_kind) \
26 { \
27 #reg, alt, GPR_PPC64_SIZE(reg), GPR_PPC64_OFFSET(reg), lldb::eEncodingUint,\
28 lldb::eFormatHex, \
29 {ppc64_dwarf::dwarf_##reg##_ppc64, \
30 ppc64_dwarf::dwarf_##reg##_ppc64, \
31 lldb_kind, \
32 LLDB_INVALID_REGNUM, \
33 gpr_##reg##_ppc64 }, \
34 NULL, NULL, NULL, \
35 }
36#define DEFINE_FPR_PPC64(reg, alt, lldb_kind) \
37 { \
38#reg, alt, 8, FPR_PPC64_OFFSET(reg), lldb::eEncodingIEEE754, \
39 lldb::eFormatFloat, \
40 {ppc64_dwarf::dwarf_##reg##_ppc64, \
41 ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM, \
42 fpr_##reg##_ppc64 }, \
43 NULL, NULL, NULL, \
44 }
45#define DEFINE_VMX_PPC64(reg, lldb_kind) \
46 { \
47#reg, NULL, 16, VMX_PPC64_OFFSET(reg), lldb::eEncodingVector, \
48 lldb::eFormatVectorOfUInt32, \
49 {ppc64_dwarf::dwarf_##reg##_ppc64, \
50 ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM, \
51 vmx_##reg##_ppc64 }, \
52 NULL, NULL, NULL, \
53 }
54
55// General purpose registers.
56// EH_Frame, Generic, Process Plugin
57#define PPC64_REGS \
58 DEFINE_GPR_PPC64(r0, NULL, LLDB_INVALID_REGNUM) \
59 , DEFINE_GPR_PPC64(r1, NULL, LLDB_REGNUM_GENERIC_SP), \
60 DEFINE_GPR_PPC64(r2, NULL, LLDB_INVALID_REGNUM), \
61 DEFINE_GPR_PPC64(r3, NULL, LLDB_REGNUM_GENERIC_ARG1), \
62 DEFINE_GPR_PPC64(r4, NULL, LLDB_REGNUM_GENERIC_ARG2), \
63 DEFINE_GPR_PPC64(r5, NULL, LLDB_REGNUM_GENERIC_ARG3), \
64 DEFINE_GPR_PPC64(r6, NULL, LLDB_REGNUM_GENERIC_ARG4), \
65 DEFINE_GPR_PPC64(r7, NULL, LLDB_REGNUM_GENERIC_ARG5), \
66 DEFINE_GPR_PPC64(r8, NULL, LLDB_REGNUM_GENERIC_ARG6), \
67 DEFINE_GPR_PPC64(r9, NULL, LLDB_REGNUM_GENERIC_ARG7), \
68 DEFINE_GPR_PPC64(r10, NULL, LLDB_REGNUM_GENERIC_ARG8), \
69 DEFINE_GPR_PPC64(r11, NULL, LLDB_INVALID_REGNUM), \
70 DEFINE_GPR_PPC64(r12, NULL, LLDB_INVALID_REGNUM), \
71 DEFINE_GPR_PPC64(r13, NULL, LLDB_INVALID_REGNUM), \
72 DEFINE_GPR_PPC64(r14, NULL, LLDB_INVALID_REGNUM), \
73 DEFINE_GPR_PPC64(r15, NULL, LLDB_INVALID_REGNUM), \
74 DEFINE_GPR_PPC64(r16, NULL, LLDB_INVALID_REGNUM), \
75 DEFINE_GPR_PPC64(r17, NULL, LLDB_INVALID_REGNUM), \
76 DEFINE_GPR_PPC64(r18, NULL, LLDB_INVALID_REGNUM), \
77 DEFINE_GPR_PPC64(r19, NULL, LLDB_INVALID_REGNUM), \
78 DEFINE_GPR_PPC64(r20, NULL, LLDB_INVALID_REGNUM), \
79 DEFINE_GPR_PPC64(r21, NULL, LLDB_INVALID_REGNUM), \
80 DEFINE_GPR_PPC64(r22, NULL, LLDB_INVALID_REGNUM), \
81 DEFINE_GPR_PPC64(r23, NULL, LLDB_INVALID_REGNUM), \
82 DEFINE_GPR_PPC64(r24, NULL, LLDB_INVALID_REGNUM), \
83 DEFINE_GPR_PPC64(r25, NULL, LLDB_INVALID_REGNUM), \
84 DEFINE_GPR_PPC64(r26, NULL, LLDB_INVALID_REGNUM), \
85 DEFINE_GPR_PPC64(r27, NULL, LLDB_INVALID_REGNUM), \
86 DEFINE_GPR_PPC64(r28, NULL, LLDB_INVALID_REGNUM), \
87 DEFINE_GPR_PPC64(r29, NULL, LLDB_INVALID_REGNUM), \
88 DEFINE_GPR_PPC64(r30, NULL, LLDB_INVALID_REGNUM), \
89 DEFINE_GPR_PPC64(r31, NULL, LLDB_INVALID_REGNUM), \
90 DEFINE_GPR_PPC64(cr, NULL, LLDB_REGNUM_GENERIC_FLAGS), \
91 DEFINE_GPR_PPC64(msr, NULL, LLDB_INVALID_REGNUM), \
92 DEFINE_GPR_PPC64(xer, NULL, LLDB_INVALID_REGNUM), \
93 DEFINE_GPR_PPC64(lr, NULL, LLDB_REGNUM_GENERIC_RA), \
94 DEFINE_GPR_PPC64(ctr, NULL, LLDB_INVALID_REGNUM), \
95 DEFINE_GPR_PPC64(pc, NULL, LLDB_REGNUM_GENERIC_PC), \
96 DEFINE_FPR_PPC64(f0, NULL, LLDB_INVALID_REGNUM), \
97 DEFINE_FPR_PPC64(f1, NULL, LLDB_INVALID_REGNUM), \
98 DEFINE_FPR_PPC64(f2, NULL, LLDB_INVALID_REGNUM), \
99 DEFINE_FPR_PPC64(f3, NULL, LLDB_INVALID_REGNUM), \
100 DEFINE_FPR_PPC64(f4, NULL, LLDB_INVALID_REGNUM), \
101 DEFINE_FPR_PPC64(f5, NULL, LLDB_INVALID_REGNUM), \
102 DEFINE_FPR_PPC64(f6, NULL, LLDB_INVALID_REGNUM), \
103 DEFINE_FPR_PPC64(f7, NULL, LLDB_INVALID_REGNUM), \
104 DEFINE_FPR_PPC64(f8, NULL, LLDB_INVALID_REGNUM), \
105 DEFINE_FPR_PPC64(f9, NULL, LLDB_INVALID_REGNUM), \
106 DEFINE_FPR_PPC64(f10, NULL, LLDB_INVALID_REGNUM), \
107 DEFINE_FPR_PPC64(f11, NULL, LLDB_INVALID_REGNUM), \
108 DEFINE_FPR_PPC64(f12, NULL, LLDB_INVALID_REGNUM), \
109 DEFINE_FPR_PPC64(f13, NULL, LLDB_INVALID_REGNUM), \
110 DEFINE_FPR_PPC64(f14, NULL, LLDB_INVALID_REGNUM), \
111 DEFINE_FPR_PPC64(f15, NULL, LLDB_INVALID_REGNUM), \
112 DEFINE_FPR_PPC64(f16, NULL, LLDB_INVALID_REGNUM), \
113 DEFINE_FPR_PPC64(f17, NULL, LLDB_INVALID_REGNUM), \
114 DEFINE_FPR_PPC64(f18, NULL, LLDB_INVALID_REGNUM), \
115 DEFINE_FPR_PPC64(f19, NULL, LLDB_INVALID_REGNUM), \
116 DEFINE_FPR_PPC64(f20, NULL, LLDB_INVALID_REGNUM), \
117 DEFINE_FPR_PPC64(f21, NULL, LLDB_INVALID_REGNUM), \
118 DEFINE_FPR_PPC64(f22, NULL, LLDB_INVALID_REGNUM), \
119 DEFINE_FPR_PPC64(f23, NULL, LLDB_INVALID_REGNUM), \
120 DEFINE_FPR_PPC64(f24, NULL, LLDB_INVALID_REGNUM), \
121 DEFINE_FPR_PPC64(f25, NULL, LLDB_INVALID_REGNUM), \
122 DEFINE_FPR_PPC64(f26, NULL, LLDB_INVALID_REGNUM), \
123 DEFINE_FPR_PPC64(f27, NULL, LLDB_INVALID_REGNUM), \
124 DEFINE_FPR_PPC64(f28, NULL, LLDB_INVALID_REGNUM), \
125 DEFINE_FPR_PPC64(f29, NULL, LLDB_INVALID_REGNUM), \
126 DEFINE_FPR_PPC64(f30, NULL, LLDB_INVALID_REGNUM), \
127 DEFINE_FPR_PPC64(f31, NULL, LLDB_INVALID_REGNUM), \
128 {"fpscr", \
129 NULL, \
130 8, \
131 FPR_PPC64_OFFSET(fpscr), \
132 lldb::eEncodingUint, \
133 lldb::eFormatHex, \
134 {ppc64_dwarf::dwarf_fpscr_ppc64, \
135 ppc64_dwarf::dwarf_fpscr_ppc64, LLDB_INVALID_REGNUM, \
136 LLDB_INVALID_REGNUM, fpr_fpscr_ppc64}, \
137 NULL, \
138 NULL, \
139 NULL, \
140 }, \
141 DEFINE_VMX_PPC64(vr0, LLDB_INVALID_REGNUM), \
142 DEFINE_VMX_PPC64(vr1, LLDB_INVALID_REGNUM), \
143 DEFINE_VMX_PPC64(vr2, LLDB_INVALID_REGNUM), \
144 DEFINE_VMX_PPC64(vr3, LLDB_INVALID_REGNUM), \
145 DEFINE_VMX_PPC64(vr4, LLDB_INVALID_REGNUM), \
146 DEFINE_VMX_PPC64(vr5, LLDB_INVALID_REGNUM), \
147 DEFINE_VMX_PPC64(vr6, LLDB_INVALID_REGNUM), \
148 DEFINE_VMX_PPC64(vr7, LLDB_INVALID_REGNUM), \
149 DEFINE_VMX_PPC64(vr8, LLDB_INVALID_REGNUM), \
150 DEFINE_VMX_PPC64(vr9, LLDB_INVALID_REGNUM), \
151 DEFINE_VMX_PPC64(vr10, LLDB_INVALID_REGNUM), \
152 DEFINE_VMX_PPC64(vr11, LLDB_INVALID_REGNUM), \
153 DEFINE_VMX_PPC64(vr12, LLDB_INVALID_REGNUM), \
154 DEFINE_VMX_PPC64(vr13, LLDB_INVALID_REGNUM), \
155 DEFINE_VMX_PPC64(vr14, LLDB_INVALID_REGNUM), \
156 DEFINE_VMX_PPC64(vr15, LLDB_INVALID_REGNUM), \
157 DEFINE_VMX_PPC64(vr16, LLDB_INVALID_REGNUM), \
158 DEFINE_VMX_PPC64(vr17, LLDB_INVALID_REGNUM), \
159 DEFINE_VMX_PPC64(vr18, LLDB_INVALID_REGNUM), \
160 DEFINE_VMX_PPC64(vr19, LLDB_INVALID_REGNUM), \
161 DEFINE_VMX_PPC64(vr20, LLDB_INVALID_REGNUM), \
162 DEFINE_VMX_PPC64(vr21, LLDB_INVALID_REGNUM), \
163 DEFINE_VMX_PPC64(vr22, LLDB_INVALID_REGNUM), \
164 DEFINE_VMX_PPC64(vr23, LLDB_INVALID_REGNUM), \
165 DEFINE_VMX_PPC64(vr24, LLDB_INVALID_REGNUM), \
166 DEFINE_VMX_PPC64(vr25, LLDB_INVALID_REGNUM), \
167 DEFINE_VMX_PPC64(vr26, LLDB_INVALID_REGNUM), \
168 DEFINE_VMX_PPC64(vr27, LLDB_INVALID_REGNUM), \
169 DEFINE_VMX_PPC64(vr28, LLDB_INVALID_REGNUM), \
170 DEFINE_VMX_PPC64(vr29, LLDB_INVALID_REGNUM), \
171 DEFINE_VMX_PPC64(vr30, LLDB_INVALID_REGNUM), \
172 DEFINE_VMX_PPC64(vr31, LLDB_INVALID_REGNUM), \
173 {"vscr", \
174 NULL, \
175 4, \
176 VMX_PPC64_OFFSET(vscr), \
177 lldb::eEncodingUint, \
178 lldb::eFormatHex, \
179 {ppc64_dwarf::dwarf_vscr_ppc64, ppc64_dwarf::dwarf_vscr_ppc64, \
180 LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, vmx_vscr_ppc64}, \
181 NULL, \
182 NULL, \
183 NULL, \
184 }, \
185 {"vrsave", \
186 NULL, \
187 4, \
188 VMX_PPC64_OFFSET(vrsave), \
189 lldb::eEncodingUint, \
190 lldb::eFormatHex, \
191 {ppc64_dwarf::dwarf_vrsave_ppc64, \
192 ppc64_dwarf::dwarf_vrsave_ppc64, LLDB_INVALID_REGNUM, \
193 LLDB_INVALID_REGNUM, vmx_vrsave_ppc64}, \
194 NULL, \
195 NULL, \
196 NULL, \
197 }, /* */
198
199typedef struct _GPR_PPC64 {
200 uint64_t r0;
201 uint64_t r1;
202 uint64_t r2;
203 uint64_t r3;
204 uint64_t r4;
205 uint64_t r5;
206 uint64_t r6;
207 uint64_t r7;
208 uint64_t r8;
209 uint64_t r9;
210 uint64_t r10;
211 uint64_t r11;
212 uint64_t r12;
213 uint64_t r13;
214 uint64_t r14;
215 uint64_t r15;
216 uint64_t r16;
217 uint64_t r17;
218 uint64_t r18;
219 uint64_t r19;
220 uint64_t r20;
221 uint64_t r21;
222 uint64_t r22;
223 uint64_t r23;
224 uint64_t r24;
225 uint64_t r25;
226 uint64_t r26;
227 uint64_t r27;
228 uint64_t r28;
229 uint64_t r29;
230 uint64_t r30;
231 uint64_t r31;
232 uint64_t cr;
233 uint64_t msr;
234 uint64_t xer;
235 uint64_t lr;
236 uint64_t ctr;
237 uint64_t pc;
238 uint64_t pad[3];
239} GPR_PPC64;
240
241typedef struct _FPR_PPC64 {
242 uint64_t f0;
243 uint64_t f1;
244 uint64_t f2;
245 uint64_t f3;
246 uint64_t f4;
247 uint64_t f5;
248 uint64_t f6;
249 uint64_t f7;
250 uint64_t f8;
251 uint64_t f9;
252 uint64_t f10;
253 uint64_t f11;
254 uint64_t f12;
255 uint64_t f13;
256 uint64_t f14;
257 uint64_t f15;
258 uint64_t f16;
259 uint64_t f17;
260 uint64_t f18;
261 uint64_t f19;
262 uint64_t f20;
263 uint64_t f21;
264 uint64_t f22;
265 uint64_t f23;
266 uint64_t f24;
267 uint64_t f25;
268 uint64_t f26;
269 uint64_t f27;
270 uint64_t f28;
271 uint64_t f29;
272 uint64_t f30;
273 uint64_t f31;
274 uint64_t fpscr;
275} FPR_PPC64;
276
277typedef struct _VMX_PPC64 {
278 uint32_t vr0[4];
279 uint32_t vr1[4];
280 uint32_t vr2[4];
281 uint32_t vr3[4];
282 uint32_t vr4[4];
283 uint32_t vr5[4];
284 uint32_t vr6[4];
285 uint32_t vr7[4];
286 uint32_t vr8[4];
287 uint32_t vr9[4];
288 uint32_t vr10[4];
289 uint32_t vr11[4];
290 uint32_t vr12[4];
291 uint32_t vr13[4];
292 uint32_t vr14[4];
293 uint32_t vr15[4];
294 uint32_t vr16[4];
295 uint32_t vr17[4];
296 uint32_t vr18[4];
297 uint32_t vr19[4];
298 uint32_t vr20[4];
299 uint32_t vr21[4];
300 uint32_t vr22[4];
301 uint32_t vr23[4];
302 uint32_t vr24[4];
303 uint32_t vr25[4];
304 uint32_t vr26[4];
305 uint32_t vr27[4];
306 uint32_t vr28[4];
307 uint32_t vr29[4];
308 uint32_t vr30[4];
309 uint32_t vr31[4];
310 uint32_t pad[2];
311 uint32_t vscr[2];
312 uint32_t vrsave;
313} VMX_PPC64;
314
315
316static lldb_private::RegisterInfo g_register_infos_ppc64[] = {
317 PPC64_REGS
318};
319
320static_assert((sizeof(g_register_infos_ppc64) /
321 sizeof(g_register_infos_ppc64[0])) ==
322 k_num_registers_ppc64,
323 "g_register_infos_powerpc64 has wrong number of register infos");
324
325#undef DEFINE_FPR_PPC64
326#undef DEFINE_GPR_PPC64
327#undef DEFINE_VMX_PPC64
328
329#endif // DECLARE_REGISTER_INFOS_PPC64_STRUCT
330

source code of lldb/source/Plugins/Process/Utility/RegisterInfos_ppc64.h