@@ -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 ? __x86_64_THREAD_FULL_STATE
216
+ : __x86_64_THREAD_STATE,
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"
@@ -461,9 +480,11 @@ kern_return_t DNBArchImplX86_64::SetGPRState() {
461
480
462
481
m_state.SetError (e_regSetGPR, Write,
463
482
::thread_set_state (m_thread->MachPortNumber (),
464
- __x86_64_THREAD_STATE,
483
+ m_state.hasFullGPRState ? __x86_64_THREAD_FULL_STATE
484
+ : __x86_64_THREAD_STATE,
465
485
(thread_state_t )&m_state.context.gpr,
466
- e_regSetWordSizeGPR));
486
+ m_state.hasFullGPRState ? e_regSetWordSizeGPRFull
487
+ : e_regSetWordSizeGPR));
467
488
DNBLogThreadedIf (
468
489
LOG_THREAD,
469
490
" ::thread_set_state (0x%4.4x, %u, &gpr, %u) => 0x%8.8x"
@@ -1157,6 +1178,10 @@ enum {
1157
1178
gpr_cs,
1158
1179
gpr_fs,
1159
1180
gpr_gs,
1181
+ gpr_ds,
1182
+ gpr_es,
1183
+ gpr_ss,
1184
+ gpr_gsbase,
1160
1185
gpr_eax,
1161
1186
gpr_ebx,
1162
1187
gpr_ecx,
@@ -1543,6 +1568,7 @@ enum debugserver_regnums {
1543
1568
debugserver_k5 = 123 ,
1544
1569
debugserver_k6 = 124 ,
1545
1570
debugserver_k7 = 125 ,
1571
+ debugserver_gsbase = 126 ,
1546
1572
};
1547
1573
1548
1574
#define GPR_OFFSET (reg ) (offsetof(DNBArchImplX86_64::GPR, __##reg))
@@ -1690,6 +1716,10 @@ const DNBRegisterInfo DNBArchImplX86_64::g_gpr_registers[] = {
1690
1716
DEFINE_GPR_ALT2 (cs, NULL ),
1691
1717
DEFINE_GPR_ALT2 (fs, NULL ),
1692
1718
DEFINE_GPR_ALT2 (gs, NULL ),
1719
+ DEFINE_GPR_ALT2 (ds, NULL ),
1720
+ DEFINE_GPR_ALT2 (es, NULL ),
1721
+ DEFINE_GPR_ALT2 (ss, NULL ),
1722
+ DEFINE_GPR_ALT2 (gsbase, NULL ),
1693
1723
DEFINE_GPR_PSEUDO_32 (eax, rax),
1694
1724
DEFINE_GPR_PSEUDO_32 (ebx, rbx),
1695
1725
DEFINE_GPR_PSEUDO_32 (ecx, rcx),
@@ -2313,6 +2343,8 @@ bool DNBArchImplX86_64::GetRegisterValue(uint32_t set, uint32_t reg,
2313
2343
value->info = *regInfo;
2314
2344
switch (set) {
2315
2345
case e_regSetGPR:
2346
+ if (reg > gpr_gs && !m_state.hasFullGPRState )
2347
+ return false ;
2316
2348
if (reg < k_num_gpr_registers) {
2317
2349
value->value .uint64 = ((uint64_t *)(&m_state.context .gpr ))[reg];
2318
2350
return true ;
@@ -2524,6 +2556,8 @@ bool DNBArchImplX86_64::SetRegisterValue(uint32_t set, uint32_t reg,
2524
2556
if (regInfo) {
2525
2557
switch (set) {
2526
2558
case e_regSetGPR:
2559
+ if (reg > gpr_gs && !m_state.hasFullGPRState )
2560
+ return false ;
2527
2561
if (reg < k_num_gpr_registers) {
2528
2562
((uint64_t *)(&m_state.context .gpr ))[reg] = value->value .uint64 ;
2529
2563
success = true ;
0 commit comments