1336823Sdim//===-- RegisterInfos_ppc64.h -----------------------------------*- C++ -*-===//
2336823Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6336823Sdim//
7336823Sdim//===----------------------------------------------------------------------===//
8336823Sdim
9336823Sdim#ifdef DECLARE_REGISTER_INFOS_PPC64_STRUCT
10336823Sdim
11336823Sdim#include <stddef.h>
12336823Sdim
13336823Sdim// Computes the offset of the given GPR_PPC64 in the user data area.
14336823Sdim#define GPR_PPC64_OFFSET(regname) (offsetof(GPR_PPC64, regname))
15336823Sdim#define FPR_PPC64_OFFSET(regname) (offsetof(FPR_PPC64, regname)                \
16336823Sdim                                   + sizeof(GPR_PPC64))
17336823Sdim#define VMX_PPC64_OFFSET(regname) (offsetof(VMX_PPC64, regname)                \
18336823Sdim                                   + sizeof(GPR_PPC64) + sizeof(FPR_PPC64))
19336823Sdim#define GPR_PPC64_SIZE(regname) (sizeof(((GPR_PPC64 *)NULL)->regname))
20336823Sdim
21336823Sdim#include "Utility/PPC64_DWARF_Registers.h"
22336823Sdim#include "lldb-ppc64-register-enums.h"
23336823Sdim
24336823Sdim// Note that the size and offset will be updated by platform-specific classes.
25336823Sdim#define DEFINE_GPR_PPC64(reg, alt, lldb_kind)                                  \
26336823Sdim  {                                                                            \
27336823Sdim    #reg, alt, GPR_PPC64_SIZE(reg), GPR_PPC64_OFFSET(reg), lldb::eEncodingUint,\
28336823Sdim                                         lldb::eFormatHex,                     \
29336823Sdim                                         {ppc64_dwarf::dwarf_##reg##_ppc64,    \
30336823Sdim                                          ppc64_dwarf::dwarf_##reg##_ppc64,    \
31336823Sdim                                          lldb_kind,                           \
32336823Sdim                                          LLDB_INVALID_REGNUM,                 \
33336823Sdim                                          gpr_##reg##_ppc64 },                 \
34336823Sdim                                          NULL, NULL, NULL, 0                  \
35336823Sdim  }
36336823Sdim#define DEFINE_FPR_PPC64(reg, alt, lldb_kind)                                  \
37336823Sdim  {                                                                            \
38336823Sdim#reg, alt, 8, FPR_PPC64_OFFSET(reg), lldb::eEncodingIEEE754,                   \
39336823Sdim        lldb::eFormatFloat,                                                    \
40336823Sdim        {ppc64_dwarf::dwarf_##reg##_ppc64,                                     \
41336823Sdim         ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM,     \
42336823Sdim         fpr_##reg##_ppc64 },                                                  \
43336823Sdim         NULL, NULL, NULL, 0                                                   \
44336823Sdim  }
45336823Sdim#define DEFINE_VMX_PPC64(reg, lldb_kind)                                       \
46336823Sdim  {                                                                            \
47336823Sdim#reg, NULL, 16, VMX_PPC64_OFFSET(reg), lldb::eEncodingVector,                  \
48336823Sdim        lldb::eFormatVectorOfUInt32,                                           \
49336823Sdim        {ppc64_dwarf::dwarf_##reg##_ppc64,                                     \
50336823Sdim         ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM,     \
51336823Sdim         vmx_##reg##_ppc64 },                                                  \
52336823Sdim         NULL, NULL, NULL, 0                                                   \
53336823Sdim  }
54336823Sdim
55336823Sdim// General purpose registers.
56336823Sdim// EH_Frame, Generic, Process Plugin
57336823Sdim#define PPC64_REGS                                                             \
58336823Sdim  DEFINE_GPR_PPC64(r0, NULL, LLDB_INVALID_REGNUM)                              \
59336823Sdim  , DEFINE_GPR_PPC64(r1, "sp", LLDB_REGNUM_GENERIC_SP),                        \
60336823Sdim      DEFINE_GPR_PPC64(r2, NULL, LLDB_INVALID_REGNUM),                         \
61336823Sdim      DEFINE_GPR_PPC64(r3, "arg1", LLDB_REGNUM_GENERIC_ARG1),                  \
62336823Sdim      DEFINE_GPR_PPC64(r4, "arg2", LLDB_REGNUM_GENERIC_ARG2),                  \
63336823Sdim      DEFINE_GPR_PPC64(r5, "arg3", LLDB_REGNUM_GENERIC_ARG3),                  \
64336823Sdim      DEFINE_GPR_PPC64(r6, "arg4", LLDB_REGNUM_GENERIC_ARG4),                  \
65336823Sdim      DEFINE_GPR_PPC64(r7, "arg5", LLDB_REGNUM_GENERIC_ARG5),                  \
66336823Sdim      DEFINE_GPR_PPC64(r8, "arg6", LLDB_REGNUM_GENERIC_ARG6),                  \
67336823Sdim      DEFINE_GPR_PPC64(r9, "arg7", LLDB_REGNUM_GENERIC_ARG7),                  \
68336823Sdim      DEFINE_GPR_PPC64(r10, "arg8", LLDB_REGNUM_GENERIC_ARG8),                 \
69336823Sdim      DEFINE_GPR_PPC64(r11, NULL, LLDB_INVALID_REGNUM),                        \
70336823Sdim      DEFINE_GPR_PPC64(r12, NULL, LLDB_INVALID_REGNUM),                        \
71336823Sdim      DEFINE_GPR_PPC64(r13, NULL, LLDB_INVALID_REGNUM),                        \
72336823Sdim      DEFINE_GPR_PPC64(r14, NULL, LLDB_INVALID_REGNUM),                        \
73336823Sdim      DEFINE_GPR_PPC64(r15, NULL, LLDB_INVALID_REGNUM),                        \
74336823Sdim      DEFINE_GPR_PPC64(r16, NULL, LLDB_INVALID_REGNUM),                        \
75336823Sdim      DEFINE_GPR_PPC64(r17, NULL, LLDB_INVALID_REGNUM),                        \
76336823Sdim      DEFINE_GPR_PPC64(r18, NULL, LLDB_INVALID_REGNUM),                        \
77336823Sdim      DEFINE_GPR_PPC64(r19, NULL, LLDB_INVALID_REGNUM),                        \
78336823Sdim      DEFINE_GPR_PPC64(r20, NULL, LLDB_INVALID_REGNUM),                        \
79336823Sdim      DEFINE_GPR_PPC64(r21, NULL, LLDB_INVALID_REGNUM),                        \
80336823Sdim      DEFINE_GPR_PPC64(r22, NULL, LLDB_INVALID_REGNUM),                        \
81336823Sdim      DEFINE_GPR_PPC64(r23, NULL, LLDB_INVALID_REGNUM),                        \
82336823Sdim      DEFINE_GPR_PPC64(r24, NULL, LLDB_INVALID_REGNUM),                        \
83336823Sdim      DEFINE_GPR_PPC64(r25, NULL, LLDB_INVALID_REGNUM),                        \
84336823Sdim      DEFINE_GPR_PPC64(r26, NULL, LLDB_INVALID_REGNUM),                        \
85336823Sdim      DEFINE_GPR_PPC64(r27, NULL, LLDB_INVALID_REGNUM),                        \
86336823Sdim      DEFINE_GPR_PPC64(r28, NULL, LLDB_INVALID_REGNUM),                        \
87336823Sdim      DEFINE_GPR_PPC64(r29, NULL, LLDB_INVALID_REGNUM),                        \
88336823Sdim      DEFINE_GPR_PPC64(r30, NULL, LLDB_INVALID_REGNUM),                        \
89336823Sdim      DEFINE_GPR_PPC64(r31, NULL, LLDB_INVALID_REGNUM),                        \
90336823Sdim      DEFINE_GPR_PPC64(cr, "cr", LLDB_REGNUM_GENERIC_FLAGS),                   \
91336823Sdim      DEFINE_GPR_PPC64(msr, "msr", LLDB_INVALID_REGNUM),                       \
92336823Sdim      DEFINE_GPR_PPC64(xer, "xer", LLDB_INVALID_REGNUM),                       \
93336823Sdim      DEFINE_GPR_PPC64(lr, "lr", LLDB_REGNUM_GENERIC_RA),                      \
94336823Sdim      DEFINE_GPR_PPC64(ctr, "ctr", LLDB_INVALID_REGNUM),                       \
95336823Sdim      DEFINE_GPR_PPC64(pc, "pc", LLDB_REGNUM_GENERIC_PC),                      \
96336823Sdim      DEFINE_FPR_PPC64(f0, NULL, LLDB_INVALID_REGNUM),                         \
97336823Sdim      DEFINE_FPR_PPC64(f1, NULL, LLDB_INVALID_REGNUM),                         \
98336823Sdim      DEFINE_FPR_PPC64(f2, NULL, LLDB_INVALID_REGNUM),                         \
99336823Sdim      DEFINE_FPR_PPC64(f3, NULL, LLDB_INVALID_REGNUM),                         \
100336823Sdim      DEFINE_FPR_PPC64(f4, NULL, LLDB_INVALID_REGNUM),                         \
101336823Sdim      DEFINE_FPR_PPC64(f5, NULL, LLDB_INVALID_REGNUM),                         \
102336823Sdim      DEFINE_FPR_PPC64(f6, NULL, LLDB_INVALID_REGNUM),                         \
103336823Sdim      DEFINE_FPR_PPC64(f7, NULL, LLDB_INVALID_REGNUM),                         \
104336823Sdim      DEFINE_FPR_PPC64(f8, NULL, LLDB_INVALID_REGNUM),                         \
105336823Sdim      DEFINE_FPR_PPC64(f9, NULL, LLDB_INVALID_REGNUM),                         \
106336823Sdim      DEFINE_FPR_PPC64(f10, NULL, LLDB_INVALID_REGNUM),                        \
107336823Sdim      DEFINE_FPR_PPC64(f11, NULL, LLDB_INVALID_REGNUM),                        \
108336823Sdim      DEFINE_FPR_PPC64(f12, NULL, LLDB_INVALID_REGNUM),                        \
109336823Sdim      DEFINE_FPR_PPC64(f13, NULL, LLDB_INVALID_REGNUM),                        \
110336823Sdim      DEFINE_FPR_PPC64(f14, NULL, LLDB_INVALID_REGNUM),                        \
111336823Sdim      DEFINE_FPR_PPC64(f15, NULL, LLDB_INVALID_REGNUM),                        \
112336823Sdim      DEFINE_FPR_PPC64(f16, NULL, LLDB_INVALID_REGNUM),                        \
113336823Sdim      DEFINE_FPR_PPC64(f17, NULL, LLDB_INVALID_REGNUM),                        \
114336823Sdim      DEFINE_FPR_PPC64(f18, NULL, LLDB_INVALID_REGNUM),                        \
115336823Sdim      DEFINE_FPR_PPC64(f19, NULL, LLDB_INVALID_REGNUM),                        \
116336823Sdim      DEFINE_FPR_PPC64(f20, NULL, LLDB_INVALID_REGNUM),                        \
117336823Sdim      DEFINE_FPR_PPC64(f21, NULL, LLDB_INVALID_REGNUM),                        \
118336823Sdim      DEFINE_FPR_PPC64(f22, NULL, LLDB_INVALID_REGNUM),                        \
119336823Sdim      DEFINE_FPR_PPC64(f23, NULL, LLDB_INVALID_REGNUM),                        \
120336823Sdim      DEFINE_FPR_PPC64(f24, NULL, LLDB_INVALID_REGNUM),                        \
121336823Sdim      DEFINE_FPR_PPC64(f25, NULL, LLDB_INVALID_REGNUM),                        \
122336823Sdim      DEFINE_FPR_PPC64(f26, NULL, LLDB_INVALID_REGNUM),                        \
123336823Sdim      DEFINE_FPR_PPC64(f27, NULL, LLDB_INVALID_REGNUM),                        \
124336823Sdim      DEFINE_FPR_PPC64(f28, NULL, LLDB_INVALID_REGNUM),                        \
125336823Sdim      DEFINE_FPR_PPC64(f29, NULL, LLDB_INVALID_REGNUM),                        \
126336823Sdim      DEFINE_FPR_PPC64(f30, NULL, LLDB_INVALID_REGNUM),                        \
127336823Sdim      DEFINE_FPR_PPC64(f31, NULL, LLDB_INVALID_REGNUM),                        \
128336823Sdim      {"fpscr",                                                                \
129336823Sdim       NULL,                                                                   \
130336823Sdim       8,                                                                      \
131336823Sdim       FPR_PPC64_OFFSET(fpscr),                                                \
132336823Sdim       lldb::eEncodingUint,                                                    \
133336823Sdim       lldb::eFormatHex,                                                       \
134336823Sdim       {ppc64_dwarf::dwarf_fpscr_ppc64,                                        \
135336823Sdim        ppc64_dwarf::dwarf_fpscr_ppc64, LLDB_INVALID_REGNUM,                   \
136336823Sdim        LLDB_INVALID_REGNUM, fpr_fpscr_ppc64},                                 \
137336823Sdim       NULL,                                                                   \
138336823Sdim       NULL,                                                                   \
139336823Sdim       NULL,                                                                   \
140336823Sdim       0},                                                                     \
141336823Sdim      DEFINE_VMX_PPC64(vr0, LLDB_INVALID_REGNUM),                              \
142336823Sdim      DEFINE_VMX_PPC64(vr1, LLDB_INVALID_REGNUM),                              \
143336823Sdim      DEFINE_VMX_PPC64(vr2, LLDB_INVALID_REGNUM),                              \
144336823Sdim      DEFINE_VMX_PPC64(vr3, LLDB_INVALID_REGNUM),                              \
145336823Sdim      DEFINE_VMX_PPC64(vr4, LLDB_INVALID_REGNUM),                              \
146336823Sdim      DEFINE_VMX_PPC64(vr5, LLDB_INVALID_REGNUM),                              \
147336823Sdim      DEFINE_VMX_PPC64(vr6, LLDB_INVALID_REGNUM),                              \
148336823Sdim      DEFINE_VMX_PPC64(vr7, LLDB_INVALID_REGNUM),                              \
149336823Sdim      DEFINE_VMX_PPC64(vr8, LLDB_INVALID_REGNUM),                              \
150336823Sdim      DEFINE_VMX_PPC64(vr9, LLDB_INVALID_REGNUM),                              \
151336823Sdim      DEFINE_VMX_PPC64(vr10, LLDB_INVALID_REGNUM),                             \
152336823Sdim      DEFINE_VMX_PPC64(vr11, LLDB_INVALID_REGNUM),                             \
153336823Sdim      DEFINE_VMX_PPC64(vr12, LLDB_INVALID_REGNUM),                             \
154336823Sdim      DEFINE_VMX_PPC64(vr13, LLDB_INVALID_REGNUM),                             \
155336823Sdim      DEFINE_VMX_PPC64(vr14, LLDB_INVALID_REGNUM),                             \
156336823Sdim      DEFINE_VMX_PPC64(vr15, LLDB_INVALID_REGNUM),                             \
157336823Sdim      DEFINE_VMX_PPC64(vr16, LLDB_INVALID_REGNUM),                             \
158336823Sdim      DEFINE_VMX_PPC64(vr17, LLDB_INVALID_REGNUM),                             \
159336823Sdim      DEFINE_VMX_PPC64(vr18, LLDB_INVALID_REGNUM),                             \
160336823Sdim      DEFINE_VMX_PPC64(vr19, LLDB_INVALID_REGNUM),                             \
161336823Sdim      DEFINE_VMX_PPC64(vr20, LLDB_INVALID_REGNUM),                             \
162336823Sdim      DEFINE_VMX_PPC64(vr21, LLDB_INVALID_REGNUM),                             \
163336823Sdim      DEFINE_VMX_PPC64(vr22, LLDB_INVALID_REGNUM),                             \
164336823Sdim      DEFINE_VMX_PPC64(vr23, LLDB_INVALID_REGNUM),                             \
165336823Sdim      DEFINE_VMX_PPC64(vr24, LLDB_INVALID_REGNUM),                             \
166336823Sdim      DEFINE_VMX_PPC64(vr25, LLDB_INVALID_REGNUM),                             \
167336823Sdim      DEFINE_VMX_PPC64(vr26, LLDB_INVALID_REGNUM),                             \
168336823Sdim      DEFINE_VMX_PPC64(vr27, LLDB_INVALID_REGNUM),                             \
169336823Sdim      DEFINE_VMX_PPC64(vr28, LLDB_INVALID_REGNUM),                             \
170336823Sdim      DEFINE_VMX_PPC64(vr29, LLDB_INVALID_REGNUM),                             \
171336823Sdim      DEFINE_VMX_PPC64(vr30, LLDB_INVALID_REGNUM),                             \
172336823Sdim      DEFINE_VMX_PPC64(vr31, LLDB_INVALID_REGNUM),                             \
173336823Sdim      {"vscr",                                                                 \
174336823Sdim       NULL,                                                                   \
175336823Sdim       4,                                                                      \
176336823Sdim       VMX_PPC64_OFFSET(vscr),                                                 \
177336823Sdim       lldb::eEncodingUint,                                                    \
178336823Sdim       lldb::eFormatHex,                                                       \
179336823Sdim       {ppc64_dwarf::dwarf_vscr_ppc64, ppc64_dwarf::dwarf_vscr_ppc64,          \
180336823Sdim        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, vmx_vscr_ppc64},             \
181336823Sdim       NULL,                                                                   \
182336823Sdim       NULL,                                                                   \
183336823Sdim       NULL,                                                                   \
184336823Sdim       0},                                                                     \
185336823Sdim      {"vrsave",                                                               \
186336823Sdim       NULL,                                                                   \
187336823Sdim       4,                                                                      \
188336823Sdim       VMX_PPC64_OFFSET(vrsave),                                               \
189336823Sdim       lldb::eEncodingUint,                                                    \
190336823Sdim       lldb::eFormatHex,                                                       \
191336823Sdim       {ppc64_dwarf::dwarf_vrsave_ppc64,                                       \
192336823Sdim        ppc64_dwarf::dwarf_vrsave_ppc64, LLDB_INVALID_REGNUM,                  \
193336823Sdim        LLDB_INVALID_REGNUM, vmx_vrsave_ppc64},                                \
194336823Sdim       NULL,                                                                   \
195336823Sdim       NULL,                                                                   \
196336823Sdim       NULL,                                                                   \
197336823Sdim       0},  /* */
198336823Sdim
199336823Sdimtypedef struct _GPR_PPC64 {
200336823Sdim  uint64_t r0;
201336823Sdim  uint64_t r1;
202336823Sdim  uint64_t r2;
203336823Sdim  uint64_t r3;
204336823Sdim  uint64_t r4;
205336823Sdim  uint64_t r5;
206336823Sdim  uint64_t r6;
207336823Sdim  uint64_t r7;
208336823Sdim  uint64_t r8;
209336823Sdim  uint64_t r9;
210336823Sdim  uint64_t r10;
211336823Sdim  uint64_t r11;
212336823Sdim  uint64_t r12;
213336823Sdim  uint64_t r13;
214336823Sdim  uint64_t r14;
215336823Sdim  uint64_t r15;
216336823Sdim  uint64_t r16;
217336823Sdim  uint64_t r17;
218336823Sdim  uint64_t r18;
219336823Sdim  uint64_t r19;
220336823Sdim  uint64_t r20;
221336823Sdim  uint64_t r21;
222336823Sdim  uint64_t r22;
223336823Sdim  uint64_t r23;
224336823Sdim  uint64_t r24;
225336823Sdim  uint64_t r25;
226336823Sdim  uint64_t r26;
227336823Sdim  uint64_t r27;
228336823Sdim  uint64_t r28;
229336823Sdim  uint64_t r29;
230336823Sdim  uint64_t r30;
231336823Sdim  uint64_t r31;
232336823Sdim  uint64_t cr;
233336823Sdim  uint64_t msr;
234336823Sdim  uint64_t xer;
235336823Sdim  uint64_t lr;
236336823Sdim  uint64_t ctr;
237336823Sdim  uint64_t pc;
238336823Sdim  uint64_t pad[3];
239336823Sdim} GPR_PPC64;
240336823Sdim
241336823Sdimtypedef struct _FPR_PPC64 {
242336823Sdim  uint64_t f0;
243336823Sdim  uint64_t f1;
244336823Sdim  uint64_t f2;
245336823Sdim  uint64_t f3;
246336823Sdim  uint64_t f4;
247336823Sdim  uint64_t f5;
248336823Sdim  uint64_t f6;
249336823Sdim  uint64_t f7;
250336823Sdim  uint64_t f8;
251336823Sdim  uint64_t f9;
252336823Sdim  uint64_t f10;
253336823Sdim  uint64_t f11;
254336823Sdim  uint64_t f12;
255336823Sdim  uint64_t f13;
256336823Sdim  uint64_t f14;
257336823Sdim  uint64_t f15;
258336823Sdim  uint64_t f16;
259336823Sdim  uint64_t f17;
260336823Sdim  uint64_t f18;
261336823Sdim  uint64_t f19;
262336823Sdim  uint64_t f20;
263336823Sdim  uint64_t f21;
264336823Sdim  uint64_t f22;
265336823Sdim  uint64_t f23;
266336823Sdim  uint64_t f24;
267336823Sdim  uint64_t f25;
268336823Sdim  uint64_t f26;
269336823Sdim  uint64_t f27;
270336823Sdim  uint64_t f28;
271336823Sdim  uint64_t f29;
272336823Sdim  uint64_t f30;
273336823Sdim  uint64_t f31;
274336823Sdim  uint64_t fpscr;
275336823Sdim} FPR_PPC64;
276336823Sdim
277336823Sdimtypedef struct _VMX_PPC64 {
278336823Sdim  uint32_t vr0[4];
279336823Sdim  uint32_t vr1[4];
280336823Sdim  uint32_t vr2[4];
281336823Sdim  uint32_t vr3[4];
282336823Sdim  uint32_t vr4[4];
283336823Sdim  uint32_t vr5[4];
284336823Sdim  uint32_t vr6[4];
285336823Sdim  uint32_t vr7[4];
286336823Sdim  uint32_t vr8[4];
287336823Sdim  uint32_t vr9[4];
288336823Sdim  uint32_t vr10[4];
289336823Sdim  uint32_t vr11[4];
290336823Sdim  uint32_t vr12[4];
291336823Sdim  uint32_t vr13[4];
292336823Sdim  uint32_t vr14[4];
293336823Sdim  uint32_t vr15[4];
294336823Sdim  uint32_t vr16[4];
295336823Sdim  uint32_t vr17[4];
296336823Sdim  uint32_t vr18[4];
297336823Sdim  uint32_t vr19[4];
298336823Sdim  uint32_t vr20[4];
299336823Sdim  uint32_t vr21[4];
300336823Sdim  uint32_t vr22[4];
301336823Sdim  uint32_t vr23[4];
302336823Sdim  uint32_t vr24[4];
303336823Sdim  uint32_t vr25[4];
304336823Sdim  uint32_t vr26[4];
305336823Sdim  uint32_t vr27[4];
306336823Sdim  uint32_t vr28[4];
307336823Sdim  uint32_t vr29[4];
308336823Sdim  uint32_t vr30[4];
309336823Sdim  uint32_t vr31[4];
310336823Sdim  uint32_t pad[2];
311336823Sdim  uint32_t vscr[2];
312336823Sdim  uint32_t vrsave;
313336823Sdim} VMX_PPC64;
314336823Sdim
315336823Sdim
316336823Sdimstatic lldb_private::RegisterInfo g_register_infos_ppc64[] = {
317336823Sdim    PPC64_REGS
318336823Sdim};
319336823Sdim
320336823Sdimstatic_assert((sizeof(g_register_infos_ppc64) /
321336823Sdim               sizeof(g_register_infos_ppc64[0])) ==
322336823Sdim                  k_num_registers_ppc64,
323336823Sdim              "g_register_infos_powerpc64 has wrong number of register infos");
324336823Sdim
325336823Sdim#undef DEFINE_FPR_PPC64
326336823Sdim#undef DEFINE_GPR_PPC64
327336823Sdim#undef DEFINE_VMX_PPC64
328336823Sdim
329336823Sdim#endif // DECLARE_REGISTER_INFOS_PPC64_STRUCT
330