180814287SRaphael Isemann //===-- RegisterContextWindows_arm.cpp ------------------------------------===//
2a59444a3SMartin Storsjo //
3a59444a3SMartin Storsjo // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a59444a3SMartin Storsjo // See https://llvm.org/LICENSE.txt for license information.
5a59444a3SMartin Storsjo // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a59444a3SMartin Storsjo //
7a59444a3SMartin Storsjo //===----------------------------------------------------------------------===//
8a59444a3SMartin Storsjo 
9a59444a3SMartin Storsjo #if defined(__arm__) || defined(_M_ARM)
10a59444a3SMartin Storsjo 
11a59444a3SMartin Storsjo #include "lldb/Host/windows/HostThreadWindows.h"
12a59444a3SMartin Storsjo #include "lldb/Host/windows/windows.h"
13a59444a3SMartin Storsjo #include "lldb/Utility/RegisterValue.h"
14a59444a3SMartin Storsjo #include "lldb/Utility/Status.h"
15a59444a3SMartin Storsjo #include "lldb/lldb-private-types.h"
16a59444a3SMartin Storsjo 
17a59444a3SMartin Storsjo #include "RegisterContextWindows_arm.h"
18a59444a3SMartin Storsjo #include "TargetThreadWindows.h"
19a59444a3SMartin Storsjo 
20a59444a3SMartin Storsjo #include "llvm/ADT/STLExtras.h"
21a59444a3SMartin Storsjo 
22a59444a3SMartin Storsjo using namespace lldb;
23a59444a3SMartin Storsjo using namespace lldb_private;
24a59444a3SMartin Storsjo 
25a59444a3SMartin Storsjo #define GPR_OFFSET(idx) 0
26a59444a3SMartin Storsjo #define FPU_OFFSET(idx) 0
27a59444a3SMartin Storsjo #define FPSCR_OFFSET 0
28a59444a3SMartin Storsjo #define EXC_OFFSET(reg) 0
29a59444a3SMartin Storsjo #define DBG_OFFSET_NAME(reg) 0
30a59444a3SMartin Storsjo 
31a59444a3SMartin Storsjo #define DEFINE_DBG(reg, i)                                                     \
32a59444a3SMartin Storsjo   #reg, NULL,                                                                  \
33a59444a3SMartin Storsjo       0, DBG_OFFSET_NAME(reg[i]), eEncodingUint, eFormatHex,                   \
34a59444a3SMartin Storsjo                               {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
35a59444a3SMartin Storsjo                                LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
36a59444a3SMartin Storsjo                                LLDB_INVALID_REGNUM },                          \
37202af507SPavel Labath                                NULL, NULL
38a59444a3SMartin Storsjo 
39a59444a3SMartin Storsjo // Include RegisterInfos_arm to declare our g_register_infos_arm structure.
40a59444a3SMartin Storsjo #define DECLARE_REGISTER_INFOS_ARM_STRUCT
41a59444a3SMartin Storsjo #include "Plugins/Process/Utility/RegisterInfos_arm.h"
42a59444a3SMartin Storsjo #undef DECLARE_REGISTER_INFOS_ARM_STRUCT
43a59444a3SMartin Storsjo 
44*f15014ffSBenjamin Kramer static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos_arm);
45a59444a3SMartin Storsjo 
46a59444a3SMartin Storsjo // Array of lldb register numbers used to define the set of all General Purpose
47a59444a3SMartin Storsjo // Registers
48a59444a3SMartin Storsjo uint32_t g_gpr_reg_indices[] = {
49a59444a3SMartin Storsjo     gpr_r0, gpr_r1,  gpr_r2,  gpr_r3,  gpr_r4, gpr_r5, gpr_r6, gpr_r7,   gpr_r8,
50a59444a3SMartin Storsjo     gpr_r9, gpr_r10, gpr_r11, gpr_r12, gpr_sp, gpr_lr, gpr_pc, gpr_cpsr,
51a59444a3SMartin Storsjo };
52a59444a3SMartin Storsjo 
53a59444a3SMartin Storsjo uint32_t g_fpu_reg_indices[] = {
54a59444a3SMartin Storsjo     fpu_s0,    fpu_s1,  fpu_s2,  fpu_s3,  fpu_s4,  fpu_s5,  fpu_s6,  fpu_s7,
55a59444a3SMartin Storsjo     fpu_s8,    fpu_s9,  fpu_s10, fpu_s11, fpu_s12, fpu_s13, fpu_s14, fpu_s15,
56a59444a3SMartin Storsjo     fpu_s16,   fpu_s17, fpu_s18, fpu_s19, fpu_s20, fpu_s21, fpu_s22, fpu_s23,
57a59444a3SMartin Storsjo     fpu_s24,   fpu_s25, fpu_s26, fpu_s27, fpu_s28, fpu_s29, fpu_s30, fpu_s31,
58a59444a3SMartin Storsjo 
59a59444a3SMartin Storsjo     fpu_d0,    fpu_d1,  fpu_d2,  fpu_d3,  fpu_d4,  fpu_d5,  fpu_d6,  fpu_d7,
60a59444a3SMartin Storsjo     fpu_d8,    fpu_d9,  fpu_d10, fpu_d11, fpu_d12, fpu_d13, fpu_d14, fpu_d15,
61a59444a3SMartin Storsjo     fpu_d16,   fpu_d17, fpu_d18, fpu_d19, fpu_d20, fpu_d21, fpu_d22, fpu_d23,
62a59444a3SMartin Storsjo     fpu_d24,   fpu_d25, fpu_d26, fpu_d27, fpu_d28, fpu_d29, fpu_d30, fpu_d31,
63a59444a3SMartin Storsjo 
64a59444a3SMartin Storsjo     fpu_q0,    fpu_q1,  fpu_q2,  fpu_q3,  fpu_q4,  fpu_q5,  fpu_q6,  fpu_q7,
65a59444a3SMartin Storsjo     fpu_q8,    fpu_q9,  fpu_q10, fpu_q11, fpu_q12, fpu_q13, fpu_q14, fpu_q15,
66a59444a3SMartin Storsjo 
67a59444a3SMartin Storsjo     fpu_fpscr,
68a59444a3SMartin Storsjo };
69a59444a3SMartin Storsjo 
70a59444a3SMartin Storsjo RegisterSet g_register_sets[] = {
71a59444a3SMartin Storsjo     {"General Purpose Registers", "gpr",
72*f15014ffSBenjamin Kramer      llvm::array_lengthof(g_gpr_reg_indices), g_gpr_reg_indices},
73*f15014ffSBenjamin Kramer     {"Floating Point Registers", "fpu", llvm::array_lengthof(g_fpu_reg_indices),
74a59444a3SMartin Storsjo      g_fpu_reg_indices},
75a59444a3SMartin Storsjo };
76a59444a3SMartin Storsjo 
77a59444a3SMartin Storsjo // Constructors and Destructors
RegisterContextWindows_arm(Thread & thread,uint32_t concrete_frame_idx)78a59444a3SMartin Storsjo RegisterContextWindows_arm::RegisterContextWindows_arm(
79a59444a3SMartin Storsjo     Thread &thread, uint32_t concrete_frame_idx)
80a59444a3SMartin Storsjo     : RegisterContextWindows(thread, concrete_frame_idx) {}
81a59444a3SMartin Storsjo 
~RegisterContextWindows_arm()82a59444a3SMartin Storsjo RegisterContextWindows_arm::~RegisterContextWindows_arm() {}
83a59444a3SMartin Storsjo 
GetRegisterCount()84a59444a3SMartin Storsjo size_t RegisterContextWindows_arm::GetRegisterCount() {
85*f15014ffSBenjamin Kramer   return llvm::array_lengthof(g_register_infos_arm);
86a59444a3SMartin Storsjo }
87a59444a3SMartin Storsjo 
88a59444a3SMartin Storsjo const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)89a59444a3SMartin Storsjo RegisterContextWindows_arm::GetRegisterInfoAtIndex(size_t reg) {
90a59444a3SMartin Storsjo   if (reg < k_num_register_infos)
91a59444a3SMartin Storsjo     return &g_register_infos_arm[reg];
92a59444a3SMartin Storsjo   return NULL;
93a59444a3SMartin Storsjo }
94a59444a3SMartin Storsjo 
GetRegisterSetCount()95a59444a3SMartin Storsjo size_t RegisterContextWindows_arm::GetRegisterSetCount() {
96*f15014ffSBenjamin Kramer   return llvm::array_lengthof(g_register_sets);
97a59444a3SMartin Storsjo }
98a59444a3SMartin Storsjo 
GetRegisterSet(size_t reg_set)99a59444a3SMartin Storsjo const RegisterSet *RegisterContextWindows_arm::GetRegisterSet(size_t reg_set) {
100a59444a3SMartin Storsjo   return &g_register_sets[reg_set];
101a59444a3SMartin Storsjo }
102a59444a3SMartin Storsjo 
ReadRegister(const RegisterInfo * reg_info,RegisterValue & reg_value)103a59444a3SMartin Storsjo bool RegisterContextWindows_arm::ReadRegister(const RegisterInfo *reg_info,
104a59444a3SMartin Storsjo                                               RegisterValue &reg_value) {
105a59444a3SMartin Storsjo   if (!CacheAllRegisterValues())
106a59444a3SMartin Storsjo     return false;
107a59444a3SMartin Storsjo 
108a59444a3SMartin Storsjo   if (reg_info == nullptr)
109a59444a3SMartin Storsjo     return false;
110a59444a3SMartin Storsjo 
111a59444a3SMartin Storsjo   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
112a59444a3SMartin Storsjo 
113a59444a3SMartin Storsjo   switch (reg) {
114a59444a3SMartin Storsjo   case gpr_r0:
115a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R0);
116a59444a3SMartin Storsjo     break;
117a59444a3SMartin Storsjo   case gpr_r1:
118a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R1);
119a59444a3SMartin Storsjo     break;
120a59444a3SMartin Storsjo   case gpr_r2:
121a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R2);
122a59444a3SMartin Storsjo     break;
123a59444a3SMartin Storsjo   case gpr_r3:
124a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R3);
125a59444a3SMartin Storsjo     break;
126a59444a3SMartin Storsjo   case gpr_r4:
127a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R4);
128a59444a3SMartin Storsjo     break;
129a59444a3SMartin Storsjo   case gpr_r5:
130a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R5);
131a59444a3SMartin Storsjo     break;
132a59444a3SMartin Storsjo   case gpr_r6:
133a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R6);
134a59444a3SMartin Storsjo     break;
135a59444a3SMartin Storsjo   case gpr_r7:
136a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R7);
137a59444a3SMartin Storsjo     break;
138a59444a3SMartin Storsjo   case gpr_r8:
139a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R8);
140a59444a3SMartin Storsjo     break;
141a59444a3SMartin Storsjo   case gpr_r9:
142a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R9);
143a59444a3SMartin Storsjo     break;
144a59444a3SMartin Storsjo   case gpr_r10:
145a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R10);
146a59444a3SMartin Storsjo     break;
147a59444a3SMartin Storsjo   case gpr_r11:
148a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R11);
149a59444a3SMartin Storsjo     break;
150a59444a3SMartin Storsjo   case gpr_r12:
151a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.R12);
152a59444a3SMartin Storsjo     break;
153a59444a3SMartin Storsjo   case gpr_sp:
154a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.Sp);
155a59444a3SMartin Storsjo     break;
156a59444a3SMartin Storsjo   case gpr_lr:
157a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.Lr);
158a59444a3SMartin Storsjo     break;
159a59444a3SMartin Storsjo   case gpr_pc:
160a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.Pc);
161a59444a3SMartin Storsjo     break;
162a59444a3SMartin Storsjo   case gpr_cpsr:
163a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.Cpsr);
164a59444a3SMartin Storsjo     break;
165a59444a3SMartin Storsjo 
166a59444a3SMartin Storsjo   case fpu_s0:
167a59444a3SMartin Storsjo   case fpu_s1:
168a59444a3SMartin Storsjo   case fpu_s2:
169a59444a3SMartin Storsjo   case fpu_s3:
170a59444a3SMartin Storsjo   case fpu_s4:
171a59444a3SMartin Storsjo   case fpu_s5:
172a59444a3SMartin Storsjo   case fpu_s6:
173a59444a3SMartin Storsjo   case fpu_s7:
174a59444a3SMartin Storsjo   case fpu_s8:
175a59444a3SMartin Storsjo   case fpu_s9:
176a59444a3SMartin Storsjo   case fpu_s10:
177a59444a3SMartin Storsjo   case fpu_s11:
178a59444a3SMartin Storsjo   case fpu_s12:
179a59444a3SMartin Storsjo   case fpu_s13:
180a59444a3SMartin Storsjo   case fpu_s14:
181a59444a3SMartin Storsjo   case fpu_s15:
182a59444a3SMartin Storsjo   case fpu_s16:
183a59444a3SMartin Storsjo   case fpu_s17:
184a59444a3SMartin Storsjo   case fpu_s18:
185a59444a3SMartin Storsjo   case fpu_s19:
186a59444a3SMartin Storsjo   case fpu_s20:
187a59444a3SMartin Storsjo   case fpu_s21:
188a59444a3SMartin Storsjo   case fpu_s22:
189a59444a3SMartin Storsjo   case fpu_s23:
190a59444a3SMartin Storsjo   case fpu_s24:
191a59444a3SMartin Storsjo   case fpu_s25:
192a59444a3SMartin Storsjo   case fpu_s26:
193a59444a3SMartin Storsjo   case fpu_s27:
194a59444a3SMartin Storsjo   case fpu_s28:
195a59444a3SMartin Storsjo   case fpu_s29:
196a59444a3SMartin Storsjo   case fpu_s30:
197a59444a3SMartin Storsjo   case fpu_s31:
198a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.S[reg - fpu_s0], RegisterValue::eTypeFloat);
199a59444a3SMartin Storsjo     break;
200a59444a3SMartin Storsjo 
201a59444a3SMartin Storsjo   case fpu_d0:
202a59444a3SMartin Storsjo   case fpu_d1:
203a59444a3SMartin Storsjo   case fpu_d2:
204a59444a3SMartin Storsjo   case fpu_d3:
205a59444a3SMartin Storsjo   case fpu_d4:
206a59444a3SMartin Storsjo   case fpu_d5:
207a59444a3SMartin Storsjo   case fpu_d6:
208a59444a3SMartin Storsjo   case fpu_d7:
209a59444a3SMartin Storsjo   case fpu_d8:
210a59444a3SMartin Storsjo   case fpu_d9:
211a59444a3SMartin Storsjo   case fpu_d10:
212a59444a3SMartin Storsjo   case fpu_d11:
213a59444a3SMartin Storsjo   case fpu_d12:
214a59444a3SMartin Storsjo   case fpu_d13:
215a59444a3SMartin Storsjo   case fpu_d14:
216a59444a3SMartin Storsjo   case fpu_d15:
217a59444a3SMartin Storsjo   case fpu_d16:
218a59444a3SMartin Storsjo   case fpu_d17:
219a59444a3SMartin Storsjo   case fpu_d18:
220a59444a3SMartin Storsjo   case fpu_d19:
221a59444a3SMartin Storsjo   case fpu_d20:
222a59444a3SMartin Storsjo   case fpu_d21:
223a59444a3SMartin Storsjo   case fpu_d22:
224a59444a3SMartin Storsjo   case fpu_d23:
225a59444a3SMartin Storsjo   case fpu_d24:
226a59444a3SMartin Storsjo   case fpu_d25:
227a59444a3SMartin Storsjo   case fpu_d26:
228a59444a3SMartin Storsjo   case fpu_d27:
229a59444a3SMartin Storsjo   case fpu_d28:
230a59444a3SMartin Storsjo   case fpu_d29:
231a59444a3SMartin Storsjo   case fpu_d30:
232a59444a3SMartin Storsjo   case fpu_d31:
233a59444a3SMartin Storsjo     reg_value.SetUInt64(m_context.D[reg - fpu_d0], RegisterValue::eTypeDouble);
234a59444a3SMartin Storsjo     break;
235a59444a3SMartin Storsjo 
236a59444a3SMartin Storsjo   case fpu_q0:
237a59444a3SMartin Storsjo   case fpu_q1:
238a59444a3SMartin Storsjo   case fpu_q2:
239a59444a3SMartin Storsjo   case fpu_q3:
240a59444a3SMartin Storsjo   case fpu_q4:
241a59444a3SMartin Storsjo   case fpu_q5:
242a59444a3SMartin Storsjo   case fpu_q6:
243a59444a3SMartin Storsjo   case fpu_q7:
244a59444a3SMartin Storsjo   case fpu_q8:
245a59444a3SMartin Storsjo   case fpu_q9:
246a59444a3SMartin Storsjo   case fpu_q10:
247a59444a3SMartin Storsjo   case fpu_q11:
248a59444a3SMartin Storsjo   case fpu_q12:
249a59444a3SMartin Storsjo   case fpu_q13:
250a59444a3SMartin Storsjo   case fpu_q14:
251a59444a3SMartin Storsjo   case fpu_q15:
252a59444a3SMartin Storsjo     reg_value.SetBytes(&m_context.Q[reg - fpu_q0], reg_info->byte_size,
253a59444a3SMartin Storsjo                        endian::InlHostByteOrder());
254a59444a3SMartin Storsjo     break;
255a59444a3SMartin Storsjo 
256a59444a3SMartin Storsjo   case fpu_fpscr:
257a59444a3SMartin Storsjo     reg_value.SetUInt32(m_context.Fpscr);
258a59444a3SMartin Storsjo     break;
259a59444a3SMartin Storsjo 
260a59444a3SMartin Storsjo   default:
261a59444a3SMartin Storsjo     reg_value.SetValueToInvalid();
262a59444a3SMartin Storsjo     return false;
263a59444a3SMartin Storsjo   }
264a59444a3SMartin Storsjo   return true;
265a59444a3SMartin Storsjo }
266a59444a3SMartin Storsjo 
WriteRegister(const RegisterInfo * reg_info,const RegisterValue & reg_value)267a59444a3SMartin Storsjo bool RegisterContextWindows_arm::WriteRegister(const RegisterInfo *reg_info,
268a59444a3SMartin Storsjo                                                const RegisterValue &reg_value) {
269a59444a3SMartin Storsjo   // Since we cannot only write a single register value to the inferior, we
270a59444a3SMartin Storsjo   // need to make sure our cached copy of the register values are fresh.
271a59444a3SMartin Storsjo   // Otherwise when writing EAX, for example, we may also overwrite some other
272a59444a3SMartin Storsjo   // register with a stale value.
273a59444a3SMartin Storsjo   if (!CacheAllRegisterValues())
274a59444a3SMartin Storsjo     return false;
275a59444a3SMartin Storsjo 
276a59444a3SMartin Storsjo   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
277a59444a3SMartin Storsjo 
278a59444a3SMartin Storsjo   switch (reg) {
279a59444a3SMartin Storsjo   case gpr_r0:
280a59444a3SMartin Storsjo     m_context.R0 = reg_value.GetAsUInt32();
281a59444a3SMartin Storsjo     break;
282a59444a3SMartin Storsjo   case gpr_r1:
283a59444a3SMartin Storsjo     m_context.R1 = reg_value.GetAsUInt32();
284a59444a3SMartin Storsjo     break;
285a59444a3SMartin Storsjo   case gpr_r2:
286a59444a3SMartin Storsjo     m_context.R2 = reg_value.GetAsUInt32();
287a59444a3SMartin Storsjo     break;
288a59444a3SMartin Storsjo   case gpr_r3:
289a59444a3SMartin Storsjo     m_context.R3 = reg_value.GetAsUInt32();
290a59444a3SMartin Storsjo     break;
291a59444a3SMartin Storsjo   case gpr_r4:
292a59444a3SMartin Storsjo     m_context.R4 = reg_value.GetAsUInt32();
293a59444a3SMartin Storsjo     break;
294a59444a3SMartin Storsjo   case gpr_r5:
295a59444a3SMartin Storsjo     m_context.R5 = reg_value.GetAsUInt32();
296a59444a3SMartin Storsjo     break;
297a59444a3SMartin Storsjo   case gpr_r6:
298a59444a3SMartin Storsjo     m_context.R6 = reg_value.GetAsUInt32();
299a59444a3SMartin Storsjo     break;
300a59444a3SMartin Storsjo   case gpr_r7:
301a59444a3SMartin Storsjo     m_context.R7 = reg_value.GetAsUInt32();
302a59444a3SMartin Storsjo     break;
303a59444a3SMartin Storsjo   case gpr_r8:
304a59444a3SMartin Storsjo     m_context.R8 = reg_value.GetAsUInt32();
305a59444a3SMartin Storsjo     break;
306a59444a3SMartin Storsjo   case gpr_r9:
307a59444a3SMartin Storsjo     m_context.R9 = reg_value.GetAsUInt32();
308a59444a3SMartin Storsjo     break;
309a59444a3SMartin Storsjo   case gpr_r10:
310a59444a3SMartin Storsjo     m_context.R10 = reg_value.GetAsUInt32();
311a59444a3SMartin Storsjo     break;
312a59444a3SMartin Storsjo   case gpr_r11:
313a59444a3SMartin Storsjo     m_context.R11 = reg_value.GetAsUInt32();
314a59444a3SMartin Storsjo     break;
315a59444a3SMartin Storsjo   case gpr_r12:
316a59444a3SMartin Storsjo     m_context.R12 = reg_value.GetAsUInt32();
317a59444a3SMartin Storsjo     break;
318a59444a3SMartin Storsjo   case gpr_sp:
319a59444a3SMartin Storsjo     m_context.Sp = reg_value.GetAsUInt32();
320a59444a3SMartin Storsjo     break;
321a59444a3SMartin Storsjo   case gpr_lr:
322a59444a3SMartin Storsjo     m_context.Lr = reg_value.GetAsUInt32();
323a59444a3SMartin Storsjo     break;
324a59444a3SMartin Storsjo   case gpr_pc:
325a59444a3SMartin Storsjo     m_context.Pc = reg_value.GetAsUInt32();
326a59444a3SMartin Storsjo     break;
327a59444a3SMartin Storsjo   case gpr_cpsr:
328a59444a3SMartin Storsjo     m_context.Cpsr = reg_value.GetAsUInt32();
329a59444a3SMartin Storsjo     break;
330a59444a3SMartin Storsjo 
331a59444a3SMartin Storsjo   case fpu_s0:
332a59444a3SMartin Storsjo   case fpu_s1:
333a59444a3SMartin Storsjo   case fpu_s2:
334a59444a3SMartin Storsjo   case fpu_s3:
335a59444a3SMartin Storsjo   case fpu_s4:
336a59444a3SMartin Storsjo   case fpu_s5:
337a59444a3SMartin Storsjo   case fpu_s6:
338a59444a3SMartin Storsjo   case fpu_s7:
339a59444a3SMartin Storsjo   case fpu_s8:
340a59444a3SMartin Storsjo   case fpu_s9:
341a59444a3SMartin Storsjo   case fpu_s10:
342a59444a3SMartin Storsjo   case fpu_s11:
343a59444a3SMartin Storsjo   case fpu_s12:
344a59444a3SMartin Storsjo   case fpu_s13:
345a59444a3SMartin Storsjo   case fpu_s14:
346a59444a3SMartin Storsjo   case fpu_s15:
347a59444a3SMartin Storsjo   case fpu_s16:
348a59444a3SMartin Storsjo   case fpu_s17:
349a59444a3SMartin Storsjo   case fpu_s18:
350a59444a3SMartin Storsjo   case fpu_s19:
351a59444a3SMartin Storsjo   case fpu_s20:
352a59444a3SMartin Storsjo   case fpu_s21:
353a59444a3SMartin Storsjo   case fpu_s22:
354a59444a3SMartin Storsjo   case fpu_s23:
355a59444a3SMartin Storsjo   case fpu_s24:
356a59444a3SMartin Storsjo   case fpu_s25:
357a59444a3SMartin Storsjo   case fpu_s26:
358a59444a3SMartin Storsjo   case fpu_s27:
359a59444a3SMartin Storsjo   case fpu_s28:
360a59444a3SMartin Storsjo   case fpu_s29:
361a59444a3SMartin Storsjo   case fpu_s30:
362a59444a3SMartin Storsjo   case fpu_s31:
363a59444a3SMartin Storsjo     m_context.S[reg - fpu_s0] = reg_value.GetAsUInt32();
364a59444a3SMartin Storsjo     break;
365a59444a3SMartin Storsjo 
366a59444a3SMartin Storsjo   case fpu_d0:
367a59444a3SMartin Storsjo   case fpu_d1:
368a59444a3SMartin Storsjo   case fpu_d2:
369a59444a3SMartin Storsjo   case fpu_d3:
370a59444a3SMartin Storsjo   case fpu_d4:
371a59444a3SMartin Storsjo   case fpu_d5:
372a59444a3SMartin Storsjo   case fpu_d6:
373a59444a3SMartin Storsjo   case fpu_d7:
374a59444a3SMartin Storsjo   case fpu_d8:
375a59444a3SMartin Storsjo   case fpu_d9:
376a59444a3SMartin Storsjo   case fpu_d10:
377a59444a3SMartin Storsjo   case fpu_d11:
378a59444a3SMartin Storsjo   case fpu_d12:
379a59444a3SMartin Storsjo   case fpu_d13:
380a59444a3SMartin Storsjo   case fpu_d14:
381a59444a3SMartin Storsjo   case fpu_d15:
382a59444a3SMartin Storsjo   case fpu_d16:
383a59444a3SMartin Storsjo   case fpu_d17:
384a59444a3SMartin Storsjo   case fpu_d18:
385a59444a3SMartin Storsjo   case fpu_d19:
386a59444a3SMartin Storsjo   case fpu_d20:
387a59444a3SMartin Storsjo   case fpu_d21:
388a59444a3SMartin Storsjo   case fpu_d22:
389a59444a3SMartin Storsjo   case fpu_d23:
390a59444a3SMartin Storsjo   case fpu_d24:
391a59444a3SMartin Storsjo   case fpu_d25:
392a59444a3SMartin Storsjo   case fpu_d26:
393a59444a3SMartin Storsjo   case fpu_d27:
394a59444a3SMartin Storsjo   case fpu_d28:
395a59444a3SMartin Storsjo   case fpu_d29:
396a59444a3SMartin Storsjo   case fpu_d30:
397a59444a3SMartin Storsjo   case fpu_d31:
398a59444a3SMartin Storsjo     m_context.D[reg - fpu_d0] = reg_value.GetAsUInt64();
399a59444a3SMartin Storsjo     break;
400a59444a3SMartin Storsjo 
401a59444a3SMartin Storsjo   case fpu_q0:
402a59444a3SMartin Storsjo   case fpu_q1:
403a59444a3SMartin Storsjo   case fpu_q2:
404a59444a3SMartin Storsjo   case fpu_q3:
405a59444a3SMartin Storsjo   case fpu_q4:
406a59444a3SMartin Storsjo   case fpu_q5:
407a59444a3SMartin Storsjo   case fpu_q6:
408a59444a3SMartin Storsjo   case fpu_q7:
409a59444a3SMartin Storsjo   case fpu_q8:
410a59444a3SMartin Storsjo   case fpu_q9:
411a59444a3SMartin Storsjo   case fpu_q10:
412a59444a3SMartin Storsjo   case fpu_q11:
413a59444a3SMartin Storsjo   case fpu_q12:
414a59444a3SMartin Storsjo   case fpu_q13:
415a59444a3SMartin Storsjo   case fpu_q14:
416a59444a3SMartin Storsjo   case fpu_q15:
417a59444a3SMartin Storsjo     memcpy(&m_context.Q[reg - fpu_q0], reg_value.GetBytes(), 16);
418a59444a3SMartin Storsjo     break;
419a59444a3SMartin Storsjo 
420a59444a3SMartin Storsjo   case fpu_fpscr:
421a59444a3SMartin Storsjo     m_context.Fpscr = reg_value.GetAsUInt32();
422a59444a3SMartin Storsjo     break;
423a59444a3SMartin Storsjo 
424a59444a3SMartin Storsjo   default:
425a59444a3SMartin Storsjo     return false;
426a59444a3SMartin Storsjo   }
427a59444a3SMartin Storsjo 
428a59444a3SMartin Storsjo   // Physically update the registers in the target process.
429a59444a3SMartin Storsjo   return ApplyAllRegisterValues();
430a59444a3SMartin Storsjo }
431a59444a3SMartin Storsjo 
432a59444a3SMartin Storsjo #endif // defined(__arm__) || defined(_M_ARM)
433