1dda28197Spatrick //===-- RegisterContextMinidump_ARM64.cpp ---------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "RegisterContextMinidump_ARM64.h"
10061da546Spatrick
11061da546Spatrick #include "Utility/ARM64_DWARF_Registers.h"
12061da546Spatrick #include "lldb/Utility/RegisterValue.h"
13061da546Spatrick #include "lldb/Utility/DataExtractor.h"
14061da546Spatrick #include "lldb/lldb-enumerations.h"
15061da546Spatrick
16061da546Spatrick // C includes
17be691f3bSpatrick #include <cassert>
18061da546Spatrick
19061da546Spatrick // C++ includes
20061da546Spatrick
21061da546Spatrick using namespace lldb;
22061da546Spatrick using namespace lldb_private;
23061da546Spatrick using namespace minidump;
24061da546Spatrick
25061da546Spatrick #define INV LLDB_INVALID_REGNUM
26061da546Spatrick #define OFFSET(r) (offsetof(RegisterContextMinidump_ARM64::Context, r))
27061da546Spatrick
28061da546Spatrick #define DEF_X(i) \
29061da546Spatrick { \
30061da546Spatrick "x" #i, nullptr, 8, OFFSET(x) + i * 8, eEncodingUint, eFormatHex, \
31061da546Spatrick {arm64_dwarf::x##i, arm64_dwarf::x##i, INV, INV, reg_x##i}, \
32*f6aab3d8Srobert nullptr, nullptr, \
33061da546Spatrick }
34061da546Spatrick
35061da546Spatrick #define DEF_W(i) \
36061da546Spatrick { \
37061da546Spatrick "w" #i, nullptr, 4, OFFSET(x) + i * 8, eEncodingUint, eFormatHex, \
38*f6aab3d8Srobert {INV, INV, INV, INV, reg_w##i}, nullptr, nullptr, \
39061da546Spatrick }
40061da546Spatrick
41061da546Spatrick #define DEF_X_ARG(i, n) \
42061da546Spatrick { \
43061da546Spatrick "x" #i, "arg" #n, 8, OFFSET(x) + i * 8, eEncodingUint, eFormatHex, \
44061da546Spatrick {arm64_dwarf::x##i, arm64_dwarf::x##i, LLDB_REGNUM_GENERIC_ARG1 + i, \
45*f6aab3d8Srobert INV, reg_x##i}, nullptr, nullptr, \
46061da546Spatrick }
47061da546Spatrick
48061da546Spatrick #define DEF_V(i) \
49061da546Spatrick { \
50061da546Spatrick "v" #i, nullptr, 16, OFFSET(v) + i * 16, eEncodingVector, \
51061da546Spatrick eFormatVectorOfUInt8, {arm64_dwarf::v##i, arm64_dwarf::v##i, INV, INV, \
52*f6aab3d8Srobert reg_v##i}, nullptr, nullptr, \
53061da546Spatrick }
54061da546Spatrick
55061da546Spatrick #define DEF_D(i) \
56061da546Spatrick { \
57061da546Spatrick "d" #i, nullptr, 8, OFFSET(v) + i * 16, eEncodingVector, \
58061da546Spatrick eFormatVectorOfUInt8, {INV, INV, INV, INV, reg_d##i}, nullptr, \
59*f6aab3d8Srobert nullptr, \
60061da546Spatrick }
61061da546Spatrick
62061da546Spatrick #define DEF_S(i) \
63061da546Spatrick { \
64061da546Spatrick "s" #i, nullptr, 4, OFFSET(v) + i * 16, eEncodingVector, \
65061da546Spatrick eFormatVectorOfUInt8, {INV, INV, INV, INV, reg_s##i}, nullptr, \
66*f6aab3d8Srobert nullptr, \
67061da546Spatrick }
68061da546Spatrick
69061da546Spatrick #define DEF_H(i) \
70061da546Spatrick { \
71061da546Spatrick "h" #i, nullptr, 2, OFFSET(v) + i * 16, eEncodingVector, \
72061da546Spatrick eFormatVectorOfUInt8, {INV, INV, INV, INV, reg_h##i}, nullptr, \
73*f6aab3d8Srobert nullptr, \
74061da546Spatrick }
75061da546Spatrick
76061da546Spatrick // Zero based LLDB register numbers for this register context
77061da546Spatrick enum {
78061da546Spatrick // General Purpose Registers
79061da546Spatrick reg_x0 = 0,
80061da546Spatrick reg_x1,
81061da546Spatrick reg_x2,
82061da546Spatrick reg_x3,
83061da546Spatrick reg_x4,
84061da546Spatrick reg_x5,
85061da546Spatrick reg_x6,
86061da546Spatrick reg_x7,
87061da546Spatrick reg_x8,
88061da546Spatrick reg_x9,
89061da546Spatrick reg_x10,
90061da546Spatrick reg_x11,
91061da546Spatrick reg_x12,
92061da546Spatrick reg_x13,
93061da546Spatrick reg_x14,
94061da546Spatrick reg_x15,
95061da546Spatrick reg_x16,
96061da546Spatrick reg_x17,
97061da546Spatrick reg_x18,
98061da546Spatrick reg_x19,
99061da546Spatrick reg_x20,
100061da546Spatrick reg_x21,
101061da546Spatrick reg_x22,
102061da546Spatrick reg_x23,
103061da546Spatrick reg_x24,
104061da546Spatrick reg_x25,
105061da546Spatrick reg_x26,
106061da546Spatrick reg_x27,
107061da546Spatrick reg_x28,
108061da546Spatrick reg_fp,
109061da546Spatrick reg_lr,
110061da546Spatrick reg_sp,
111061da546Spatrick reg_pc,
112061da546Spatrick reg_w0,
113061da546Spatrick reg_w1,
114061da546Spatrick reg_w2,
115061da546Spatrick reg_w3,
116061da546Spatrick reg_w4,
117061da546Spatrick reg_w5,
118061da546Spatrick reg_w6,
119061da546Spatrick reg_w7,
120061da546Spatrick reg_w8,
121061da546Spatrick reg_w9,
122061da546Spatrick reg_w10,
123061da546Spatrick reg_w11,
124061da546Spatrick reg_w12,
125061da546Spatrick reg_w13,
126061da546Spatrick reg_w14,
127061da546Spatrick reg_w15,
128061da546Spatrick reg_w16,
129061da546Spatrick reg_w17,
130061da546Spatrick reg_w18,
131061da546Spatrick reg_w19,
132061da546Spatrick reg_w20,
133061da546Spatrick reg_w21,
134061da546Spatrick reg_w22,
135061da546Spatrick reg_w23,
136061da546Spatrick reg_w24,
137061da546Spatrick reg_w25,
138061da546Spatrick reg_w26,
139061da546Spatrick reg_w27,
140061da546Spatrick reg_w28,
141061da546Spatrick reg_w29,
142061da546Spatrick reg_w30,
143061da546Spatrick reg_w31,
144061da546Spatrick reg_cpsr,
145061da546Spatrick // Floating Point Registers
146061da546Spatrick reg_fpsr,
147061da546Spatrick reg_fpcr,
148061da546Spatrick reg_v0,
149061da546Spatrick reg_v1,
150061da546Spatrick reg_v2,
151061da546Spatrick reg_v3,
152061da546Spatrick reg_v4,
153061da546Spatrick reg_v5,
154061da546Spatrick reg_v6,
155061da546Spatrick reg_v7,
156061da546Spatrick reg_v8,
157061da546Spatrick reg_v9,
158061da546Spatrick reg_v10,
159061da546Spatrick reg_v11,
160061da546Spatrick reg_v12,
161061da546Spatrick reg_v13,
162061da546Spatrick reg_v14,
163061da546Spatrick reg_v15,
164061da546Spatrick reg_v16,
165061da546Spatrick reg_v17,
166061da546Spatrick reg_v18,
167061da546Spatrick reg_v19,
168061da546Spatrick reg_v20,
169061da546Spatrick reg_v21,
170061da546Spatrick reg_v22,
171061da546Spatrick reg_v23,
172061da546Spatrick reg_v24,
173061da546Spatrick reg_v25,
174061da546Spatrick reg_v26,
175061da546Spatrick reg_v27,
176061da546Spatrick reg_v28,
177061da546Spatrick reg_v29,
178061da546Spatrick reg_v30,
179061da546Spatrick reg_v31,
180061da546Spatrick reg_d0,
181061da546Spatrick reg_d1,
182061da546Spatrick reg_d2,
183061da546Spatrick reg_d3,
184061da546Spatrick reg_d4,
185061da546Spatrick reg_d5,
186061da546Spatrick reg_d6,
187061da546Spatrick reg_d7,
188061da546Spatrick reg_d8,
189061da546Spatrick reg_d9,
190061da546Spatrick reg_d10,
191061da546Spatrick reg_d11,
192061da546Spatrick reg_d12,
193061da546Spatrick reg_d13,
194061da546Spatrick reg_d14,
195061da546Spatrick reg_d15,
196061da546Spatrick reg_d16,
197061da546Spatrick reg_d17,
198061da546Spatrick reg_d18,
199061da546Spatrick reg_d19,
200061da546Spatrick reg_d20,
201061da546Spatrick reg_d21,
202061da546Spatrick reg_d22,
203061da546Spatrick reg_d23,
204061da546Spatrick reg_d24,
205061da546Spatrick reg_d25,
206061da546Spatrick reg_d26,
207061da546Spatrick reg_d27,
208061da546Spatrick reg_d28,
209061da546Spatrick reg_d29,
210061da546Spatrick reg_d30,
211061da546Spatrick reg_d31,
212061da546Spatrick reg_s0,
213061da546Spatrick reg_s1,
214061da546Spatrick reg_s2,
215061da546Spatrick reg_s3,
216061da546Spatrick reg_s4,
217061da546Spatrick reg_s5,
218061da546Spatrick reg_s6,
219061da546Spatrick reg_s7,
220061da546Spatrick reg_s8,
221061da546Spatrick reg_s9,
222061da546Spatrick reg_s10,
223061da546Spatrick reg_s11,
224061da546Spatrick reg_s12,
225061da546Spatrick reg_s13,
226061da546Spatrick reg_s14,
227061da546Spatrick reg_s15,
228061da546Spatrick reg_s16,
229061da546Spatrick reg_s17,
230061da546Spatrick reg_s18,
231061da546Spatrick reg_s19,
232061da546Spatrick reg_s20,
233061da546Spatrick reg_s21,
234061da546Spatrick reg_s22,
235061da546Spatrick reg_s23,
236061da546Spatrick reg_s24,
237061da546Spatrick reg_s25,
238061da546Spatrick reg_s26,
239061da546Spatrick reg_s27,
240061da546Spatrick reg_s28,
241061da546Spatrick reg_s29,
242061da546Spatrick reg_s30,
243061da546Spatrick reg_s31,
244061da546Spatrick reg_h0,
245061da546Spatrick reg_h1,
246061da546Spatrick reg_h2,
247061da546Spatrick reg_h3,
248061da546Spatrick reg_h4,
249061da546Spatrick reg_h5,
250061da546Spatrick reg_h6,
251061da546Spatrick reg_h7,
252061da546Spatrick reg_h8,
253061da546Spatrick reg_h9,
254061da546Spatrick reg_h10,
255061da546Spatrick reg_h11,
256061da546Spatrick reg_h12,
257061da546Spatrick reg_h13,
258061da546Spatrick reg_h14,
259061da546Spatrick reg_h15,
260061da546Spatrick reg_h16,
261061da546Spatrick reg_h17,
262061da546Spatrick reg_h18,
263061da546Spatrick reg_h19,
264061da546Spatrick reg_h20,
265061da546Spatrick reg_h21,
266061da546Spatrick reg_h22,
267061da546Spatrick reg_h23,
268061da546Spatrick reg_h24,
269061da546Spatrick reg_h25,
270061da546Spatrick reg_h26,
271061da546Spatrick reg_h27,
272061da546Spatrick reg_h28,
273061da546Spatrick reg_h29,
274061da546Spatrick reg_h30,
275061da546Spatrick reg_h31,
276061da546Spatrick k_num_regs
277061da546Spatrick };
278061da546Spatrick
279061da546Spatrick // Register info definitions for this register context
280061da546Spatrick static RegisterInfo g_reg_infos[] = {
281061da546Spatrick DEF_X_ARG(0, 1),
282061da546Spatrick DEF_X_ARG(1, 2),
283061da546Spatrick DEF_X_ARG(2, 3),
284061da546Spatrick DEF_X_ARG(3, 4),
285061da546Spatrick DEF_X_ARG(4, 5),
286061da546Spatrick DEF_X_ARG(5, 6),
287061da546Spatrick DEF_X_ARG(6, 7),
288061da546Spatrick DEF_X_ARG(7, 8),
289061da546Spatrick DEF_X(8),
290061da546Spatrick DEF_X(9),
291061da546Spatrick DEF_X(10),
292061da546Spatrick DEF_X(11),
293061da546Spatrick DEF_X(12),
294061da546Spatrick DEF_X(13),
295061da546Spatrick DEF_X(14),
296061da546Spatrick DEF_X(15),
297061da546Spatrick DEF_X(16),
298061da546Spatrick DEF_X(17),
299061da546Spatrick DEF_X(18),
300061da546Spatrick DEF_X(19),
301061da546Spatrick DEF_X(20),
302061da546Spatrick DEF_X(21),
303061da546Spatrick DEF_X(22),
304061da546Spatrick DEF_X(23),
305061da546Spatrick DEF_X(24),
306061da546Spatrick DEF_X(25),
307061da546Spatrick DEF_X(26),
308061da546Spatrick DEF_X(27),
309061da546Spatrick DEF_X(28),
310061da546Spatrick {"fp",
311061da546Spatrick "x29",
312061da546Spatrick 8,
313061da546Spatrick OFFSET(x) + 29 * 8,
314061da546Spatrick eEncodingUint,
315061da546Spatrick eFormatHex,
316061da546Spatrick {arm64_dwarf::x29, arm64_dwarf::x29, LLDB_REGNUM_GENERIC_FP, INV, reg_fp},
317061da546Spatrick nullptr,
318061da546Spatrick nullptr,
319*f6aab3d8Srobert },
320061da546Spatrick {"lr",
321061da546Spatrick "x30",
322061da546Spatrick 8,
323061da546Spatrick OFFSET(x) + 30 * 8,
324061da546Spatrick eEncodingUint,
325061da546Spatrick eFormatHex,
326061da546Spatrick {arm64_dwarf::x30, arm64_dwarf::x30, LLDB_REGNUM_GENERIC_RA, INV, reg_lr},
327061da546Spatrick nullptr,
328061da546Spatrick nullptr,
329*f6aab3d8Srobert },
330061da546Spatrick {"sp",
331061da546Spatrick "x31",
332061da546Spatrick 8,
333061da546Spatrick OFFSET(x) + 31 * 8,
334061da546Spatrick eEncodingUint,
335061da546Spatrick eFormatHex,
336061da546Spatrick {arm64_dwarf::x31, arm64_dwarf::x31, LLDB_REGNUM_GENERIC_SP, INV, reg_sp},
337061da546Spatrick nullptr,
338061da546Spatrick nullptr,
339*f6aab3d8Srobert },
340061da546Spatrick {"pc",
341061da546Spatrick nullptr,
342061da546Spatrick 8,
343061da546Spatrick OFFSET(pc),
344061da546Spatrick eEncodingUint,
345061da546Spatrick eFormatHex,
346061da546Spatrick {arm64_dwarf::pc, arm64_dwarf::pc, LLDB_REGNUM_GENERIC_PC, INV, reg_pc},
347061da546Spatrick nullptr,
348061da546Spatrick nullptr,
349*f6aab3d8Srobert },
350061da546Spatrick // w0 - w31
351061da546Spatrick DEF_W(0),
352061da546Spatrick DEF_W(1),
353061da546Spatrick DEF_W(2),
354061da546Spatrick DEF_W(3),
355061da546Spatrick DEF_W(4),
356061da546Spatrick DEF_W(5),
357061da546Spatrick DEF_W(6),
358061da546Spatrick DEF_W(7),
359061da546Spatrick DEF_W(8),
360061da546Spatrick DEF_W(9),
361061da546Spatrick DEF_W(10),
362061da546Spatrick DEF_W(11),
363061da546Spatrick DEF_W(12),
364061da546Spatrick DEF_W(13),
365061da546Spatrick DEF_W(14),
366061da546Spatrick DEF_W(15),
367061da546Spatrick DEF_W(16),
368061da546Spatrick DEF_W(17),
369061da546Spatrick DEF_W(18),
370061da546Spatrick DEF_W(19),
371061da546Spatrick DEF_W(20),
372061da546Spatrick DEF_W(21),
373061da546Spatrick DEF_W(22),
374061da546Spatrick DEF_W(23),
375061da546Spatrick DEF_W(24),
376061da546Spatrick DEF_W(25),
377061da546Spatrick DEF_W(26),
378061da546Spatrick DEF_W(27),
379061da546Spatrick DEF_W(28),
380061da546Spatrick DEF_W(29),
381061da546Spatrick DEF_W(30),
382061da546Spatrick DEF_W(31),
383061da546Spatrick {"cpsr",
384061da546Spatrick "psr",
385061da546Spatrick 4,
386061da546Spatrick OFFSET(cpsr),
387061da546Spatrick eEncodingUint,
388061da546Spatrick eFormatHex,
389061da546Spatrick {INV, arm64_dwarf::cpsr, LLDB_REGNUM_GENERIC_FLAGS, INV, reg_cpsr},
390061da546Spatrick nullptr,
391061da546Spatrick nullptr,
392*f6aab3d8Srobert },
393061da546Spatrick {"fpsr",
394061da546Spatrick nullptr,
395061da546Spatrick 4,
396061da546Spatrick OFFSET(fpsr),
397061da546Spatrick eEncodingUint,
398061da546Spatrick eFormatHex,
399061da546Spatrick {INV, INV, INV, INV, reg_fpsr},
400061da546Spatrick nullptr,
401061da546Spatrick nullptr,
402*f6aab3d8Srobert },
403061da546Spatrick {"fpcr",
404061da546Spatrick nullptr,
405061da546Spatrick 4,
406061da546Spatrick OFFSET(fpcr),
407061da546Spatrick eEncodingUint,
408061da546Spatrick eFormatHex,
409061da546Spatrick {INV, INV, INV, INV, reg_fpcr},
410061da546Spatrick nullptr,
411061da546Spatrick nullptr,
412*f6aab3d8Srobert },
413061da546Spatrick // v0 - v31
414061da546Spatrick DEF_V(0),
415061da546Spatrick DEF_V(1),
416061da546Spatrick DEF_V(2),
417061da546Spatrick DEF_V(3),
418061da546Spatrick DEF_V(4),
419061da546Spatrick DEF_V(5),
420061da546Spatrick DEF_V(6),
421061da546Spatrick DEF_V(7),
422061da546Spatrick DEF_V(8),
423061da546Spatrick DEF_V(9),
424061da546Spatrick DEF_V(10),
425061da546Spatrick DEF_V(11),
426061da546Spatrick DEF_V(12),
427061da546Spatrick DEF_V(13),
428061da546Spatrick DEF_V(14),
429061da546Spatrick DEF_V(15),
430061da546Spatrick DEF_V(16),
431061da546Spatrick DEF_V(17),
432061da546Spatrick DEF_V(18),
433061da546Spatrick DEF_V(19),
434061da546Spatrick DEF_V(20),
435061da546Spatrick DEF_V(21),
436061da546Spatrick DEF_V(22),
437061da546Spatrick DEF_V(23),
438061da546Spatrick DEF_V(24),
439061da546Spatrick DEF_V(25),
440061da546Spatrick DEF_V(26),
441061da546Spatrick DEF_V(27),
442061da546Spatrick DEF_V(28),
443061da546Spatrick DEF_V(29),
444061da546Spatrick DEF_V(30),
445061da546Spatrick DEF_V(31),
446061da546Spatrick // d0 - d31
447061da546Spatrick DEF_D(0),
448061da546Spatrick DEF_D(1),
449061da546Spatrick DEF_D(2),
450061da546Spatrick DEF_D(3),
451061da546Spatrick DEF_D(4),
452061da546Spatrick DEF_D(5),
453061da546Spatrick DEF_D(6),
454061da546Spatrick DEF_D(7),
455061da546Spatrick DEF_D(8),
456061da546Spatrick DEF_D(9),
457061da546Spatrick DEF_D(10),
458061da546Spatrick DEF_D(11),
459061da546Spatrick DEF_D(12),
460061da546Spatrick DEF_D(13),
461061da546Spatrick DEF_D(14),
462061da546Spatrick DEF_D(15),
463061da546Spatrick DEF_D(16),
464061da546Spatrick DEF_D(17),
465061da546Spatrick DEF_D(18),
466061da546Spatrick DEF_D(19),
467061da546Spatrick DEF_D(20),
468061da546Spatrick DEF_D(21),
469061da546Spatrick DEF_D(22),
470061da546Spatrick DEF_D(23),
471061da546Spatrick DEF_D(24),
472061da546Spatrick DEF_D(25),
473061da546Spatrick DEF_D(26),
474061da546Spatrick DEF_D(27),
475061da546Spatrick DEF_D(28),
476061da546Spatrick DEF_D(29),
477061da546Spatrick DEF_D(30),
478061da546Spatrick DEF_D(31),
479061da546Spatrick // s0 - s31
480061da546Spatrick DEF_S(0),
481061da546Spatrick DEF_S(1),
482061da546Spatrick DEF_S(2),
483061da546Spatrick DEF_S(3),
484061da546Spatrick DEF_S(4),
485061da546Spatrick DEF_S(5),
486061da546Spatrick DEF_S(6),
487061da546Spatrick DEF_S(7),
488061da546Spatrick DEF_S(8),
489061da546Spatrick DEF_S(9),
490061da546Spatrick DEF_S(10),
491061da546Spatrick DEF_S(11),
492061da546Spatrick DEF_S(12),
493061da546Spatrick DEF_S(13),
494061da546Spatrick DEF_S(14),
495061da546Spatrick DEF_S(15),
496061da546Spatrick DEF_S(16),
497061da546Spatrick DEF_S(17),
498061da546Spatrick DEF_S(18),
499061da546Spatrick DEF_S(19),
500061da546Spatrick DEF_S(20),
501061da546Spatrick DEF_S(21),
502061da546Spatrick DEF_S(22),
503061da546Spatrick DEF_S(23),
504061da546Spatrick DEF_S(24),
505061da546Spatrick DEF_S(25),
506061da546Spatrick DEF_S(26),
507061da546Spatrick DEF_S(27),
508061da546Spatrick DEF_S(28),
509061da546Spatrick DEF_S(29),
510061da546Spatrick DEF_S(30),
511061da546Spatrick DEF_S(31),
512061da546Spatrick // h0 - h31
513061da546Spatrick DEF_H(0),
514061da546Spatrick DEF_H(1),
515061da546Spatrick DEF_H(2),
516061da546Spatrick DEF_H(3),
517061da546Spatrick DEF_H(4),
518061da546Spatrick DEF_H(5),
519061da546Spatrick DEF_H(6),
520061da546Spatrick DEF_H(7),
521061da546Spatrick DEF_H(8),
522061da546Spatrick DEF_H(9),
523061da546Spatrick DEF_H(10),
524061da546Spatrick DEF_H(11),
525061da546Spatrick DEF_H(12),
526061da546Spatrick DEF_H(13),
527061da546Spatrick DEF_H(14),
528061da546Spatrick DEF_H(15),
529061da546Spatrick DEF_H(16),
530061da546Spatrick DEF_H(17),
531061da546Spatrick DEF_H(18),
532061da546Spatrick DEF_H(19),
533061da546Spatrick DEF_H(20),
534061da546Spatrick DEF_H(21),
535061da546Spatrick DEF_H(22),
536061da546Spatrick DEF_H(23),
537061da546Spatrick DEF_H(24),
538061da546Spatrick DEF_H(25),
539061da546Spatrick DEF_H(26),
540061da546Spatrick DEF_H(27),
541061da546Spatrick DEF_H(28),
542061da546Spatrick DEF_H(29),
543061da546Spatrick DEF_H(30),
544061da546Spatrick DEF_H(31),
545061da546Spatrick };
546061da546Spatrick
547*f6aab3d8Srobert constexpr size_t k_num_reg_infos = std::size(g_reg_infos);
548061da546Spatrick
549061da546Spatrick // ARM64 general purpose registers.
550061da546Spatrick const uint32_t g_gpr_regnums[] = {
551061da546Spatrick reg_x0,
552061da546Spatrick reg_x1,
553061da546Spatrick reg_x2,
554061da546Spatrick reg_x3,
555061da546Spatrick reg_x4,
556061da546Spatrick reg_x5,
557061da546Spatrick reg_x6,
558061da546Spatrick reg_x7,
559061da546Spatrick reg_x8,
560061da546Spatrick reg_x9,
561061da546Spatrick reg_x10,
562061da546Spatrick reg_x11,
563061da546Spatrick reg_x12,
564061da546Spatrick reg_x13,
565061da546Spatrick reg_x14,
566061da546Spatrick reg_x15,
567061da546Spatrick reg_x16,
568061da546Spatrick reg_x17,
569061da546Spatrick reg_x18,
570061da546Spatrick reg_x19,
571061da546Spatrick reg_x20,
572061da546Spatrick reg_x21,
573061da546Spatrick reg_x22,
574061da546Spatrick reg_x23,
575061da546Spatrick reg_x24,
576061da546Spatrick reg_x25,
577061da546Spatrick reg_x26,
578061da546Spatrick reg_x27,
579061da546Spatrick reg_x28,
580061da546Spatrick reg_fp,
581061da546Spatrick reg_lr,
582061da546Spatrick reg_sp,
583061da546Spatrick reg_w0,
584061da546Spatrick reg_w1,
585061da546Spatrick reg_w2,
586061da546Spatrick reg_w3,
587061da546Spatrick reg_w4,
588061da546Spatrick reg_w5,
589061da546Spatrick reg_w6,
590061da546Spatrick reg_w7,
591061da546Spatrick reg_w8,
592061da546Spatrick reg_w9,
593061da546Spatrick reg_w10,
594061da546Spatrick reg_w11,
595061da546Spatrick reg_w12,
596061da546Spatrick reg_w13,
597061da546Spatrick reg_w14,
598061da546Spatrick reg_w15,
599061da546Spatrick reg_w16,
600061da546Spatrick reg_w17,
601061da546Spatrick reg_w18,
602061da546Spatrick reg_w19,
603061da546Spatrick reg_w20,
604061da546Spatrick reg_w21,
605061da546Spatrick reg_w22,
606061da546Spatrick reg_w23,
607061da546Spatrick reg_w24,
608061da546Spatrick reg_w25,
609061da546Spatrick reg_w26,
610061da546Spatrick reg_w27,
611061da546Spatrick reg_w28,
612061da546Spatrick reg_w29,
613061da546Spatrick reg_w30,
614061da546Spatrick reg_w31,
615061da546Spatrick reg_pc,
616061da546Spatrick reg_cpsr,
617061da546Spatrick LLDB_INVALID_REGNUM // register sets need to end with this flag
618061da546Spatrick };
619061da546Spatrick const uint32_t g_fpu_regnums[] = {
620061da546Spatrick reg_v0,
621061da546Spatrick reg_v1,
622061da546Spatrick reg_v2,
623061da546Spatrick reg_v3,
624061da546Spatrick reg_v4,
625061da546Spatrick reg_v5,
626061da546Spatrick reg_v6,
627061da546Spatrick reg_v7,
628061da546Spatrick reg_v8,
629061da546Spatrick reg_v9,
630061da546Spatrick reg_v10,
631061da546Spatrick reg_v11,
632061da546Spatrick reg_v12,
633061da546Spatrick reg_v13,
634061da546Spatrick reg_v14,
635061da546Spatrick reg_v15,
636061da546Spatrick reg_v16,
637061da546Spatrick reg_v17,
638061da546Spatrick reg_v18,
639061da546Spatrick reg_v19,
640061da546Spatrick reg_v20,
641061da546Spatrick reg_v21,
642061da546Spatrick reg_v22,
643061da546Spatrick reg_v23,
644061da546Spatrick reg_v24,
645061da546Spatrick reg_v25,
646061da546Spatrick reg_v26,
647061da546Spatrick reg_v27,
648061da546Spatrick reg_v28,
649061da546Spatrick reg_v29,
650061da546Spatrick reg_v30,
651061da546Spatrick reg_v31,
652061da546Spatrick reg_d0,
653061da546Spatrick reg_d1,
654061da546Spatrick reg_d2,
655061da546Spatrick reg_d3,
656061da546Spatrick reg_d4,
657061da546Spatrick reg_d5,
658061da546Spatrick reg_d6,
659061da546Spatrick reg_d7,
660061da546Spatrick reg_d8,
661061da546Spatrick reg_d9,
662061da546Spatrick reg_d10,
663061da546Spatrick reg_d11,
664061da546Spatrick reg_d12,
665061da546Spatrick reg_d13,
666061da546Spatrick reg_d14,
667061da546Spatrick reg_d15,
668061da546Spatrick reg_d16,
669061da546Spatrick reg_d17,
670061da546Spatrick reg_d18,
671061da546Spatrick reg_d19,
672061da546Spatrick reg_d20,
673061da546Spatrick reg_d21,
674061da546Spatrick reg_d22,
675061da546Spatrick reg_d23,
676061da546Spatrick reg_d24,
677061da546Spatrick reg_d25,
678061da546Spatrick reg_d26,
679061da546Spatrick reg_d27,
680061da546Spatrick reg_d28,
681061da546Spatrick reg_d29,
682061da546Spatrick reg_d30,
683061da546Spatrick reg_d31,
684061da546Spatrick reg_s0,
685061da546Spatrick reg_s1,
686061da546Spatrick reg_s2,
687061da546Spatrick reg_s3,
688061da546Spatrick reg_s4,
689061da546Spatrick reg_s5,
690061da546Spatrick reg_s6,
691061da546Spatrick reg_s7,
692061da546Spatrick reg_s8,
693061da546Spatrick reg_s9,
694061da546Spatrick reg_s10,
695061da546Spatrick reg_s11,
696061da546Spatrick reg_s12,
697061da546Spatrick reg_s13,
698061da546Spatrick reg_s14,
699061da546Spatrick reg_s15,
700061da546Spatrick reg_s16,
701061da546Spatrick reg_s17,
702061da546Spatrick reg_s18,
703061da546Spatrick reg_s19,
704061da546Spatrick reg_s20,
705061da546Spatrick reg_s21,
706061da546Spatrick reg_s22,
707061da546Spatrick reg_s23,
708061da546Spatrick reg_s24,
709061da546Spatrick reg_s25,
710061da546Spatrick reg_s26,
711061da546Spatrick reg_s27,
712061da546Spatrick reg_s28,
713061da546Spatrick reg_s29,
714061da546Spatrick reg_s30,
715061da546Spatrick reg_s31,
716061da546Spatrick reg_h0,
717061da546Spatrick reg_h1,
718061da546Spatrick reg_h2,
719061da546Spatrick reg_h3,
720061da546Spatrick reg_h4,
721061da546Spatrick reg_h5,
722061da546Spatrick reg_h6,
723061da546Spatrick reg_h7,
724061da546Spatrick reg_h8,
725061da546Spatrick reg_h9,
726061da546Spatrick reg_h10,
727061da546Spatrick reg_h11,
728061da546Spatrick reg_h12,
729061da546Spatrick reg_h13,
730061da546Spatrick reg_h14,
731061da546Spatrick reg_h15,
732061da546Spatrick reg_h16,
733061da546Spatrick reg_h17,
734061da546Spatrick reg_h18,
735061da546Spatrick reg_h19,
736061da546Spatrick reg_h20,
737061da546Spatrick reg_h21,
738061da546Spatrick reg_h22,
739061da546Spatrick reg_h23,
740061da546Spatrick reg_h24,
741061da546Spatrick reg_h25,
742061da546Spatrick reg_h26,
743061da546Spatrick reg_h27,
744061da546Spatrick reg_h28,
745061da546Spatrick reg_h29,
746061da546Spatrick reg_h30,
747061da546Spatrick reg_h31,
748061da546Spatrick reg_fpsr,
749061da546Spatrick reg_fpcr,
750061da546Spatrick LLDB_INVALID_REGNUM // register sets need to end with this flag
751061da546Spatrick };
752061da546Spatrick
753061da546Spatrick // Skip the last LLDB_INVALID_REGNUM in each count below by subtracting 1
754*f6aab3d8Srobert constexpr size_t k_num_gpr_regs = std::size(g_gpr_regnums) - 1;
755*f6aab3d8Srobert constexpr size_t k_num_fpu_regs = std::size(g_fpu_regnums) - 1;
756061da546Spatrick
757061da546Spatrick static RegisterSet g_reg_sets[] = {
758061da546Spatrick {"General Purpose Registers", "gpr", k_num_gpr_regs, g_gpr_regnums},
759061da546Spatrick {"Floating Point Registers", "fpu", k_num_fpu_regs, g_fpu_regnums},
760061da546Spatrick };
761061da546Spatrick
762*f6aab3d8Srobert constexpr size_t k_num_reg_sets = std::size(g_reg_sets);
763061da546Spatrick
RegisterContextMinidump_ARM64(lldb_private::Thread & thread,const DataExtractor & data)764061da546Spatrick RegisterContextMinidump_ARM64::RegisterContextMinidump_ARM64(
765061da546Spatrick lldb_private::Thread &thread, const DataExtractor &data)
766061da546Spatrick : RegisterContext(thread, 0) {
767061da546Spatrick lldb::offset_t offset = 0;
768061da546Spatrick m_regs.context_flags = data.GetU64(&offset);
769061da546Spatrick for (unsigned i = 0; i < 32; ++i)
770061da546Spatrick m_regs.x[i] = data.GetU64(&offset);
771061da546Spatrick m_regs.pc = data.GetU64(&offset);
772061da546Spatrick m_regs.cpsr = data.GetU32(&offset);
773061da546Spatrick m_regs.fpsr = data.GetU32(&offset);
774061da546Spatrick m_regs.fpcr = data.GetU32(&offset);
775061da546Spatrick auto regs_data = data.GetData(&offset, sizeof(m_regs.v));
776061da546Spatrick if (regs_data)
777061da546Spatrick memcpy(m_regs.v, regs_data, sizeof(m_regs.v));
778*f6aab3d8Srobert static_assert(k_num_regs == k_num_reg_infos);
779061da546Spatrick }
GetRegisterCount()780061da546Spatrick size_t RegisterContextMinidump_ARM64::GetRegisterCount() { return k_num_regs; }
781061da546Spatrick
782061da546Spatrick const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)783061da546Spatrick RegisterContextMinidump_ARM64::GetRegisterInfoAtIndex(size_t reg) {
784061da546Spatrick if (reg < k_num_reg_infos)
785061da546Spatrick return &g_reg_infos[reg];
786061da546Spatrick return nullptr;
787061da546Spatrick }
788061da546Spatrick
GetRegisterSetCount()789061da546Spatrick size_t RegisterContextMinidump_ARM64::GetRegisterSetCount() {
790061da546Spatrick return k_num_reg_sets;
791061da546Spatrick }
792061da546Spatrick
GetRegisterSet(size_t set)793061da546Spatrick const RegisterSet *RegisterContextMinidump_ARM64::GetRegisterSet(size_t set) {
794061da546Spatrick if (set < k_num_reg_sets)
795061da546Spatrick return &g_reg_sets[set];
796061da546Spatrick return nullptr;
797061da546Spatrick }
798061da546Spatrick
GetRegisterName(unsigned reg)799061da546Spatrick const char *RegisterContextMinidump_ARM64::GetRegisterName(unsigned reg) {
800061da546Spatrick if (reg < k_num_reg_infos)
801061da546Spatrick return g_reg_infos[reg].name;
802061da546Spatrick return nullptr;
803061da546Spatrick }
804061da546Spatrick
ReadRegister(const RegisterInfo * reg_info,RegisterValue & reg_value)805061da546Spatrick bool RegisterContextMinidump_ARM64::ReadRegister(const RegisterInfo *reg_info,
806061da546Spatrick RegisterValue ®_value) {
807061da546Spatrick Status error;
808061da546Spatrick reg_value.SetFromMemoryData(
809*f6aab3d8Srobert *reg_info, (const uint8_t *)&m_regs + reg_info->byte_offset,
810061da546Spatrick reg_info->byte_size, lldb::eByteOrderLittle, error);
811061da546Spatrick return error.Success();
812061da546Spatrick }
813061da546Spatrick
WriteRegister(const RegisterInfo *,const RegisterValue &)814061da546Spatrick bool RegisterContextMinidump_ARM64::WriteRegister(const RegisterInfo *,
815061da546Spatrick const RegisterValue &) {
816061da546Spatrick return false;
817061da546Spatrick }
818061da546Spatrick
ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,uint32_t num)819061da546Spatrick uint32_t RegisterContextMinidump_ARM64::ConvertRegisterKindToRegisterNumber(
820061da546Spatrick lldb::RegisterKind kind, uint32_t num) {
821061da546Spatrick for (size_t i = 0; i < k_num_regs; ++i) {
822061da546Spatrick if (g_reg_infos[i].kinds[kind] == num)
823061da546Spatrick return i;
824061da546Spatrick }
825061da546Spatrick return LLDB_INVALID_REGNUM;
826061da546Spatrick }
827