xref: /llvm-project/lldb/source/Plugins/Process/Windows/Common/arm64/RegisterContextWindows_arm64.cpp (revision 57c8fee1b97eb7e70513b935b765f8381a941b18)
180814287SRaphael Isemann //===-- RegisterContextWindows_arm64.cpp ----------------------------------===//
2b1f6ba2aSMartin Storsjo //
3b1f6ba2aSMartin Storsjo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b1f6ba2aSMartin Storsjo // See https://llvm.org/LICENSE.txt for license information.
5b1f6ba2aSMartin Storsjo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b1f6ba2aSMartin Storsjo //
7b1f6ba2aSMartin Storsjo //===----------------------------------------------------------------------===//
8b1f6ba2aSMartin Storsjo 
9b1f6ba2aSMartin Storsjo #if defined(__aarch64__) || defined(_M_ARM64)
10b1f6ba2aSMartin Storsjo 
11b1f6ba2aSMartin Storsjo #include "lldb/Host/windows/HostThreadWindows.h"
12b1f6ba2aSMartin Storsjo #include "lldb/Host/windows/windows.h"
13b1f6ba2aSMartin Storsjo #include "lldb/Utility/RegisterValue.h"
14b1f6ba2aSMartin Storsjo #include "lldb/Utility/Status.h"
15b1f6ba2aSMartin Storsjo #include "lldb/lldb-private-types.h"
16b1f6ba2aSMartin Storsjo 
17b1f6ba2aSMartin Storsjo #include "RegisterContextWindows_arm64.h"
18b1f6ba2aSMartin Storsjo #include "TargetThreadWindows.h"
19b1f6ba2aSMartin Storsjo 
20b1f6ba2aSMartin Storsjo #include "llvm/ADT/STLExtras.h"
21b1f6ba2aSMartin Storsjo 
22b1f6ba2aSMartin Storsjo using namespace lldb;
23b1f6ba2aSMartin Storsjo using namespace lldb_private;
24b1f6ba2aSMartin Storsjo 
25b1f6ba2aSMartin Storsjo #define GPR_OFFSET(idx) 0
26b1f6ba2aSMartin Storsjo #define GPR_OFFSET_NAME(reg) 0
27b1f6ba2aSMartin Storsjo 
28b1f6ba2aSMartin Storsjo #define FPU_OFFSET(idx) 0
29b1f6ba2aSMartin Storsjo #define FPU_OFFSET_NAME(reg) 0
30b1f6ba2aSMartin Storsjo 
31b1f6ba2aSMartin Storsjo #define EXC_OFFSET_NAME(reg) 0
32b1f6ba2aSMartin Storsjo #define DBG_OFFSET_NAME(reg) 0
33b1f6ba2aSMartin Storsjo 
34b1f6ba2aSMartin Storsjo #define DEFINE_DBG(reg, i)                                                     \
35b1f6ba2aSMartin Storsjo   #reg, NULL,                                                                  \
36b1f6ba2aSMartin Storsjo       0, DBG_OFFSET_NAME(reg[i]), eEncodingUint, eFormatHex,                   \
37b1f6ba2aSMartin Storsjo                               {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
38b1f6ba2aSMartin Storsjo                                LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
39b1f6ba2aSMartin Storsjo                                LLDB_INVALID_REGNUM },                          \
40*57c8fee1SDavid Spickett                                NULL, NULL, NULL
41b1f6ba2aSMartin Storsjo 
42b1f6ba2aSMartin Storsjo // Include RegisterInfos_arm64 to declare our g_register_infos_arm64 structure.
43b1f6ba2aSMartin Storsjo #define DECLARE_REGISTER_INFOS_ARM64_STRUCT
44b1f6ba2aSMartin Storsjo #include "Plugins/Process/Utility/RegisterInfos_arm64.h"
45b1f6ba2aSMartin Storsjo #undef DECLARE_REGISTER_INFOS_ARM64_STRUCT
46b1f6ba2aSMartin Storsjo 
4747b76631SJoe Loser static size_t k_num_register_infos = std::size(g_register_infos_arm64_le);
48b1f6ba2aSMartin Storsjo 
49b1f6ba2aSMartin Storsjo // Array of lldb register numbers used to define the set of all General Purpose
50b1f6ba2aSMartin Storsjo // Registers
51b1f6ba2aSMartin Storsjo uint32_t g_gpr_reg_indices[] = {
52b1f6ba2aSMartin Storsjo     gpr_x0,  gpr_x1,   gpr_x2,  gpr_x3,  gpr_x4,  gpr_x5,  gpr_x6,  gpr_x7,
53b1f6ba2aSMartin Storsjo     gpr_x8,  gpr_x9,   gpr_x10, gpr_x11, gpr_x12, gpr_x13, gpr_x14, gpr_x15,
54b1f6ba2aSMartin Storsjo     gpr_x16, gpr_x17,  gpr_x18, gpr_x19, gpr_x20, gpr_x21, gpr_x22, gpr_x23,
55b1f6ba2aSMartin Storsjo     gpr_x24, gpr_x25,  gpr_x26, gpr_x27, gpr_x28, gpr_fp,  gpr_lr,  gpr_sp,
56b1f6ba2aSMartin Storsjo     gpr_pc,  gpr_cpsr,
57b1f6ba2aSMartin Storsjo 
58b1f6ba2aSMartin Storsjo     gpr_w0,  gpr_w1,   gpr_w2,  gpr_w3,  gpr_w4,  gpr_w5,  gpr_w6,  gpr_w7,
59b1f6ba2aSMartin Storsjo     gpr_w8,  gpr_w9,   gpr_w10, gpr_w11, gpr_w12, gpr_w13, gpr_w14, gpr_w15,
60b1f6ba2aSMartin Storsjo     gpr_w16, gpr_w17,  gpr_w18, gpr_w19, gpr_w20, gpr_w21, gpr_w22, gpr_w23,
61b1f6ba2aSMartin Storsjo     gpr_w24, gpr_w25,  gpr_w26, gpr_w27, gpr_w28,
62b1f6ba2aSMartin Storsjo };
63b1f6ba2aSMartin Storsjo 
64b1f6ba2aSMartin Storsjo uint32_t g_fpu_reg_indices[] = {
65b1f6ba2aSMartin Storsjo     fpu_v0,   fpu_v1,   fpu_v2,  fpu_v3,  fpu_v4,  fpu_v5,  fpu_v6,  fpu_v7,
66b1f6ba2aSMartin Storsjo     fpu_v8,   fpu_v9,   fpu_v10, fpu_v11, fpu_v12, fpu_v13, fpu_v14, fpu_v15,
67b1f6ba2aSMartin Storsjo     fpu_v16,  fpu_v17,  fpu_v18, fpu_v19, fpu_v20, fpu_v21, fpu_v22, fpu_v23,
68b1f6ba2aSMartin Storsjo     fpu_v24,  fpu_v25,  fpu_v26, fpu_v27, fpu_v28, fpu_v29, fpu_v30, fpu_v31,
69b1f6ba2aSMartin Storsjo 
70b1f6ba2aSMartin Storsjo     fpu_s0,   fpu_s1,   fpu_s2,  fpu_s3,  fpu_s4,  fpu_s5,  fpu_s6,  fpu_s7,
71b1f6ba2aSMartin Storsjo     fpu_s8,   fpu_s9,   fpu_s10, fpu_s11, fpu_s12, fpu_s13, fpu_s14, fpu_s15,
72b1f6ba2aSMartin Storsjo     fpu_s16,  fpu_s17,  fpu_s18, fpu_s19, fpu_s20, fpu_s21, fpu_s22, fpu_s23,
73b1f6ba2aSMartin Storsjo     fpu_s24,  fpu_s25,  fpu_s26, fpu_s27, fpu_s28, fpu_s29, fpu_s30, fpu_s31,
74b1f6ba2aSMartin Storsjo 
75b1f6ba2aSMartin Storsjo     fpu_d0,   fpu_d1,   fpu_d2,  fpu_d3,  fpu_d4,  fpu_d5,  fpu_d6,  fpu_d7,
76b1f6ba2aSMartin Storsjo     fpu_d8,   fpu_d9,   fpu_d10, fpu_d11, fpu_d12, fpu_d13, fpu_d14, fpu_d15,
77b1f6ba2aSMartin Storsjo     fpu_d16,  fpu_d17,  fpu_d18, fpu_d19, fpu_d20, fpu_d21, fpu_d22, fpu_d23,
78b1f6ba2aSMartin Storsjo     fpu_d24,  fpu_d25,  fpu_d26, fpu_d27, fpu_d28, fpu_d29, fpu_d30, fpu_d31,
79b1f6ba2aSMartin Storsjo 
80b1f6ba2aSMartin Storsjo     fpu_fpsr, fpu_fpcr,
81b1f6ba2aSMartin Storsjo };
82b1f6ba2aSMartin Storsjo 
83b1f6ba2aSMartin Storsjo RegisterSet g_register_sets[] = {
8447b76631SJoe Loser     {"General Purpose Registers", "gpr", std::size(g_gpr_reg_indices),
8547b76631SJoe Loser      g_gpr_reg_indices},
8647b76631SJoe Loser     {"Floating Point Registers", "fpu", std::size(g_fpu_reg_indices),
87b1f6ba2aSMartin Storsjo      g_fpu_reg_indices},
88b1f6ba2aSMartin Storsjo };
89b1f6ba2aSMartin Storsjo 
90b1f6ba2aSMartin Storsjo // Constructors and Destructors
RegisterContextWindows_arm64(Thread & thread,uint32_t concrete_frame_idx)91b1f6ba2aSMartin Storsjo RegisterContextWindows_arm64::RegisterContextWindows_arm64(
92b1f6ba2aSMartin Storsjo     Thread &thread, uint32_t concrete_frame_idx)
93b1f6ba2aSMartin Storsjo     : RegisterContextWindows(thread, concrete_frame_idx) {}
94b1f6ba2aSMartin Storsjo 
~RegisterContextWindows_arm64()95b1f6ba2aSMartin Storsjo RegisterContextWindows_arm64::~RegisterContextWindows_arm64() {}
96b1f6ba2aSMartin Storsjo 
GetRegisterCount()97b1f6ba2aSMartin Storsjo size_t RegisterContextWindows_arm64::GetRegisterCount() {
9847b76631SJoe Loser   return std::size(g_register_infos_arm64_le);
99b1f6ba2aSMartin Storsjo }
100b1f6ba2aSMartin Storsjo 
101b1f6ba2aSMartin Storsjo const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)102b1f6ba2aSMartin Storsjo RegisterContextWindows_arm64::GetRegisterInfoAtIndex(size_t reg) {
103b1f6ba2aSMartin Storsjo   if (reg < k_num_register_infos)
104b1f6ba2aSMartin Storsjo     return &g_register_infos_arm64_le[reg];
105b1f6ba2aSMartin Storsjo   return NULL;
106b1f6ba2aSMartin Storsjo }
107b1f6ba2aSMartin Storsjo 
GetRegisterSetCount()108b1f6ba2aSMartin Storsjo size_t RegisterContextWindows_arm64::GetRegisterSetCount() {
10947b76631SJoe Loser   return std::size(g_register_sets);
110b1f6ba2aSMartin Storsjo }
111b1f6ba2aSMartin Storsjo 
112b1f6ba2aSMartin Storsjo const RegisterSet *
GetRegisterSet(size_t reg_set)113b1f6ba2aSMartin Storsjo RegisterContextWindows_arm64::GetRegisterSet(size_t reg_set) {
114b1f6ba2aSMartin Storsjo   return &g_register_sets[reg_set];
115b1f6ba2aSMartin Storsjo }
116b1f6ba2aSMartin Storsjo 
ReadRegister(const RegisterInfo * reg_info,RegisterValue & reg_value)117b1f6ba2aSMartin Storsjo bool RegisterContextWindows_arm64::ReadRegister(const RegisterInfo *reg_info,
118b1f6ba2aSMartin Storsjo                                                 RegisterValue &reg_value) {
119b1f6ba2aSMartin Storsjo   if (!CacheAllRegisterValues())
120b1f6ba2aSMartin Storsjo     return false;
121b1f6ba2aSMartin Storsjo 
122b1f6ba2aSMartin Storsjo   if (reg_info == nullptr)
123b1f6ba2aSMartin Storsjo     return false;
124b1f6ba2aSMartin Storsjo 
125b1f6ba2aSMartin Storsjo   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
126b1f6ba2aSMartin Storsjo 
127b1f6ba2aSMartin Storsjo   switch (reg) {
128b1f6ba2aSMartin Storsjo   case gpr_x0:
129b1f6ba2aSMartin Storsjo   case gpr_x1:
130b1f6ba2aSMartin Storsjo   case gpr_x2:
131b1f6ba2aSMartin Storsjo   case gpr_x3:
132b1f6ba2aSMartin Storsjo   case gpr_x4:
133b1f6ba2aSMartin Storsjo   case gpr_x5:
134b1f6ba2aSMartin Storsjo   case gpr_x6:
135b1f6ba2aSMartin Storsjo   case gpr_x7:
136b1f6ba2aSMartin Storsjo   case gpr_x8:
137b1f6ba2aSMartin Storsjo   case gpr_x9:
138b1f6ba2aSMartin Storsjo   case gpr_x10:
139b1f6ba2aSMartin Storsjo   case gpr_x11:
140b1f6ba2aSMartin Storsjo   case gpr_x12:
141b1f6ba2aSMartin Storsjo   case gpr_x13:
142b1f6ba2aSMartin Storsjo   case gpr_x14:
143b1f6ba2aSMartin Storsjo   case gpr_x15:
144b1f6ba2aSMartin Storsjo   case gpr_x16:
145b1f6ba2aSMartin Storsjo   case gpr_x17:
146b1f6ba2aSMartin Storsjo   case gpr_x18:
147b1f6ba2aSMartin Storsjo   case gpr_x19:
148b1f6ba2aSMartin Storsjo   case gpr_x20:
149b1f6ba2aSMartin Storsjo   case gpr_x21:
150b1f6ba2aSMartin Storsjo   case gpr_x22:
151b1f6ba2aSMartin Storsjo   case gpr_x23:
152b1f6ba2aSMartin Storsjo   case gpr_x24:
153b1f6ba2aSMartin Storsjo   case gpr_x25:
154b1f6ba2aSMartin Storsjo   case gpr_x26:
155b1f6ba2aSMartin Storsjo   case gpr_x27:
156b1f6ba2aSMartin Storsjo   case gpr_x28:
157b1f6ba2aSMartin Storsjo     reg_value.SetUInt64(m_context.X[reg - gpr_x0]);
158b1f6ba2aSMartin Storsjo     break;
159b1f6ba2aSMartin Storsjo 
160b1f6ba2aSMartin Storsjo   case gpr_fp:
161b1f6ba2aSMartin Storsjo     reg_value.SetUInt64(m_context.Fp);
162b1f6ba2aSMartin Storsjo     break;
163b1f6ba2aSMartin Storsjo   case gpr_sp:
164b1f6ba2aSMartin Storsjo     reg_value.SetUInt64(m_context.Sp);
165b1f6ba2aSMartin Storsjo     break;
166b1f6ba2aSMartin Storsjo   case gpr_lr:
167b1f6ba2aSMartin Storsjo     reg_value.SetUInt64(m_context.Lr);
168b1f6ba2aSMartin Storsjo     break;
169b1f6ba2aSMartin Storsjo   case gpr_pc:
170b1f6ba2aSMartin Storsjo     reg_value.SetUInt64(m_context.Pc);
171b1f6ba2aSMartin Storsjo     break;
172b1f6ba2aSMartin Storsjo   case gpr_cpsr:
173b595137fSMuhammad Omair Javaid     reg_value.SetUInt32(m_context.Cpsr);
174b1f6ba2aSMartin Storsjo     break;
175b1f6ba2aSMartin Storsjo 
176b1f6ba2aSMartin Storsjo   case gpr_w0:
177b1f6ba2aSMartin Storsjo   case gpr_w1:
178b1f6ba2aSMartin Storsjo   case gpr_w2:
179b1f6ba2aSMartin Storsjo   case gpr_w3:
180b1f6ba2aSMartin Storsjo   case gpr_w4:
181b1f6ba2aSMartin Storsjo   case gpr_w5:
182b1f6ba2aSMartin Storsjo   case gpr_w6:
183b1f6ba2aSMartin Storsjo   case gpr_w7:
184b1f6ba2aSMartin Storsjo   case gpr_w8:
185b1f6ba2aSMartin Storsjo   case gpr_w9:
186b1f6ba2aSMartin Storsjo   case gpr_w10:
187b1f6ba2aSMartin Storsjo   case gpr_w11:
188b1f6ba2aSMartin Storsjo   case gpr_w12:
189b1f6ba2aSMartin Storsjo   case gpr_w13:
190b1f6ba2aSMartin Storsjo   case gpr_w14:
191b1f6ba2aSMartin Storsjo   case gpr_w15:
192b1f6ba2aSMartin Storsjo   case gpr_w16:
193b1f6ba2aSMartin Storsjo   case gpr_w17:
194b1f6ba2aSMartin Storsjo   case gpr_w18:
195b1f6ba2aSMartin Storsjo   case gpr_w19:
196b1f6ba2aSMartin Storsjo   case gpr_w20:
197b1f6ba2aSMartin Storsjo   case gpr_w21:
198b1f6ba2aSMartin Storsjo   case gpr_w22:
199b1f6ba2aSMartin Storsjo   case gpr_w23:
200b1f6ba2aSMartin Storsjo   case gpr_w24:
201b1f6ba2aSMartin Storsjo   case gpr_w25:
202b1f6ba2aSMartin Storsjo   case gpr_w26:
203b1f6ba2aSMartin Storsjo   case gpr_w27:
204b1f6ba2aSMartin Storsjo   case gpr_w28:
205b1f6ba2aSMartin Storsjo     reg_value.SetUInt32(
206b1f6ba2aSMartin Storsjo         static_cast<uint32_t>(m_context.X[reg - gpr_w0] & 0xffffffff));
207b1f6ba2aSMartin Storsjo     break;
208b1f6ba2aSMartin Storsjo 
209b1f6ba2aSMartin Storsjo   case fpu_v0:
210b1f6ba2aSMartin Storsjo   case fpu_v1:
211b1f6ba2aSMartin Storsjo   case fpu_v2:
212b1f6ba2aSMartin Storsjo   case fpu_v3:
213b1f6ba2aSMartin Storsjo   case fpu_v4:
214b1f6ba2aSMartin Storsjo   case fpu_v5:
215b1f6ba2aSMartin Storsjo   case fpu_v6:
216b1f6ba2aSMartin Storsjo   case fpu_v7:
217b1f6ba2aSMartin Storsjo   case fpu_v8:
218b1f6ba2aSMartin Storsjo   case fpu_v9:
219b1f6ba2aSMartin Storsjo   case fpu_v10:
220b1f6ba2aSMartin Storsjo   case fpu_v11:
221b1f6ba2aSMartin Storsjo   case fpu_v12:
222b1f6ba2aSMartin Storsjo   case fpu_v13:
223b1f6ba2aSMartin Storsjo   case fpu_v14:
224b1f6ba2aSMartin Storsjo   case fpu_v15:
225b1f6ba2aSMartin Storsjo   case fpu_v16:
226b1f6ba2aSMartin Storsjo   case fpu_v17:
227b1f6ba2aSMartin Storsjo   case fpu_v18:
228b1f6ba2aSMartin Storsjo   case fpu_v19:
229b1f6ba2aSMartin Storsjo   case fpu_v20:
230b1f6ba2aSMartin Storsjo   case fpu_v21:
231b1f6ba2aSMartin Storsjo   case fpu_v22:
232b1f6ba2aSMartin Storsjo   case fpu_v23:
233b1f6ba2aSMartin Storsjo   case fpu_v24:
234b1f6ba2aSMartin Storsjo   case fpu_v25:
235b1f6ba2aSMartin Storsjo   case fpu_v26:
236b1f6ba2aSMartin Storsjo   case fpu_v27:
237b1f6ba2aSMartin Storsjo   case fpu_v28:
238b1f6ba2aSMartin Storsjo   case fpu_v29:
239b1f6ba2aSMartin Storsjo   case fpu_v30:
240b1f6ba2aSMartin Storsjo   case fpu_v31:
241b1f6ba2aSMartin Storsjo     reg_value.SetBytes(m_context.V[reg - fpu_v0].B, reg_info->byte_size,
242b1f6ba2aSMartin Storsjo                        endian::InlHostByteOrder());
243b1f6ba2aSMartin Storsjo     break;
244b1f6ba2aSMartin Storsjo 
245b1f6ba2aSMartin Storsjo   case fpu_s0:
246b1f6ba2aSMartin Storsjo   case fpu_s1:
247b1f6ba2aSMartin Storsjo   case fpu_s2:
248b1f6ba2aSMartin Storsjo   case fpu_s3:
249b1f6ba2aSMartin Storsjo   case fpu_s4:
250b1f6ba2aSMartin Storsjo   case fpu_s5:
251b1f6ba2aSMartin Storsjo   case fpu_s6:
252b1f6ba2aSMartin Storsjo   case fpu_s7:
253b1f6ba2aSMartin Storsjo   case fpu_s8:
254b1f6ba2aSMartin Storsjo   case fpu_s9:
255b1f6ba2aSMartin Storsjo   case fpu_s10:
256b1f6ba2aSMartin Storsjo   case fpu_s11:
257b1f6ba2aSMartin Storsjo   case fpu_s12:
258b1f6ba2aSMartin Storsjo   case fpu_s13:
259b1f6ba2aSMartin Storsjo   case fpu_s14:
260b1f6ba2aSMartin Storsjo   case fpu_s15:
261b1f6ba2aSMartin Storsjo   case fpu_s16:
262b1f6ba2aSMartin Storsjo   case fpu_s17:
263b1f6ba2aSMartin Storsjo   case fpu_s18:
264b1f6ba2aSMartin Storsjo   case fpu_s19:
265b1f6ba2aSMartin Storsjo   case fpu_s20:
266b1f6ba2aSMartin Storsjo   case fpu_s21:
267b1f6ba2aSMartin Storsjo   case fpu_s22:
268b1f6ba2aSMartin Storsjo   case fpu_s23:
269b1f6ba2aSMartin Storsjo   case fpu_s24:
270b1f6ba2aSMartin Storsjo   case fpu_s25:
271b1f6ba2aSMartin Storsjo   case fpu_s26:
272b1f6ba2aSMartin Storsjo   case fpu_s27:
273b1f6ba2aSMartin Storsjo   case fpu_s28:
274b1f6ba2aSMartin Storsjo   case fpu_s29:
275b1f6ba2aSMartin Storsjo   case fpu_s30:
276b1f6ba2aSMartin Storsjo   case fpu_s31:
277b1f6ba2aSMartin Storsjo     reg_value.SetFloat(m_context.V[reg - fpu_s0].S[0]);
278b1f6ba2aSMartin Storsjo     break;
279b1f6ba2aSMartin Storsjo 
280b1f6ba2aSMartin Storsjo   case fpu_d0:
281b1f6ba2aSMartin Storsjo   case fpu_d1:
282b1f6ba2aSMartin Storsjo   case fpu_d2:
283b1f6ba2aSMartin Storsjo   case fpu_d3:
284b1f6ba2aSMartin Storsjo   case fpu_d4:
285b1f6ba2aSMartin Storsjo   case fpu_d5:
286b1f6ba2aSMartin Storsjo   case fpu_d6:
287b1f6ba2aSMartin Storsjo   case fpu_d7:
288b1f6ba2aSMartin Storsjo   case fpu_d8:
289b1f6ba2aSMartin Storsjo   case fpu_d9:
290b1f6ba2aSMartin Storsjo   case fpu_d10:
291b1f6ba2aSMartin Storsjo   case fpu_d11:
292b1f6ba2aSMartin Storsjo   case fpu_d12:
293b1f6ba2aSMartin Storsjo   case fpu_d13:
294b1f6ba2aSMartin Storsjo   case fpu_d14:
295b1f6ba2aSMartin Storsjo   case fpu_d15:
296b1f6ba2aSMartin Storsjo   case fpu_d16:
297b1f6ba2aSMartin Storsjo   case fpu_d17:
298b1f6ba2aSMartin Storsjo   case fpu_d18:
299b1f6ba2aSMartin Storsjo   case fpu_d19:
300b1f6ba2aSMartin Storsjo   case fpu_d20:
301b1f6ba2aSMartin Storsjo   case fpu_d21:
302b1f6ba2aSMartin Storsjo   case fpu_d22:
303b1f6ba2aSMartin Storsjo   case fpu_d23:
304b1f6ba2aSMartin Storsjo   case fpu_d24:
305b1f6ba2aSMartin Storsjo   case fpu_d25:
306b1f6ba2aSMartin Storsjo   case fpu_d26:
307b1f6ba2aSMartin Storsjo   case fpu_d27:
308b1f6ba2aSMartin Storsjo   case fpu_d28:
309b1f6ba2aSMartin Storsjo   case fpu_d29:
310b1f6ba2aSMartin Storsjo   case fpu_d30:
311b1f6ba2aSMartin Storsjo   case fpu_d31:
312b1f6ba2aSMartin Storsjo     reg_value.SetDouble(m_context.V[reg - fpu_d0].D[0]);
313b1f6ba2aSMartin Storsjo     break;
314b1f6ba2aSMartin Storsjo 
315b1f6ba2aSMartin Storsjo   case fpu_fpsr:
316b1f6ba2aSMartin Storsjo     reg_value.SetUInt32(m_context.Fpsr);
317b1f6ba2aSMartin Storsjo     break;
318b1f6ba2aSMartin Storsjo 
319b1f6ba2aSMartin Storsjo   case fpu_fpcr:
320b1f6ba2aSMartin Storsjo     reg_value.SetUInt32(m_context.Fpcr);
321b1f6ba2aSMartin Storsjo     break;
322b1f6ba2aSMartin Storsjo 
323b1f6ba2aSMartin Storsjo   default:
324b1f6ba2aSMartin Storsjo     reg_value.SetValueToInvalid();
325b1f6ba2aSMartin Storsjo     return false;
326b1f6ba2aSMartin Storsjo   }
327b1f6ba2aSMartin Storsjo   return true;
328b1f6ba2aSMartin Storsjo }
329b1f6ba2aSMartin Storsjo 
WriteRegister(const RegisterInfo * reg_info,const RegisterValue & reg_value)330b1f6ba2aSMartin Storsjo bool RegisterContextWindows_arm64::WriteRegister(
331b1f6ba2aSMartin Storsjo     const RegisterInfo *reg_info, const RegisterValue &reg_value) {
332b1f6ba2aSMartin Storsjo   // Since we cannot only write a single register value to the inferior, we
333b1f6ba2aSMartin Storsjo   // need to make sure our cached copy of the register values are fresh.
334b1f6ba2aSMartin Storsjo   // Otherwise when writing one register, we may also overwrite some other
335b1f6ba2aSMartin Storsjo   // register with a stale value.
336b1f6ba2aSMartin Storsjo   if (!CacheAllRegisterValues())
337b1f6ba2aSMartin Storsjo     return false;
338b1f6ba2aSMartin Storsjo 
339b1f6ba2aSMartin Storsjo   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
340b1f6ba2aSMartin Storsjo 
341b1f6ba2aSMartin Storsjo   switch (reg) {
342b1f6ba2aSMartin Storsjo   case gpr_x0:
343b1f6ba2aSMartin Storsjo   case gpr_x1:
344b1f6ba2aSMartin Storsjo   case gpr_x2:
345b1f6ba2aSMartin Storsjo   case gpr_x3:
346b1f6ba2aSMartin Storsjo   case gpr_x4:
347b1f6ba2aSMartin Storsjo   case gpr_x5:
348b1f6ba2aSMartin Storsjo   case gpr_x6:
349b1f6ba2aSMartin Storsjo   case gpr_x7:
350b1f6ba2aSMartin Storsjo   case gpr_x8:
351b1f6ba2aSMartin Storsjo   case gpr_x9:
352b1f6ba2aSMartin Storsjo   case gpr_x10:
353b1f6ba2aSMartin Storsjo   case gpr_x11:
354b1f6ba2aSMartin Storsjo   case gpr_x12:
355b1f6ba2aSMartin Storsjo   case gpr_x13:
356b1f6ba2aSMartin Storsjo   case gpr_x14:
357b1f6ba2aSMartin Storsjo   case gpr_x15:
358b1f6ba2aSMartin Storsjo   case gpr_x16:
359b1f6ba2aSMartin Storsjo   case gpr_x17:
360b1f6ba2aSMartin Storsjo   case gpr_x18:
361b1f6ba2aSMartin Storsjo   case gpr_x19:
362b1f6ba2aSMartin Storsjo   case gpr_x20:
363b1f6ba2aSMartin Storsjo   case gpr_x21:
364b1f6ba2aSMartin Storsjo   case gpr_x22:
365b1f6ba2aSMartin Storsjo   case gpr_x23:
366b1f6ba2aSMartin Storsjo   case gpr_x24:
367b1f6ba2aSMartin Storsjo   case gpr_x25:
368b1f6ba2aSMartin Storsjo   case gpr_x26:
369b1f6ba2aSMartin Storsjo   case gpr_x27:
370b1f6ba2aSMartin Storsjo   case gpr_x28:
371b1f6ba2aSMartin Storsjo     m_context.X[reg - gpr_x0] = reg_value.GetAsUInt64();
372b1f6ba2aSMartin Storsjo     break;
373b1f6ba2aSMartin Storsjo 
374b1f6ba2aSMartin Storsjo   case gpr_fp:
375b1f6ba2aSMartin Storsjo     m_context.Fp = reg_value.GetAsUInt64();
376b1f6ba2aSMartin Storsjo     break;
377b1f6ba2aSMartin Storsjo   case gpr_sp:
378b1f6ba2aSMartin Storsjo     m_context.Sp = reg_value.GetAsUInt64();
379b1f6ba2aSMartin Storsjo     break;
380b1f6ba2aSMartin Storsjo   case gpr_lr:
381b1f6ba2aSMartin Storsjo     m_context.Lr = reg_value.GetAsUInt64();
382b1f6ba2aSMartin Storsjo     break;
383b1f6ba2aSMartin Storsjo   case gpr_pc:
384b1f6ba2aSMartin Storsjo     m_context.Pc = reg_value.GetAsUInt64();
385b1f6ba2aSMartin Storsjo     break;
386b1f6ba2aSMartin Storsjo   case gpr_cpsr:
387b595137fSMuhammad Omair Javaid     m_context.Cpsr = reg_value.GetAsUInt32();
388b1f6ba2aSMartin Storsjo     break;
389b1f6ba2aSMartin Storsjo 
390b1f6ba2aSMartin Storsjo   case fpu_v0:
391b1f6ba2aSMartin Storsjo   case fpu_v1:
392b1f6ba2aSMartin Storsjo   case fpu_v2:
393b1f6ba2aSMartin Storsjo   case fpu_v3:
394b1f6ba2aSMartin Storsjo   case fpu_v4:
395b1f6ba2aSMartin Storsjo   case fpu_v5:
396b1f6ba2aSMartin Storsjo   case fpu_v6:
397b1f6ba2aSMartin Storsjo   case fpu_v7:
398b1f6ba2aSMartin Storsjo   case fpu_v8:
399b1f6ba2aSMartin Storsjo   case fpu_v9:
400b1f6ba2aSMartin Storsjo   case fpu_v10:
401b1f6ba2aSMartin Storsjo   case fpu_v11:
402b1f6ba2aSMartin Storsjo   case fpu_v12:
403b1f6ba2aSMartin Storsjo   case fpu_v13:
404b1f6ba2aSMartin Storsjo   case fpu_v14:
405b1f6ba2aSMartin Storsjo   case fpu_v15:
406b1f6ba2aSMartin Storsjo   case fpu_v16:
407b1f6ba2aSMartin Storsjo   case fpu_v17:
408b1f6ba2aSMartin Storsjo   case fpu_v18:
409b1f6ba2aSMartin Storsjo   case fpu_v19:
410b1f6ba2aSMartin Storsjo   case fpu_v20:
411b1f6ba2aSMartin Storsjo   case fpu_v21:
412b1f6ba2aSMartin Storsjo   case fpu_v22:
413b1f6ba2aSMartin Storsjo   case fpu_v23:
414b1f6ba2aSMartin Storsjo   case fpu_v24:
415b1f6ba2aSMartin Storsjo   case fpu_v25:
416b1f6ba2aSMartin Storsjo   case fpu_v26:
417b1f6ba2aSMartin Storsjo   case fpu_v27:
418b1f6ba2aSMartin Storsjo   case fpu_v28:
419b1f6ba2aSMartin Storsjo   case fpu_v29:
420b1f6ba2aSMartin Storsjo   case fpu_v30:
421b1f6ba2aSMartin Storsjo   case fpu_v31:
422b1f6ba2aSMartin Storsjo     memcpy(m_context.V[reg - fpu_v0].B, reg_value.GetBytes(), 16);
423b1f6ba2aSMartin Storsjo     break;
424b1f6ba2aSMartin Storsjo 
425b1f6ba2aSMartin Storsjo   case fpu_fpsr:
426b1f6ba2aSMartin Storsjo     m_context.Fpsr = reg_value.GetAsUInt32();
427b1f6ba2aSMartin Storsjo     break;
428b1f6ba2aSMartin Storsjo 
429b1f6ba2aSMartin Storsjo   case fpu_fpcr:
430b1f6ba2aSMartin Storsjo     m_context.Fpcr = reg_value.GetAsUInt32();
431b1f6ba2aSMartin Storsjo     break;
432b1f6ba2aSMartin Storsjo 
433b1f6ba2aSMartin Storsjo   default:
434b1f6ba2aSMartin Storsjo     return false;
435b1f6ba2aSMartin Storsjo   }
436b1f6ba2aSMartin Storsjo 
437b1f6ba2aSMartin Storsjo   // Physically update the registers in the target process.
438b1f6ba2aSMartin Storsjo   return ApplyAllRegisterValues();
439b1f6ba2aSMartin Storsjo }
440b1f6ba2aSMartin Storsjo 
441b1f6ba2aSMartin Storsjo #endif // defined(__aarch64__) || defined(_M_ARM64)
442