@@ -182,22 +182,39 @@ kern_return_t DNBArchImplX86_64::GetGPRState(bool force) {
182
182
m_state.context .gpr .__gs = (' g' << 8 ) + ' s' ;
183
183
m_state.SetError (e_regSetGPR, Read, 0 );
184
184
#else
185
- mach_msg_type_number_t count = e_regSetWordSizeGPR;
185
+ mach_msg_type_number_t count = e_regSetWordSizeGPRFull;
186
+ int flavor = __x86_64_THREAD_FULL_STATE;
186
187
m_state.SetError (
187
188
e_regSetGPR, Read,
188
- ::thread_get_state (m_thread->MachPortNumber (), __x86_64_THREAD_STATE ,
189
+ ::thread_get_state (m_thread->MachPortNumber (), flavor ,
189
190
(thread_state_t )&m_state.context.gpr, &count));
191
+
192
+ if (!m_state.GetError(e_regSetGPR, Read)) {
193
+ m_state.hasFullGPRState = true ;
194
+ } else {
195
+ m_state.hasFullGPRState = false ;
196
+ count = e_regSetWordSizeGPR;
197
+ flavor = __x86_64_THREAD_STATE;
198
+ m_state.SetError (
199
+ e_regSetGPR, Read,
200
+ ::thread_get_state (m_thread->MachPortNumber (), flavor,
201
+ (thread_state_t )&m_state.context.gpr, &count));
202
+ }
190
203
DNBLogThreadedIf (
191
204
LOG_THREAD,
192
- " ::thread_get_state (0x%4.4x, %u, &gpr, %u) => 0x%8.8x"
205
+ " ::thread_get_state (0x%4.4x, %u (%s) , &gpr, %u) => 0x%8.8x"
193
206
" \n\t rax = %16.16llx rbx = %16.16llx rcx = %16.16llx rdx = %16.16llx"
194
207
" \n\t rdi = %16.16llx rsi = %16.16llx rbp = %16.16llx rsp = %16.16llx"
195
208
" \n\t r8 = %16.16llx r9 = %16.16llx r10 = %16.16llx r11 = %16.16llx"
196
209
" \n\t r12 = %16.16llx r13 = %16.16llx r14 = %16.16llx r15 = %16.16llx"
197
210
" \n\t rip = %16.16llx"
198
- " \n\t flg = %16.16llx cs = %16.16llx fs = %16.16llx gs = %16.16llx" ,
199
- m_thread->MachPortNumber (), x86_THREAD_STATE64,
200
- x86_THREAD_STATE64_COUNT, m_state.GetError(e_regSetGPR, Read),
211
+ " \n\t flg = %16.16llx cs = %16.16llx fs = %16.16llx gs = %16.16llx"
212
+ " \n\t ds = %16.16llx es = %16.16llx ss = %16.16llx gsB = %16.16llx" ,
213
+ m_thread->MachPortNumber (), flavor,
214
+ m_state.hasFullGPRState ? "full" : "non-full",
215
+ m_state.hasFullGPRState ? e_regSetWordSizeGPRFull
216
+ : e_regSetWordSizeGPR,
217
+ m_state.GetError(e_regSetGPR, Read),
201
218
m_state.context.gpr.__rax, m_state.context.gpr.__rbx,
202
219
m_state.context.gpr.__rcx, m_state.context.gpr.__rdx,
203
220
m_state.context.gpr.__rdi, m_state.context.gpr.__rsi,
@@ -208,7 +225,9 @@ kern_return_t DNBArchImplX86_64::GetGPRState(bool force) {
208
225
m_state.context.gpr.__r14, m_state.context.gpr.__r15,
209
226
m_state.context.gpr.__rip, m_state.context.gpr.__rflags,
210
227
m_state.context.gpr.__cs, m_state.context.gpr.__fs,
211
- m_state.context.gpr.__gs);
228
+ m_state.context.gpr.__gs, m_state.context.gpr.__ds,
229
+ m_state.context.gpr.__es, m_state.context.gpr.__ss,
230
+ m_state.context.gpr.__gsbase );
212
231
213
232
// DNBLogThreadedIf (LOG_THREAD, "thread_get_state(0x%4.4x, %u, &gpr, %u)
214
233
// => 0x%8.8x"
@@ -459,21 +478,26 @@ kern_return_t DNBArchImplX86_64::SetGPRState() {
459
478
" (SetGPRState() for stop_count = %u)" ,
460
479
m_thread->MachPortNumber (), kret, m_thread->Process ()->StopCount ());
461
480
481
+ mach_msg_type_number_t count =
482
+ m_state.hasFullGPRState ? e_regSetWordSizeGPRFull : e_regSetWordSizeGPR;
483
+ int flavor = m_state.hasFullGPRState ? __x86_64_THREAD_FULL_STATE
484
+ : __x86_64_THREAD_STATE;
462
485
m_state.SetError (e_regSetGPR, Write,
463
- ::thread_set_state (m_thread->MachPortNumber (),
464
- __x86_64_THREAD_STATE,
486
+ ::thread_set_state (m_thread->MachPortNumber (), flavor,
465
487
(thread_state_t )&m_state.context.gpr,
466
- e_regSetWordSizeGPR ));
488
+ count ));
467
489
DNBLogThreadedIf (
468
490
LOG_THREAD,
469
- " ::thread_set_state (0x%4.4x, %u, &gpr, %u) => 0x%8.8x"
491
+ " ::thread_set_state (0x%4.4x, %u (%s) , &gpr, %u) => 0x%8.8x"
470
492
" \n\t rax = %16.16llx rbx = %16.16llx rcx = %16.16llx rdx = %16.16llx"
471
493
" \n\t rdi = %16.16llx rsi = %16.16llx rbp = %16.16llx rsp = %16.16llx"
472
494
" \n\t r8 = %16.16llx r9 = %16.16llx r10 = %16.16llx r11 = %16.16llx"
473
495
" \n\t r12 = %16.16llx r13 = %16.16llx r14 = %16.16llx r15 = %16.16llx"
474
496
" \n\t rip = %16.16llx"
475
- " \n\t flg = %16.16llx cs = %16.16llx fs = %16.16llx gs = %16.16llx" ,
476
- m_thread->MachPortNumber (), __x86_64_THREAD_STATE, e_regSetWordSizeGPR,
497
+ " \n\t flg = %16.16llx cs = %16.16llx fs = %16.16llx gs = %16.16llx"
498
+ " \n\t ds = %16.16llx es = %16.16llx ss = %16.16llx gsB = %16.16llx" ,
499
+ m_thread->MachPortNumber (), flavor,
500
+ m_state.hasFullGPRState ? "full" : "non-full", count,
477
501
m_state.GetError(e_regSetGPR, Write), m_state.context.gpr.__rax,
478
502
m_state.context.gpr.__rbx, m_state.context.gpr.__rcx,
479
503
m_state.context.gpr.__rdx, m_state.context.gpr.__rdi,
@@ -484,7 +508,9 @@ kern_return_t DNBArchImplX86_64::SetGPRState() {
484
508
m_state.context.gpr.__r13, m_state.context.gpr.__r14,
485
509
m_state.context.gpr.__r15, m_state.context.gpr.__rip,
486
510
m_state.context.gpr.__rflags, m_state.context.gpr.__cs,
487
- m_state.context.gpr.__fs, m_state.context.gpr.__gs);
511
+ m_state.context.gpr.__fs, m_state.context.gpr.__gs,
512
+ m_state.context.gpr.__ds, m_state.context.gpr.__es,
513
+ m_state.context.gpr.__ss, m_state.context.gpr.__gsbase);
488
514
return m_state.GetError(e_regSetGPR, Write);
489
515
}
490
516
@@ -1157,6 +1183,10 @@ enum {
1157
1183
gpr_cs,
1158
1184
gpr_fs,
1159
1185
gpr_gs,
1186
+ gpr_ds,
1187
+ gpr_es,
1188
+ gpr_ss,
1189
+ gpr_gsbase,
1160
1190
gpr_eax,
1161
1191
gpr_ebx,
1162
1192
gpr_ecx,
@@ -1543,6 +1573,7 @@ enum debugserver_regnums {
1543
1573
debugserver_k5 = 123 ,
1544
1574
debugserver_k6 = 124 ,
1545
1575
debugserver_k7 = 125 ,
1576
+ debugserver_gsbase = 126 ,
1546
1577
};
1547
1578
1548
1579
#define GPR_OFFSET (reg ) (offsetof(DNBArchImplX86_64::GPR, __##reg))
@@ -1690,6 +1721,10 @@ const DNBRegisterInfo DNBArchImplX86_64::g_gpr_registers[] = {
1690
1721
DEFINE_GPR_ALT2 (cs, NULL ),
1691
1722
DEFINE_GPR_ALT2 (fs, NULL ),
1692
1723
DEFINE_GPR_ALT2 (gs, NULL ),
1724
+ DEFINE_GPR_ALT2 (ds, NULL ),
1725
+ DEFINE_GPR_ALT2 (es, NULL ),
1726
+ DEFINE_GPR_ALT2 (ss, NULL ),
1727
+ DEFINE_GPR_ALT2 (gsbase, NULL ),
1693
1728
DEFINE_GPR_PSEUDO_32 (eax, rax),
1694
1729
DEFINE_GPR_PSEUDO_32 (ebx, rbx),
1695
1730
DEFINE_GPR_PSEUDO_32 (ecx, rcx),
@@ -2313,6 +2348,8 @@ bool DNBArchImplX86_64::GetRegisterValue(uint32_t set, uint32_t reg,
2313
2348
value->info = *regInfo;
2314
2349
switch (set) {
2315
2350
case e_regSetGPR:
2351
+ if (reg > gpr_gs && !m_state.hasFullGPRState )
2352
+ return false ;
2316
2353
if (reg < k_num_gpr_registers) {
2317
2354
value->value .uint64 = ((uint64_t *)(&m_state.context .gpr ))[reg];
2318
2355
return true ;
@@ -2524,6 +2561,8 @@ bool DNBArchImplX86_64::SetRegisterValue(uint32_t set, uint32_t reg,
2524
2561
if (regInfo) {
2525
2562
switch (set) {
2526
2563
case e_regSetGPR:
2564
+ if (reg > gpr_gs && !m_state.hasFullGPRState )
2565
+ return false ;
2527
2566
if (reg < k_num_gpr_registers) {
2528
2567
((uint64_t *)(&m_state.context .gpr ))[reg] = value->value .uint64 ;
2529
2568
success = true ;
0 commit comments