i386-darwin-nat.c revision 1.1.1.1 1 1.1 christos /* Darwin support for GDB, the GNU debugger.
2 1.1 christos Copyright (C) 1997-2014 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos Contributed by Apple Computer, Inc.
5 1.1 christos
6 1.1 christos This file is part of GDB.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1 christos #include "defs.h"
22 1.1 christos #include "frame.h"
23 1.1 christos #include "inferior.h"
24 1.1 christos #include "target.h"
25 1.1 christos #include "symfile.h"
26 1.1 christos #include "symtab.h"
27 1.1 christos #include "objfiles.h"
28 1.1 christos #include "gdbcmd.h"
29 1.1 christos #include "regcache.h"
30 1.1 christos #include "gdb_assert.h"
31 1.1 christos #include "i386-tdep.h"
32 1.1 christos #include "i387-tdep.h"
33 1.1 christos #include "gdbarch.h"
34 1.1 christos #include "arch-utils.h"
35 1.1 christos #include "gdbcore.h"
36 1.1 christos
37 1.1 christos #include "i386-nat.h"
38 1.1 christos #include "darwin-nat.h"
39 1.1 christos #include "i386-darwin-tdep.h"
40 1.1 christos
41 1.1 christos #ifdef BFD64
42 1.1 christos #include "amd64-nat.h"
43 1.1 christos #include "amd64-tdep.h"
44 1.1 christos #include "amd64-darwin-tdep.h"
45 1.1 christos #endif
46 1.1 christos
47 1.1 christos /* Read register values from the inferior process.
48 1.1 christos If REGNO is -1, do this for all registers.
49 1.1 christos Otherwise, REGNO specifies which register (so we can save time). */
50 1.1 christos static void
51 1.1 christos i386_darwin_fetch_inferior_registers (struct target_ops *ops,
52 1.1 christos struct regcache *regcache, int regno)
53 1.1 christos {
54 1.1 christos thread_t current_thread = ptid_get_tid (inferior_ptid);
55 1.1 christos int fetched = 0;
56 1.1 christos struct gdbarch *gdbarch = get_regcache_arch (regcache);
57 1.1 christos
58 1.1 christos #ifdef BFD64
59 1.1 christos if (gdbarch_ptr_bit (gdbarch) == 64)
60 1.1 christos {
61 1.1 christos if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
62 1.1 christos {
63 1.1 christos x86_thread_state_t gp_regs;
64 1.1 christos unsigned int gp_count = x86_THREAD_STATE_COUNT;
65 1.1 christos kern_return_t ret;
66 1.1 christos
67 1.1 christos ret = thread_get_state
68 1.1 christos (current_thread, x86_THREAD_STATE, (thread_state_t) & gp_regs,
69 1.1 christos &gp_count);
70 1.1 christos if (ret != KERN_SUCCESS)
71 1.1 christos {
72 1.1 christos printf_unfiltered (_("Error calling thread_get_state for "
73 1.1 christos "GP registers for thread 0x%lx\n"),
74 1.1 christos (unsigned long) current_thread);
75 1.1 christos MACH_CHECK_ERROR (ret);
76 1.1 christos }
77 1.1 christos amd64_supply_native_gregset (regcache, &gp_regs.uts, -1);
78 1.1 christos fetched++;
79 1.1 christos }
80 1.1 christos
81 1.1 christos if (regno == -1 || !amd64_native_gregset_supplies_p (gdbarch, regno))
82 1.1 christos {
83 1.1 christos x86_float_state_t fp_regs;
84 1.1 christos unsigned int fp_count = x86_FLOAT_STATE_COUNT;
85 1.1 christos kern_return_t ret;
86 1.1 christos
87 1.1 christos ret = thread_get_state
88 1.1 christos (current_thread, x86_FLOAT_STATE, (thread_state_t) & fp_regs,
89 1.1 christos &fp_count);
90 1.1 christos if (ret != KERN_SUCCESS)
91 1.1 christos {
92 1.1 christos printf_unfiltered (_("Error calling thread_get_state for "
93 1.1 christos "float registers for thread 0x%lx\n"),
94 1.1 christos (unsigned long) current_thread);
95 1.1 christos MACH_CHECK_ERROR (ret);
96 1.1 christos }
97 1.1 christos amd64_supply_fxsave (regcache, -1, &fp_regs.ufs.fs64.__fpu_fcw);
98 1.1 christos fetched++;
99 1.1 christos }
100 1.1 christos }
101 1.1 christos else
102 1.1 christos #endif
103 1.1 christos {
104 1.1 christos if (regno == -1 || regno < I386_NUM_GREGS)
105 1.1 christos {
106 1.1 christos x86_thread_state32_t gp_regs;
107 1.1 christos unsigned int gp_count = x86_THREAD_STATE32_COUNT;
108 1.1 christos kern_return_t ret;
109 1.1 christos int i;
110 1.1 christos
111 1.1 christos ret = thread_get_state
112 1.1 christos (current_thread, x86_THREAD_STATE32, (thread_state_t) &gp_regs,
113 1.1 christos &gp_count);
114 1.1 christos if (ret != KERN_SUCCESS)
115 1.1 christos {
116 1.1 christos printf_unfiltered (_("Error calling thread_get_state for "
117 1.1 christos "GP registers for thread 0x%lx\n"),
118 1.1 christos (unsigned long) current_thread);
119 1.1 christos MACH_CHECK_ERROR (ret);
120 1.1 christos }
121 1.1 christos for (i = 0; i < I386_NUM_GREGS; i++)
122 1.1 christos regcache_raw_supply
123 1.1 christos (regcache, i,
124 1.1 christos (char *)&gp_regs + i386_darwin_thread_state_reg_offset[i]);
125 1.1 christos
126 1.1 christos fetched++;
127 1.1 christos }
128 1.1 christos
129 1.1 christos if (regno == -1
130 1.1 christos || (regno >= I386_ST0_REGNUM && regno < I386_SSE_NUM_REGS))
131 1.1 christos {
132 1.1 christos x86_float_state32_t fp_regs;
133 1.1 christos unsigned int fp_count = x86_FLOAT_STATE32_COUNT;
134 1.1 christos kern_return_t ret;
135 1.1 christos
136 1.1 christos ret = thread_get_state
137 1.1 christos (current_thread, x86_FLOAT_STATE32, (thread_state_t) &fp_regs,
138 1.1 christos &fp_count);
139 1.1 christos if (ret != KERN_SUCCESS)
140 1.1 christos {
141 1.1 christos printf_unfiltered (_("Error calling thread_get_state for "
142 1.1 christos "float registers for thread 0x%lx\n"),
143 1.1 christos (unsigned long) current_thread);
144 1.1 christos MACH_CHECK_ERROR (ret);
145 1.1 christos }
146 1.1 christos i387_supply_fxsave (regcache, -1, &fp_regs.__fpu_fcw);
147 1.1 christos fetched++;
148 1.1 christos }
149 1.1 christos }
150 1.1 christos
151 1.1 christos if (! fetched)
152 1.1 christos {
153 1.1 christos warning (_("unknown register %d"), regno);
154 1.1 christos regcache_raw_supply (regcache, regno, NULL);
155 1.1 christos }
156 1.1 christos }
157 1.1 christos
158 1.1 christos /* Store our register values back into the inferior.
159 1.1 christos If REGNO is -1, do this for all registers.
160 1.1 christos Otherwise, REGNO specifies which register (so we can save time). */
161 1.1 christos
162 1.1 christos static void
163 1.1 christos i386_darwin_store_inferior_registers (struct target_ops *ops,
164 1.1 christos struct regcache *regcache, int regno)
165 1.1 christos {
166 1.1 christos thread_t current_thread = ptid_get_tid (inferior_ptid);
167 1.1 christos struct gdbarch *gdbarch = get_regcache_arch (regcache);
168 1.1 christos
169 1.1 christos #ifdef BFD64
170 1.1 christos if (gdbarch_ptr_bit (gdbarch) == 64)
171 1.1 christos {
172 1.1 christos if (regno == -1 || amd64_native_gregset_supplies_p (gdbarch, regno))
173 1.1 christos {
174 1.1 christos x86_thread_state_t gp_regs;
175 1.1 christos kern_return_t ret;
176 1.1 christos unsigned int gp_count = x86_THREAD_STATE_COUNT;
177 1.1 christos
178 1.1 christos ret = thread_get_state
179 1.1 christos (current_thread, x86_THREAD_STATE, (thread_state_t) &gp_regs,
180 1.1 christos &gp_count);
181 1.1 christos MACH_CHECK_ERROR (ret);
182 1.1 christos gdb_assert (gp_regs.tsh.flavor == x86_THREAD_STATE64);
183 1.1 christos gdb_assert (gp_regs.tsh.count == x86_THREAD_STATE64_COUNT);
184 1.1 christos
185 1.1 christos amd64_collect_native_gregset (regcache, &gp_regs.uts, regno);
186 1.1 christos
187 1.1 christos ret = thread_set_state (current_thread, x86_THREAD_STATE,
188 1.1 christos (thread_state_t) &gp_regs,
189 1.1 christos x86_THREAD_STATE_COUNT);
190 1.1 christos MACH_CHECK_ERROR (ret);
191 1.1 christos }
192 1.1 christos
193 1.1 christos if (regno == -1 || !amd64_native_gregset_supplies_p (gdbarch, regno))
194 1.1 christos {
195 1.1 christos x86_float_state_t fp_regs;
196 1.1 christos kern_return_t ret;
197 1.1 christos unsigned int fp_count = x86_FLOAT_STATE_COUNT;
198 1.1 christos
199 1.1 christos ret = thread_get_state
200 1.1 christos (current_thread, x86_FLOAT_STATE, (thread_state_t) & fp_regs,
201 1.1 christos &fp_count);
202 1.1 christos MACH_CHECK_ERROR (ret);
203 1.1 christos gdb_assert (fp_regs.fsh.flavor == x86_FLOAT_STATE64);
204 1.1 christos gdb_assert (fp_regs.fsh.count == x86_FLOAT_STATE64_COUNT);
205 1.1 christos
206 1.1 christos amd64_collect_fxsave (regcache, regno, &fp_regs.ufs.fs64.__fpu_fcw);
207 1.1 christos
208 1.1 christos ret = thread_set_state (current_thread, x86_FLOAT_STATE,
209 1.1 christos (thread_state_t) & fp_regs,
210 1.1 christos x86_FLOAT_STATE_COUNT);
211 1.1 christos MACH_CHECK_ERROR (ret);
212 1.1 christos }
213 1.1 christos }
214 1.1 christos else
215 1.1 christos #endif
216 1.1 christos {
217 1.1 christos if (regno == -1 || regno < I386_NUM_GREGS)
218 1.1 christos {
219 1.1 christos x86_thread_state32_t gp_regs;
220 1.1 christos kern_return_t ret;
221 1.1 christos unsigned int gp_count = x86_THREAD_STATE32_COUNT;
222 1.1 christos int i;
223 1.1 christos
224 1.1 christos ret = thread_get_state
225 1.1 christos (current_thread, x86_THREAD_STATE32, (thread_state_t) &gp_regs,
226 1.1 christos &gp_count);
227 1.1 christos MACH_CHECK_ERROR (ret);
228 1.1 christos
229 1.1 christos for (i = 0; i < I386_NUM_GREGS; i++)
230 1.1 christos if (regno == -1 || regno == i)
231 1.1 christos regcache_raw_collect
232 1.1 christos (regcache, i,
233 1.1 christos (char *)&gp_regs + i386_darwin_thread_state_reg_offset[i]);
234 1.1 christos
235 1.1 christos ret = thread_set_state (current_thread, x86_THREAD_STATE32,
236 1.1 christos (thread_state_t) &gp_regs,
237 1.1 christos x86_THREAD_STATE32_COUNT);
238 1.1 christos MACH_CHECK_ERROR (ret);
239 1.1 christos }
240 1.1 christos
241 1.1 christos if (regno == -1
242 1.1 christos || (regno >= I386_ST0_REGNUM && regno < I386_SSE_NUM_REGS))
243 1.1 christos {
244 1.1 christos x86_float_state32_t fp_regs;
245 1.1 christos unsigned int fp_count = x86_FLOAT_STATE32_COUNT;
246 1.1 christos kern_return_t ret;
247 1.1 christos
248 1.1 christos ret = thread_get_state
249 1.1 christos (current_thread, x86_FLOAT_STATE32, (thread_state_t) & fp_regs,
250 1.1 christos &fp_count);
251 1.1 christos MACH_CHECK_ERROR (ret);
252 1.1 christos
253 1.1 christos i387_collect_fxsave (regcache, regno, &fp_regs.__fpu_fcw);
254 1.1 christos
255 1.1 christos ret = thread_set_state (current_thread, x86_FLOAT_STATE32,
256 1.1 christos (thread_state_t) &fp_regs,
257 1.1 christos x86_FLOAT_STATE32_COUNT);
258 1.1 christos MACH_CHECK_ERROR (ret);
259 1.1 christos }
260 1.1 christos }
261 1.1 christos }
262 1.1 christos
263 1.1 christos /* Support for debug registers, boosted mostly from i386-linux-nat.c. */
264 1.1 christos
265 1.1 christos static void
266 1.1 christos i386_darwin_dr_set (int regnum, CORE_ADDR value)
267 1.1 christos {
268 1.1 christos int current_pid;
269 1.1 christos thread_t current_thread;
270 1.1 christos x86_debug_state_t dr_regs;
271 1.1 christos kern_return_t ret;
272 1.1 christos unsigned int dr_count;
273 1.1 christos
274 1.1 christos gdb_assert (regnum >= 0 && regnum <= DR_CONTROL);
275 1.1 christos
276 1.1 christos current_thread = ptid_get_tid (inferior_ptid);
277 1.1 christos
278 1.1 christos dr_regs.dsh.flavor = x86_DEBUG_STATE;
279 1.1 christos dr_regs.dsh.count = x86_DEBUG_STATE_COUNT;
280 1.1 christos dr_count = x86_DEBUG_STATE_COUNT;
281 1.1 christos ret = thread_get_state (current_thread, x86_DEBUG_STATE,
282 1.1 christos (thread_state_t) &dr_regs, &dr_count);
283 1.1 christos MACH_CHECK_ERROR (ret);
284 1.1 christos
285 1.1 christos switch (dr_regs.dsh.flavor)
286 1.1 christos {
287 1.1 christos case x86_DEBUG_STATE32:
288 1.1 christos switch (regnum)
289 1.1 christos {
290 1.1 christos case 0:
291 1.1 christos dr_regs.uds.ds32.__dr0 = value;
292 1.1 christos break;
293 1.1 christos case 1:
294 1.1 christos dr_regs.uds.ds32.__dr1 = value;
295 1.1 christos break;
296 1.1 christos case 2:
297 1.1 christos dr_regs.uds.ds32.__dr2 = value;
298 1.1 christos break;
299 1.1 christos case 3:
300 1.1 christos dr_regs.uds.ds32.__dr3 = value;
301 1.1 christos break;
302 1.1 christos case 4:
303 1.1 christos dr_regs.uds.ds32.__dr4 = value;
304 1.1 christos break;
305 1.1 christos case 5:
306 1.1 christos dr_regs.uds.ds32.__dr5 = value;
307 1.1 christos break;
308 1.1 christos case 6:
309 1.1 christos dr_regs.uds.ds32.__dr6 = value;
310 1.1 christos break;
311 1.1 christos case 7:
312 1.1 christos dr_regs.uds.ds32.__dr7 = value;
313 1.1 christos break;
314 1.1 christos }
315 1.1 christos break;
316 1.1 christos #ifdef BFD64
317 1.1 christos case x86_DEBUG_STATE64:
318 1.1 christos switch (regnum)
319 1.1 christos {
320 1.1 christos case 0:
321 1.1 christos dr_regs.uds.ds64.__dr0 = value;
322 1.1 christos break;
323 1.1 christos case 1:
324 1.1 christos dr_regs.uds.ds64.__dr1 = value;
325 1.1 christos break;
326 1.1 christos case 2:
327 1.1 christos dr_regs.uds.ds64.__dr2 = value;
328 1.1 christos break;
329 1.1 christos case 3:
330 1.1 christos dr_regs.uds.ds64.__dr3 = value;
331 1.1 christos break;
332 1.1 christos case 4:
333 1.1 christos dr_regs.uds.ds64.__dr4 = value;
334 1.1 christos break;
335 1.1 christos case 5:
336 1.1 christos dr_regs.uds.ds64.__dr5 = value;
337 1.1 christos break;
338 1.1 christos case 6:
339 1.1 christos dr_regs.uds.ds64.__dr6 = value;
340 1.1 christos break;
341 1.1 christos case 7:
342 1.1 christos dr_regs.uds.ds64.__dr7 = value;
343 1.1 christos break;
344 1.1 christos }
345 1.1 christos break;
346 1.1 christos #endif
347 1.1 christos }
348 1.1 christos
349 1.1 christos ret = thread_set_state (current_thread, dr_regs.dsh.flavor,
350 1.1 christos (thread_state_t) &dr_regs.uds, dr_count);
351 1.1 christos
352 1.1 christos MACH_CHECK_ERROR (ret);
353 1.1 christos }
354 1.1 christos
355 1.1 christos static CORE_ADDR
356 1.1 christos i386_darwin_dr_get (int regnum)
357 1.1 christos {
358 1.1 christos thread_t current_thread;
359 1.1 christos x86_debug_state_t dr_regs;
360 1.1 christos kern_return_t ret;
361 1.1 christos unsigned int dr_count;
362 1.1 christos
363 1.1 christos gdb_assert (regnum >= 0 && regnum <= DR_CONTROL);
364 1.1 christos
365 1.1 christos current_thread = ptid_get_tid (inferior_ptid);
366 1.1 christos
367 1.1 christos dr_regs.dsh.flavor = x86_DEBUG_STATE;
368 1.1 christos dr_regs.dsh.count = x86_DEBUG_STATE_COUNT;
369 1.1 christos dr_count = x86_DEBUG_STATE_COUNT;
370 1.1 christos ret = thread_get_state (current_thread, x86_DEBUG_STATE,
371 1.1 christos (thread_state_t) &dr_regs, &dr_count);
372 1.1 christos MACH_CHECK_ERROR (ret);
373 1.1 christos
374 1.1 christos switch (dr_regs.dsh.flavor)
375 1.1 christos {
376 1.1 christos case x86_DEBUG_STATE32:
377 1.1 christos switch (regnum)
378 1.1 christos {
379 1.1 christos case 0:
380 1.1 christos return dr_regs.uds.ds32.__dr0;
381 1.1 christos case 1:
382 1.1 christos return dr_regs.uds.ds32.__dr1;
383 1.1 christos case 2:
384 1.1 christos return dr_regs.uds.ds32.__dr2;
385 1.1 christos case 3:
386 1.1 christos return dr_regs.uds.ds32.__dr3;
387 1.1 christos case 4:
388 1.1 christos return dr_regs.uds.ds32.__dr4;
389 1.1 christos case 5:
390 1.1 christos return dr_regs.uds.ds32.__dr5;
391 1.1 christos case 6:
392 1.1 christos return dr_regs.uds.ds32.__dr6;
393 1.1 christos case 7:
394 1.1 christos return dr_regs.uds.ds32.__dr7;
395 1.1 christos default:
396 1.1 christos return -1;
397 1.1 christos }
398 1.1 christos break;
399 1.1 christos #ifdef BFD64
400 1.1 christos case x86_DEBUG_STATE64:
401 1.1 christos switch (regnum)
402 1.1 christos {
403 1.1 christos case 0:
404 1.1 christos return dr_regs.uds.ds64.__dr0;
405 1.1 christos case 1:
406 1.1 christos return dr_regs.uds.ds64.__dr1;
407 1.1 christos case 2:
408 1.1 christos return dr_regs.uds.ds64.__dr2;
409 1.1 christos case 3:
410 1.1 christos return dr_regs.uds.ds64.__dr3;
411 1.1 christos case 4:
412 1.1 christos return dr_regs.uds.ds64.__dr4;
413 1.1 christos case 5:
414 1.1 christos return dr_regs.uds.ds64.__dr5;
415 1.1 christos case 6:
416 1.1 christos return dr_regs.uds.ds64.__dr6;
417 1.1 christos case 7:
418 1.1 christos return dr_regs.uds.ds64.__dr7;
419 1.1 christos default:
420 1.1 christos return -1;
421 1.1 christos }
422 1.1 christos break;
423 1.1 christos #endif
424 1.1 christos default:
425 1.1 christos return -1;
426 1.1 christos }
427 1.1 christos }
428 1.1 christos
429 1.1 christos static void
430 1.1 christos i386_darwin_dr_set_control (unsigned long control)
431 1.1 christos {
432 1.1 christos i386_darwin_dr_set (DR_CONTROL, control);
433 1.1 christos }
434 1.1 christos
435 1.1 christos static void
436 1.1 christos i386_darwin_dr_set_addr (int regnum, CORE_ADDR addr)
437 1.1 christos {
438 1.1 christos gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
439 1.1 christos
440 1.1 christos i386_darwin_dr_set (DR_FIRSTADDR + regnum, addr);
441 1.1 christos }
442 1.1 christos
443 1.1 christos static CORE_ADDR
444 1.1 christos i386_darwin_dr_get_addr (int regnum)
445 1.1 christos {
446 1.1 christos return i386_darwin_dr_get (regnum);
447 1.1 christos }
448 1.1 christos
449 1.1 christos static unsigned long
450 1.1 christos i386_darwin_dr_get_status (void)
451 1.1 christos {
452 1.1 christos return i386_darwin_dr_get (DR_STATUS);
453 1.1 christos }
454 1.1 christos
455 1.1 christos static unsigned long
456 1.1 christos i386_darwin_dr_get_control (void)
457 1.1 christos {
458 1.1 christos return i386_darwin_dr_get (DR_CONTROL);
459 1.1 christos }
460 1.1 christos
461 1.1 christos void
462 1.1 christos darwin_check_osabi (darwin_inferior *inf, thread_t thread)
463 1.1 christos {
464 1.1 christos if (gdbarch_osabi (target_gdbarch ()) == GDB_OSABI_UNKNOWN)
465 1.1 christos {
466 1.1 christos /* Attaching to a process. Let's figure out what kind it is. */
467 1.1 christos x86_thread_state_t gp_regs;
468 1.1 christos struct gdbarch_info info;
469 1.1 christos unsigned int gp_count = x86_THREAD_STATE_COUNT;
470 1.1 christos kern_return_t ret;
471 1.1 christos
472 1.1 christos ret = thread_get_state (thread, x86_THREAD_STATE,
473 1.1 christos (thread_state_t) &gp_regs, &gp_count);
474 1.1 christos if (ret != KERN_SUCCESS)
475 1.1 christos {
476 1.1 christos MACH_CHECK_ERROR (ret);
477 1.1 christos return;
478 1.1 christos }
479 1.1 christos
480 1.1 christos gdbarch_info_init (&info);
481 1.1 christos gdbarch_info_fill (&info);
482 1.1 christos info.byte_order = gdbarch_byte_order (target_gdbarch ());
483 1.1 christos info.osabi = GDB_OSABI_DARWIN;
484 1.1 christos if (gp_regs.tsh.flavor == x86_THREAD_STATE64)
485 1.1 christos info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386,
486 1.1 christos bfd_mach_x86_64);
487 1.1 christos else
488 1.1 christos info.bfd_arch_info = bfd_lookup_arch (bfd_arch_i386,
489 1.1 christos bfd_mach_i386_i386);
490 1.1 christos gdbarch_update_p (info);
491 1.1 christos }
492 1.1 christos }
493 1.1 christos
494 1.1 christos #define X86_EFLAGS_T 0x100UL
495 1.1 christos
496 1.1 christos /* Returning from a signal trampoline is done by calling a
497 1.1 christos special system call (sigreturn). This system call
498 1.1 christos restores the registers that were saved when the signal was
499 1.1 christos raised, including %eflags/%rflags. That means that single-stepping
500 1.1 christos won't work. Instead, we'll have to modify the signal context
501 1.1 christos that's about to be restored, and set the trace flag there. */
502 1.1 christos
503 1.1 christos static int
504 1.1 christos i386_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
505 1.1 christos {
506 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
507 1.1 christos static const gdb_byte darwin_syscall[] = { 0xcd, 0x80 }; /* int 0x80 */
508 1.1 christos gdb_byte buf[sizeof (darwin_syscall)];
509 1.1 christos
510 1.1 christos /* Check if PC is at a sigreturn system call. */
511 1.1 christos if (target_read_memory (regs->uts.ts32.__eip, buf, sizeof (buf)) == 0
512 1.1 christos && memcmp (buf, darwin_syscall, sizeof (darwin_syscall)) == 0
513 1.1 christos && regs->uts.ts32.__eax == 0xb8 /* SYS_sigreturn */)
514 1.1 christos {
515 1.1 christos ULONGEST uctx_addr;
516 1.1 christos ULONGEST mctx_addr;
517 1.1 christos ULONGEST flags_addr;
518 1.1 christos unsigned int eflags;
519 1.1 christos
520 1.1 christos uctx_addr = read_memory_unsigned_integer
521 1.1 christos (regs->uts.ts32.__esp + 4, 4, byte_order);
522 1.1 christos mctx_addr = read_memory_unsigned_integer
523 1.1 christos (uctx_addr + 28, 4, byte_order);
524 1.1 christos
525 1.1 christos flags_addr = mctx_addr + 12 + 9 * 4;
526 1.1 christos read_memory (flags_addr, (gdb_byte *) &eflags, 4);
527 1.1 christos eflags |= X86_EFLAGS_T;
528 1.1 christos write_memory (flags_addr, (gdb_byte *) &eflags, 4);
529 1.1 christos
530 1.1 christos return 1;
531 1.1 christos }
532 1.1 christos return 0;
533 1.1 christos }
534 1.1 christos
535 1.1 christos #ifdef BFD64
536 1.1 christos static int
537 1.1 christos amd64_darwin_sstep_at_sigreturn (x86_thread_state_t *regs)
538 1.1 christos {
539 1.1 christos enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
540 1.1 christos static const gdb_byte darwin_syscall[] = { 0x0f, 0x05 }; /* syscall */
541 1.1 christos gdb_byte buf[sizeof (darwin_syscall)];
542 1.1 christos
543 1.1 christos /* Check if PC is at a sigreturn system call. */
544 1.1 christos if (target_read_memory (regs->uts.ts64.__rip, buf, sizeof (buf)) == 0
545 1.1 christos && memcmp (buf, darwin_syscall, sizeof (darwin_syscall)) == 0
546 1.1 christos && (regs->uts.ts64.__rax & 0xffffffff) == 0x20000b8 /* SYS_sigreturn */)
547 1.1 christos {
548 1.1 christos ULONGEST mctx_addr;
549 1.1 christos ULONGEST flags_addr;
550 1.1 christos unsigned int rflags;
551 1.1 christos
552 1.1 christos mctx_addr = read_memory_unsigned_integer
553 1.1 christos (regs->uts.ts64.__rdi + 48, 8, byte_order);
554 1.1 christos flags_addr = mctx_addr + 16 + 17 * 8;
555 1.1 christos
556 1.1 christos /* AMD64 is little endian. */
557 1.1 christos read_memory (flags_addr, (gdb_byte *) &rflags, 4);
558 1.1 christos rflags |= X86_EFLAGS_T;
559 1.1 christos write_memory (flags_addr, (gdb_byte *) &rflags, 4);
560 1.1 christos
561 1.1 christos return 1;
562 1.1 christos }
563 1.1 christos return 0;
564 1.1 christos }
565 1.1 christos #endif
566 1.1 christos
567 1.1 christos void
568 1.1 christos darwin_set_sstep (thread_t thread, int enable)
569 1.1 christos {
570 1.1 christos x86_thread_state_t regs;
571 1.1 christos unsigned int count = x86_THREAD_STATE_COUNT;
572 1.1 christos kern_return_t kret;
573 1.1 christos
574 1.1 christos kret = thread_get_state (thread, x86_THREAD_STATE,
575 1.1 christos (thread_state_t) ®s, &count);
576 1.1 christos if (kret != KERN_SUCCESS)
577 1.1 christos {
578 1.1 christos printf_unfiltered (_("darwin_set_sstep: error %x, thread=%x\n"),
579 1.1 christos kret, thread);
580 1.1 christos return;
581 1.1 christos }
582 1.1 christos
583 1.1 christos switch (regs.tsh.flavor)
584 1.1 christos {
585 1.1 christos case x86_THREAD_STATE32:
586 1.1 christos {
587 1.1 christos __uint32_t bit = enable ? X86_EFLAGS_T : 0;
588 1.1 christos
589 1.1 christos if (enable && i386_darwin_sstep_at_sigreturn (®s))
590 1.1 christos return;
591 1.1 christos if ((regs.uts.ts32.__eflags & X86_EFLAGS_T) == bit)
592 1.1 christos return;
593 1.1 christos regs.uts.ts32.__eflags
594 1.1 christos = (regs.uts.ts32.__eflags & ~X86_EFLAGS_T) | bit;
595 1.1 christos kret = thread_set_state (thread, x86_THREAD_STATE,
596 1.1 christos (thread_state_t) ®s, count);
597 1.1 christos MACH_CHECK_ERROR (kret);
598 1.1 christos }
599 1.1 christos break;
600 1.1 christos #ifdef BFD64
601 1.1 christos case x86_THREAD_STATE64:
602 1.1 christos {
603 1.1 christos __uint64_t bit = enable ? X86_EFLAGS_T : 0;
604 1.1 christos
605 1.1 christos if (enable && amd64_darwin_sstep_at_sigreturn (®s))
606 1.1 christos return;
607 1.1 christos if ((regs.uts.ts64.__rflags & X86_EFLAGS_T) == bit)
608 1.1 christos return;
609 1.1 christos regs.uts.ts64.__rflags
610 1.1 christos = (regs.uts.ts64.__rflags & ~X86_EFLAGS_T) | bit;
611 1.1 christos kret = thread_set_state (thread, x86_THREAD_STATE,
612 1.1 christos (thread_state_t) ®s, count);
613 1.1 christos MACH_CHECK_ERROR (kret);
614 1.1 christos }
615 1.1 christos break;
616 1.1 christos #endif
617 1.1 christos default:
618 1.1 christos error (_("darwin_set_sstep: unknown flavour: %d"), regs.tsh.flavor);
619 1.1 christos }
620 1.1 christos }
621 1.1 christos
622 1.1 christos void
623 1.1 christos darwin_complete_target (struct target_ops *target)
624 1.1 christos {
625 1.1 christos #ifdef BFD64
626 1.1 christos amd64_native_gregset64_reg_offset = amd64_darwin_thread_state_reg_offset;
627 1.1 christos amd64_native_gregset64_num_regs = amd64_darwin_thread_state_num_regs;
628 1.1 christos amd64_native_gregset32_reg_offset = i386_darwin_thread_state_reg_offset;
629 1.1 christos amd64_native_gregset32_num_regs = i386_darwin_thread_state_num_regs;
630 1.1 christos #endif
631 1.1 christos
632 1.1 christos i386_use_watchpoints (target);
633 1.1 christos
634 1.1 christos i386_dr_low.set_control = i386_darwin_dr_set_control;
635 1.1 christos i386_dr_low.set_addr = i386_darwin_dr_set_addr;
636 1.1 christos i386_dr_low.get_addr = i386_darwin_dr_get_addr;
637 1.1 christos i386_dr_low.get_status = i386_darwin_dr_get_status;
638 1.1 christos i386_dr_low.get_control = i386_darwin_dr_get_control;
639 1.1 christos
640 1.1 christos /* Let's assume that the kernel is 64 bits iff the executable is. */
641 1.1 christos #ifdef __x86_64__
642 1.1 christos i386_set_debug_register_length (8);
643 1.1 christos #else
644 1.1 christos i386_set_debug_register_length (4);
645 1.1 christos #endif
646 1.1 christos
647 1.1 christos target->to_fetch_registers = i386_darwin_fetch_inferior_registers;
648 1.1 christos target->to_store_registers = i386_darwin_store_inferior_registers;
649 1.1 christos }
650