@@ -24,6 +24,11 @@ using namespace lldb_private;
24
24
25
25
#define DEFINE_GPR (reg, alt ) #reg, alt, 8 , 0 , eEncodingUint, eFormatHexUppercase
26
26
#define DEFINE_GPR_BIN (reg, alt ) #reg, alt, 8 , 0 , eEncodingUint, eFormatBinary
27
+ #define DEFINE_FPU_XMM (reg ) \
28
+ #reg, NULL , 16 , 0 , eEncodingUint, eFormatVectorOfUInt64, \
29
+ {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, LLDB_INVALID_REGNUM, \
30
+ LLDB_INVALID_REGNUM, lldb_##reg##_x86_64}, \
31
+ nullptr , nullptr , nullptr , 0
27
32
28
33
namespace {
29
34
@@ -51,7 +56,24 @@ enum RegisterIndex {
51
56
eRegisterIndexR14,
52
57
eRegisterIndexR15,
53
58
eRegisterIndexRip,
54
- eRegisterIndexRflags
59
+ eRegisterIndexRflags,
60
+
61
+ eRegisterIndexXmm0,
62
+ eRegisterIndexXmm1,
63
+ eRegisterIndexXmm2,
64
+ eRegisterIndexXmm3,
65
+ eRegisterIndexXmm4,
66
+ eRegisterIndexXmm5,
67
+ eRegisterIndexXmm6,
68
+ eRegisterIndexXmm7,
69
+ eRegisterIndexXmm8,
70
+ eRegisterIndexXmm9,
71
+ eRegisterIndexXmm10,
72
+ eRegisterIndexXmm11,
73
+ eRegisterIndexXmm12,
74
+ eRegisterIndexXmm13,
75
+ eRegisterIndexXmm14,
76
+ eRegisterIndexXmm15
55
77
};
56
78
57
79
// Array of all register information supported by Windows x86
@@ -133,14 +155,14 @@ RegisterInfo g_register_infos[] = {
133
155
nullptr ,
134
156
0 },
135
157
{DEFINE_GPR (r10, nullptr ),
136
- {dwarf_r10_x86_64, dwarf_r10_x86_64, LLDB_REGNUM_GENERIC_ARG5 ,
158
+ {dwarf_r10_x86_64, dwarf_r10_x86_64, LLDB_INVALID_REGNUM ,
137
159
LLDB_INVALID_REGNUM, lldb_r10_x86_64},
138
160
nullptr ,
139
161
nullptr ,
140
162
nullptr ,
141
163
0 },
142
164
{DEFINE_GPR (r11, nullptr ),
143
- {dwarf_r11_x86_64, dwarf_r11_x86_64, LLDB_REGNUM_GENERIC_ARG6 ,
165
+ {dwarf_r11_x86_64, dwarf_r11_x86_64, LLDB_INVALID_REGNUM ,
144
166
LLDB_INVALID_REGNUM, lldb_r11_x86_64},
145
167
nullptr ,
146
168
nullptr ,
@@ -188,6 +210,22 @@ RegisterInfo g_register_infos[] = {
188
210
nullptr ,
189
211
nullptr ,
190
212
0 },
213
+ {DEFINE_FPU_XMM (xmm0)},
214
+ {DEFINE_FPU_XMM (xmm1)},
215
+ {DEFINE_FPU_XMM (xmm2)},
216
+ {DEFINE_FPU_XMM (xmm3)},
217
+ {DEFINE_FPU_XMM (xmm4)},
218
+ {DEFINE_FPU_XMM (xmm5)},
219
+ {DEFINE_FPU_XMM (xmm6)},
220
+ {DEFINE_FPU_XMM (xmm7)},
221
+ {DEFINE_FPU_XMM (xmm8)},
222
+ {DEFINE_FPU_XMM (xmm9)},
223
+ {DEFINE_FPU_XMM (xmm10)},
224
+ {DEFINE_FPU_XMM (xmm11)},
225
+ {DEFINE_FPU_XMM (xmm12)},
226
+ {DEFINE_FPU_XMM (xmm13)},
227
+ {DEFINE_FPU_XMM (xmm14)},
228
+ {DEFINE_FPU_XMM (xmm15)}
191
229
};
192
230
193
231
static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos);
@@ -202,10 +240,20 @@ uint32_t g_gpr_reg_indices[] = {
202
240
eRegisterIndexR12, eRegisterIndexR13, eRegisterIndexR14,
203
241
eRegisterIndexR15, eRegisterIndexRip, eRegisterIndexRflags};
204
242
243
+ uint32_t g_fpu_reg_indices[] = {
244
+ eRegisterIndexXmm0, eRegisterIndexXmm1, eRegisterIndexXmm2,
245
+ eRegisterIndexXmm3, eRegisterIndexXmm4, eRegisterIndexXmm5,
246
+ eRegisterIndexXmm6, eRegisterIndexXmm7, eRegisterIndexXmm8,
247
+ eRegisterIndexXmm9, eRegisterIndexXmm10, eRegisterIndexXmm11,
248
+ eRegisterIndexXmm12, eRegisterIndexXmm13, eRegisterIndexXmm14,
249
+ eRegisterIndexXmm15
250
+ };
251
+
205
252
RegisterSet g_register_sets[] = {
206
253
{" General Purpose Registers" , " gpr" ,
207
254
llvm::array_lengthof (g_gpr_reg_indices), g_gpr_reg_indices},
208
- };
255
+ {" Floating Point Registers" , " fpu" ,
256
+ llvm::array_lengthof (g_fpu_reg_indices), g_fpu_reg_indices}};
209
257
}
210
258
211
259
// Constructors and Destructors
@@ -242,7 +290,9 @@ bool RegisterContextWindows_x64::ReadRegister(const RegisterInfo *reg_info,
242
290
if (reg_info == nullptr )
243
291
return false ;
244
292
245
- switch (reg_info->kinds [eRegisterKindLLDB]) {
293
+ const uint32_t reg = reg_info->kinds [eRegisterKindLLDB];
294
+
295
+ switch (reg) {
246
296
case lldb_rax_x86_64:
247
297
reg_value.SetUInt64 (m_context.Rax );
248
298
break ;
@@ -297,6 +347,70 @@ bool RegisterContextWindows_x64::ReadRegister(const RegisterInfo *reg_info,
297
347
case lldb_rflags_x86_64:
298
348
reg_value.SetUInt64 (m_context.EFlags );
299
349
break ;
350
+ case lldb_xmm0_x86_64:
351
+ reg_value.SetBytes (&m_context.Xmm0 ,
352
+ reg_info->byte_size , endian::InlHostByteOrder ());
353
+ break ;
354
+ case lldb_xmm1_x86_64:
355
+ reg_value.SetBytes (&m_context.Xmm1 ,
356
+ reg_info->byte_size , endian::InlHostByteOrder ());
357
+ break ;
358
+ case lldb_xmm2_x86_64:
359
+ reg_value.SetBytes (&m_context.Xmm2 ,
360
+ reg_info->byte_size , endian::InlHostByteOrder ());
361
+ break ;
362
+ case lldb_xmm3_x86_64:
363
+ reg_value.SetBytes (&m_context.Xmm3 ,
364
+ reg_info->byte_size , endian::InlHostByteOrder ());
365
+ break ;
366
+ case lldb_xmm4_x86_64:
367
+ reg_value.SetBytes (&m_context.Xmm4 ,
368
+ reg_info->byte_size , endian::InlHostByteOrder ());
369
+ break ;
370
+ case lldb_xmm5_x86_64:
371
+ reg_value.SetBytes (&m_context.Xmm5 ,
372
+ reg_info->byte_size , endian::InlHostByteOrder ());
373
+ break ;
374
+ case lldb_xmm6_x86_64:
375
+ reg_value.SetBytes (&m_context.Xmm6 ,
376
+ reg_info->byte_size , endian::InlHostByteOrder ());
377
+ break ;
378
+ case lldb_xmm7_x86_64:
379
+ reg_value.SetBytes (&m_context.Xmm7 ,
380
+ reg_info->byte_size , endian::InlHostByteOrder ());
381
+ break ;
382
+ case lldb_xmm8_x86_64:
383
+ reg_value.SetBytes (&m_context.Xmm8 ,
384
+ reg_info->byte_size , endian::InlHostByteOrder ());
385
+ break ;
386
+ case lldb_xmm9_x86_64:
387
+ reg_value.SetBytes (&m_context.Xmm9 ,
388
+ reg_info->byte_size , endian::InlHostByteOrder ());
389
+ break ;
390
+ case lldb_xmm10_x86_64:
391
+ reg_value.SetBytes (&m_context.Xmm10 ,
392
+ reg_info->byte_size , endian::InlHostByteOrder ());
393
+ break ;
394
+ case lldb_xmm11_x86_64:
395
+ reg_value.SetBytes (&m_context.Xmm11 ,
396
+ reg_info->byte_size , endian::InlHostByteOrder ());
397
+ break ;
398
+ case lldb_xmm12_x86_64:
399
+ reg_value.SetBytes (&m_context.Xmm12 ,
400
+ reg_info->byte_size , endian::InlHostByteOrder ());
401
+ break ;
402
+ case lldb_xmm13_x86_64:
403
+ reg_value.SetBytes (&m_context.Xmm13 ,
404
+ reg_info->byte_size , endian::InlHostByteOrder ());
405
+ break ;
406
+ case lldb_xmm14_x86_64:
407
+ reg_value.SetBytes (&m_context.Xmm14 ,
408
+ reg_info->byte_size , endian::InlHostByteOrder ());
409
+ break ;
410
+ case lldb_xmm15_x86_64:
411
+ reg_value.SetBytes (&m_context.Xmm15 ,
412
+ reg_info->byte_size , endian::InlHostByteOrder ());
413
+ break ;
300
414
}
301
415
return true ;
302
416
}
@@ -365,6 +479,54 @@ bool RegisterContextWindows_x64::WriteRegister(const RegisterInfo *reg_info,
365
479
case lldb_rflags_x86_64:
366
480
m_context.EFlags = reg_value.GetAsUInt64 ();
367
481
break ;
482
+ case lldb_xmm0_x86_64:
483
+ memcpy (&m_context.Xmm0 , reg_value.GetBytes (), 16 );
484
+ break ;
485
+ case lldb_xmm1_x86_64:
486
+ memcpy (&m_context.Xmm1 , reg_value.GetBytes (), 16 );
487
+ break ;
488
+ case lldb_xmm2_x86_64:
489
+ memcpy (&m_context.Xmm2 , reg_value.GetBytes (), 16 );
490
+ break ;
491
+ case lldb_xmm3_x86_64:
492
+ memcpy (&m_context.Xmm3 , reg_value.GetBytes (), 16 );
493
+ break ;
494
+ case lldb_xmm4_x86_64:
495
+ memcpy (&m_context.Xmm4 , reg_value.GetBytes (), 16 );
496
+ break ;
497
+ case lldb_xmm5_x86_64:
498
+ memcpy (&m_context.Xmm5 , reg_value.GetBytes (), 16 );
499
+ break ;
500
+ case lldb_xmm6_x86_64:
501
+ memcpy (&m_context.Xmm6 , reg_value.GetBytes (), 16 );
502
+ break ;
503
+ case lldb_xmm7_x86_64:
504
+ memcpy (&m_context.Xmm7 , reg_value.GetBytes (), 16 );
505
+ break ;
506
+ case lldb_xmm8_x86_64:
507
+ memcpy (&m_context.Xmm8 , reg_value.GetBytes (), 16 );
508
+ break ;
509
+ case lldb_xmm9_x86_64:
510
+ memcpy (&m_context.Xmm9 , reg_value.GetBytes (), 16 );
511
+ break ;
512
+ case lldb_xmm10_x86_64:
513
+ memcpy (&m_context.Xmm10 , reg_value.GetBytes (), 16 );
514
+ break ;
515
+ case lldb_xmm11_x86_64:
516
+ memcpy (&m_context.Xmm11 , reg_value.GetBytes (), 16 );
517
+ break ;
518
+ case lldb_xmm12_x86_64:
519
+ memcpy (&m_context.Xmm12 , reg_value.GetBytes (), 16 );
520
+ break ;
521
+ case lldb_xmm13_x86_64:
522
+ memcpy (&m_context.Xmm13 , reg_value.GetBytes (), 16 );
523
+ break ;
524
+ case lldb_xmm14_x86_64:
525
+ memcpy (&m_context.Xmm14 , reg_value.GetBytes (), 16 );
526
+ break ;
527
+ case lldb_xmm15_x86_64:
528
+ memcpy (&m_context.Xmm15 , reg_value.GetBytes (), 16 );
529
+ break ;
368
530
}
369
531
370
532
// Physically update the registers in the target process.
0 commit comments