d9f7338616517cef4066e2bf9498ba327e3aa5ca
[deliverable/binutils-gdb.git] / gdb / inf-ptrace.c
1 /* Low-level child interface to ptrace.
2
3 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
4 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
5 Free Software Foundation, Inc.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #include "defs.h"
23 #include "command.h"
24 #include "inferior.h"
25 #include "inflow.h"
26 #include "terminal.h"
27 #include "gdbcore.h"
28 #include "regcache.h"
29
30 #include "gdb_assert.h"
31 #include "gdb_string.h"
32 #include "gdb_ptrace.h"
33 #include "gdb_wait.h"
34 #include <signal.h>
35
36 #include "inf-ptrace.h"
37 #include "inf-child.h"
38 #include "gdbthread.h"
39
40 \f
41
42 #ifdef PT_GET_PROCESS_STATE
43
44 static int
45 inf_ptrace_follow_fork (struct target_ops *ops, int follow_child)
46 {
47 pid_t pid, fpid;
48 ptrace_state_t pe;
49 struct thread_info *last_tp = NULL;
50
51 /* FIXME: kettenis/20050720: This stuff should really be passed as
52 an argument by our caller. */
53 {
54 ptid_t ptid;
55 struct target_waitstatus status;
56
57 get_last_target_status (&ptid, &status);
58 gdb_assert (status.kind == TARGET_WAITKIND_FORKED);
59
60 pid = ptid_get_pid (ptid);
61 last_tp = find_thread_pid (ptid);
62 }
63
64 if (ptrace (PT_GET_PROCESS_STATE, pid,
65 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
66 perror_with_name (("ptrace"));
67
68 gdb_assert (pe.pe_report_event == PTRACE_FORK);
69 fpid = pe.pe_other_pid;
70
71 if (follow_child)
72 {
73 /* Copy user stepping state to the new inferior thread. */
74 struct breakpoint *step_resume_breakpoint = last_tp->step_resume_breakpoint;
75 CORE_ADDR step_range_start = last_tp->step_range_start;
76 CORE_ADDR step_range_end = last_tp->step_range_end;
77 struct frame_id step_frame_id = last_tp->step_frame_id;
78 struct inferior *parent_inf, *child_inf;
79 struct thread_info *tp;
80
81 /* Otherwise, deleting the parent would get rid of this
82 breakpoint. */
83 last_tp->step_resume_breakpoint = NULL;
84
85 parent_inf = find_inferior_pid (pid);
86
87 /* Add the child. */
88 child_inf = add_inferior (fpid);
89 child_inf->attach_flag = parent_inf->attach_flag;
90 copy_terminal_info (child_inf, parent_inf);
91
92 /* Before detaching from the parent, remove all breakpoints from
93 it. */
94 remove_breakpoints ();
95
96 if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
97 perror_with_name (("ptrace"));
98
99 /* Switch inferior_ptid out of the parent's way. */
100 inferior_ptid = pid_to_ptid (fpid);
101
102 /* Delete the parent. */
103 detach_inferior (pid);
104
105 tp = add_thread_silent (inferior_ptid);
106
107 tp->step_resume_breakpoint = step_resume_breakpoint;
108 tp->step_range_start = step_range_start;
109 tp->step_range_end = step_range_end;
110 tp->step_frame_id = step_frame_id;
111
112 /* Reset breakpoints in the child as appropriate. */
113 follow_inferior_reset_breakpoints ();
114 }
115 else
116 {
117 inferior_ptid = pid_to_ptid (pid);
118
119 /* Breakpoints have already been detached from the child by
120 infrun.c. */
121
122 if (ptrace (PT_DETACH, fpid, (PTRACE_TYPE_ARG3)1, 0) == -1)
123 perror_with_name (("ptrace"));
124 detach_inferior (pid);
125 }
126
127 return 0;
128 }
129
130 #endif /* PT_GET_PROCESS_STATE */
131 \f
132
133 /* Prepare to be traced. */
134
135 static void
136 inf_ptrace_me (void)
137 {
138 /* "Trace me, Dr. Memory!" */
139 ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3)0, 0);
140 }
141
142 /* Start a new inferior Unix child process. EXEC_FILE is the file to
143 run, ALLARGS is a string containing the arguments to the program.
144 ENV is the environment vector to pass. If FROM_TTY is non-zero, be
145 chatty about it. */
146
147 static void
148 inf_ptrace_create_inferior (struct target_ops *ops,
149 char *exec_file, char *allargs, char **env,
150 int from_tty)
151 {
152 int pid;
153
154 pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL,
155 NULL, NULL);
156
157 push_target (ops);
158
159 /* On some targets, there must be some explicit synchronization
160 between the parent and child processes after the debugger
161 forks, and before the child execs the debuggee program. This
162 call basically gives permission for the child to exec. */
163
164 target_acknowledge_created_inferior (pid);
165
166 /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
167 be 1 or 2 depending on whether we're starting without or with a
168 shell. */
169 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
170
171 /* On some targets, there must be some explicit actions taken after
172 the inferior has been started up. */
173 target_post_startup_inferior (pid_to_ptid (pid));
174 }
175
176 #ifdef PT_GET_PROCESS_STATE
177
178 static void
179 inf_ptrace_post_startup_inferior (ptid_t pid)
180 {
181 ptrace_event_t pe;
182
183 /* Set the initial event mask. */
184 memset (&pe, 0, sizeof pe);
185 pe.pe_set_event |= PTRACE_FORK;
186 if (ptrace (PT_SET_EVENT_MASK, ptid_get_pid (pid),
187 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
188 perror_with_name (("ptrace"));
189 }
190
191 #endif
192
193 /* Clean up a rotting corpse of an inferior after it died. */
194
195 static void
196 inf_ptrace_mourn_inferior (struct target_ops *ops)
197 {
198 int status;
199
200 /* Wait just one more time to collect the inferior's exit status.
201 Do not check whether this succeeds though, since we may be
202 dealing with a process that we attached to. Such a process will
203 only report its exit status to its original parent. */
204 waitpid (ptid_get_pid (inferior_ptid), &status, 0);
205
206 generic_mourn_inferior ();
207
208 if (!have_inferiors ())
209 unpush_target (ops);
210 }
211
212 /* Attach to the process specified by ARGS. If FROM_TTY is non-zero,
213 be chatty about it. */
214
215 static void
216 inf_ptrace_attach (struct target_ops *ops, char *args, int from_tty)
217 {
218 char *exec_file;
219 pid_t pid;
220 char *dummy;
221 struct inferior *inf;
222
223 if (!args)
224 error_no_arg (_("process-id to attach"));
225
226 dummy = args;
227 pid = strtol (args, &dummy, 0);
228 /* Some targets don't set errno on errors, grrr! */
229 if (pid == 0 && args == dummy)
230 error (_("Illegal process-id: %s."), args);
231
232 if (pid == getpid ()) /* Trying to masturbate? */
233 error (_("I refuse to debug myself!"));
234
235 if (from_tty)
236 {
237 exec_file = get_exec_file (0);
238
239 if (exec_file)
240 printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
241 target_pid_to_str (pid_to_ptid (pid)));
242 else
243 printf_unfiltered (_("Attaching to %s\n"),
244 target_pid_to_str (pid_to_ptid (pid)));
245
246 gdb_flush (gdb_stdout);
247 }
248
249 #ifdef PT_ATTACH
250 errno = 0;
251 ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0);
252 if (errno != 0)
253 perror_with_name (("ptrace"));
254 #else
255 error (_("This system does not support attaching to a process"));
256 #endif
257
258 inferior_ptid = pid_to_ptid (pid);
259
260 inf = add_inferior (pid);
261 inf->attach_flag = 1;
262
263 /* Always add a main thread. If some target extends the ptrace
264 target, it should decorate the ptid later with more info. */
265 add_thread_silent (inferior_ptid);
266
267 push_target(ops);
268 }
269
270 #ifdef PT_GET_PROCESS_STATE
271
272 void
273 inf_ptrace_post_attach (int pid)
274 {
275 ptrace_event_t pe;
276
277 /* Set the initial event mask. */
278 memset (&pe, 0, sizeof pe);
279 pe.pe_set_event |= PTRACE_FORK;
280 if (ptrace (PT_SET_EVENT_MASK, pid,
281 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
282 perror_with_name (("ptrace"));
283 }
284
285 #endif
286
287 /* Detach from the inferior, optionally passing it the signal
288 specified by ARGS. If FROM_TTY is non-zero, be chatty about it. */
289
290 static void
291 inf_ptrace_detach (struct target_ops *ops, char *args, int from_tty)
292 {
293 pid_t pid = ptid_get_pid (inferior_ptid);
294 int sig = 0;
295
296 if (from_tty)
297 {
298 char *exec_file = get_exec_file (0);
299 if (exec_file == 0)
300 exec_file = "";
301 printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file,
302 target_pid_to_str (pid_to_ptid (pid)));
303 gdb_flush (gdb_stdout);
304 }
305 if (args)
306 sig = atoi (args);
307
308 #ifdef PT_DETACH
309 /* We'd better not have left any breakpoints in the program or it'll
310 die when it hits one. Also note that this may only work if we
311 previously attached to the inferior. It *might* work if we
312 started the process ourselves. */
313 errno = 0;
314 ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, sig);
315 if (errno != 0)
316 perror_with_name (("ptrace"));
317 #else
318 error (_("This system does not support detaching from a process"));
319 #endif
320
321 inferior_ptid = null_ptid;
322 detach_inferior (pid);
323
324 if (!have_inferiors ())
325 unpush_target (ops);
326 }
327
328 /* Kill the inferior. */
329
330 static void
331 inf_ptrace_kill (struct target_ops *ops)
332 {
333 pid_t pid = ptid_get_pid (inferior_ptid);
334 int status;
335
336 if (pid == 0)
337 return;
338
339 ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
340 waitpid (pid, &status, 0);
341
342 target_mourn_inferior ();
343 }
344
345 /* Stop the inferior. */
346
347 static void
348 inf_ptrace_stop (ptid_t ptid)
349 {
350 /* Send a SIGINT to the process group. This acts just like the user
351 typed a ^C on the controlling terminal. Note that using a
352 negative process number in kill() is a System V-ism. The proper
353 BSD interface is killpg(). However, all modern BSDs support the
354 System V interface too. */
355 kill (-inferior_process_group (), SIGINT);
356 }
357
358 /* Resume execution of thread PTID, or all threads if PTID is -1. If
359 STEP is nonzero, single-step it. If SIGNAL is nonzero, give it
360 that signal. */
361
362 static void
363 inf_ptrace_resume (struct target_ops *ops,
364 ptid_t ptid, int step, enum target_signal signal)
365 {
366 pid_t pid = ptid_get_pid (ptid);
367 int request = PT_CONTINUE;
368
369 if (pid == -1)
370 /* Resume all threads. Traditionally ptrace() only supports
371 single-threaded processes, so simply resume the inferior. */
372 pid = ptid_get_pid (inferior_ptid);
373
374 if (step)
375 {
376 /* If this system does not support PT_STEP, a higher level
377 function will have called single_step() to transmute the step
378 request into a continue request (by setting breakpoints on
379 all possible successor instructions), so we don't have to
380 worry about that here. */
381 request = PT_STEP;
382 }
383
384 /* An address of (PTRACE_TYPE_ARG3)1 tells ptrace to continue from
385 where it was. If GDB wanted it to start some other way, we have
386 already written a new program counter value to the child. */
387 errno = 0;
388 ptrace (request, pid, (PTRACE_TYPE_ARG3)1, target_signal_to_host (signal));
389 if (errno != 0)
390 perror_with_name (("ptrace"));
391 }
392
393 /* Wait for the child specified by PTID to do something. Return the
394 process ID of the child, or MINUS_ONE_PTID in case of error; store
395 the status in *OURSTATUS. */
396
397 static ptid_t
398 inf_ptrace_wait (struct target_ops *ops,
399 ptid_t ptid, struct target_waitstatus *ourstatus)
400 {
401 pid_t pid;
402 int status, save_errno;
403
404 do
405 {
406 set_sigint_trap ();
407
408 do
409 {
410 pid = waitpid (ptid_get_pid (ptid), &status, 0);
411 save_errno = errno;
412 }
413 while (pid == -1 && errno == EINTR);
414
415 clear_sigint_trap ();
416
417 if (pid == -1)
418 {
419 fprintf_unfiltered (gdb_stderr,
420 _("Child process unexpectedly missing: %s.\n"),
421 safe_strerror (save_errno));
422
423 /* Claim it exited with unknown signal. */
424 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
425 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
426 return inferior_ptid;
427 }
428
429 /* Ignore terminated detached child processes. */
430 if (!WIFSTOPPED (status) && pid != ptid_get_pid (inferior_ptid))
431 pid = -1;
432 }
433 while (pid == -1);
434
435 #ifdef PT_GET_PROCESS_STATE
436 if (WIFSTOPPED (status))
437 {
438 ptrace_state_t pe;
439 pid_t fpid;
440
441 if (ptrace (PT_GET_PROCESS_STATE, pid,
442 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
443 perror_with_name (("ptrace"));
444
445 switch (pe.pe_report_event)
446 {
447 case PTRACE_FORK:
448 ourstatus->kind = TARGET_WAITKIND_FORKED;
449 ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid);
450
451 /* Make sure the other end of the fork is stopped too. */
452 fpid = waitpid (pe.pe_other_pid, &status, 0);
453 if (fpid == -1)
454 perror_with_name (("waitpid"));
455
456 if (ptrace (PT_GET_PROCESS_STATE, fpid,
457 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
458 perror_with_name (("ptrace"));
459
460 gdb_assert (pe.pe_report_event == PTRACE_FORK);
461 gdb_assert (pe.pe_other_pid == pid);
462 if (fpid == ptid_get_pid (inferior_ptid))
463 {
464 ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid);
465 return pid_to_ptid (fpid);
466 }
467
468 return pid_to_ptid (pid);
469 }
470 }
471 #endif
472
473 store_waitstatus (ourstatus, status);
474 return pid_to_ptid (pid);
475 }
476
477 /* Attempt a transfer all LEN bytes starting at OFFSET between the
478 inferior's OBJECT:ANNEX space and GDB's READBUF/WRITEBUF buffer.
479 Return the number of bytes actually transferred. */
480
481 static LONGEST
482 inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
483 const char *annex, gdb_byte *readbuf,
484 const gdb_byte *writebuf,
485 ULONGEST offset, LONGEST len)
486 {
487 pid_t pid = ptid_get_pid (inferior_ptid);
488
489 switch (object)
490 {
491 case TARGET_OBJECT_MEMORY:
492 #ifdef PT_IO
493 /* OpenBSD 3.1, NetBSD 1.6 and FreeBSD 5.0 have a new PT_IO
494 request that promises to be much more efficient in reading
495 and writing data in the traced process's address space. */
496 {
497 struct ptrace_io_desc piod;
498
499 /* NOTE: We assume that there are no distinct address spaces
500 for instruction and data. However, on OpenBSD 3.9 and
501 later, PIOD_WRITE_D doesn't allow changing memory that's
502 mapped read-only. Since most code segments will be
503 read-only, using PIOD_WRITE_D will prevent us from
504 inserting breakpoints, so we use PIOD_WRITE_I instead. */
505 piod.piod_op = writebuf ? PIOD_WRITE_I : PIOD_READ_D;
506 piod.piod_addr = writebuf ? (void *) writebuf : readbuf;
507 piod.piod_offs = (void *) (long) offset;
508 piod.piod_len = len;
509
510 errno = 0;
511 if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
512 /* Return the actual number of bytes read or written. */
513 return piod.piod_len;
514 /* If the PT_IO request is somehow not supported, fallback on
515 using PT_WRITE_D/PT_READ_D. Otherwise we will return zero
516 to indicate failure. */
517 if (errno != EINVAL)
518 return 0;
519 }
520 #endif
521 {
522 union
523 {
524 PTRACE_TYPE_RET word;
525 gdb_byte byte[sizeof (PTRACE_TYPE_RET)];
526 } buffer;
527 ULONGEST rounded_offset;
528 LONGEST partial_len;
529
530 /* Round the start offset down to the next long word
531 boundary. */
532 rounded_offset = offset & -(ULONGEST) sizeof (PTRACE_TYPE_RET);
533
534 /* Since ptrace will transfer a single word starting at that
535 rounded_offset the partial_len needs to be adjusted down to
536 that (remember this function only does a single transfer).
537 Should the required length be even less, adjust it down
538 again. */
539 partial_len = (rounded_offset + sizeof (PTRACE_TYPE_RET)) - offset;
540 if (partial_len > len)
541 partial_len = len;
542
543 if (writebuf)
544 {
545 /* If OFFSET:PARTIAL_LEN is smaller than
546 ROUNDED_OFFSET:WORDSIZE then a read/modify write will
547 be needed. Read in the entire word. */
548 if (rounded_offset < offset
549 || (offset + partial_len
550 < rounded_offset + sizeof (PTRACE_TYPE_RET)))
551 /* Need part of initial word -- fetch it. */
552 buffer.word = ptrace (PT_READ_I, pid,
553 (PTRACE_TYPE_ARG3)(uintptr_t)
554 rounded_offset, 0);
555
556 /* Copy data to be written over corresponding part of
557 buffer. */
558 memcpy (buffer.byte + (offset - rounded_offset),
559 writebuf, partial_len);
560
561 errno = 0;
562 ptrace (PT_WRITE_D, pid,
563 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
564 buffer.word);
565 if (errno)
566 {
567 /* Using the appropriate one (I or D) is necessary for
568 Gould NP1, at least. */
569 errno = 0;
570 ptrace (PT_WRITE_I, pid,
571 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
572 buffer.word);
573 if (errno)
574 return 0;
575 }
576 }
577
578 if (readbuf)
579 {
580 errno = 0;
581 buffer.word = ptrace (PT_READ_I, pid,
582 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
583 0);
584 if (errno)
585 return 0;
586 /* Copy appropriate bytes out of the buffer. */
587 memcpy (readbuf, buffer.byte + (offset - rounded_offset),
588 partial_len);
589 }
590
591 return partial_len;
592 }
593
594 case TARGET_OBJECT_UNWIND_TABLE:
595 return -1;
596
597 case TARGET_OBJECT_AUXV:
598 return -1;
599
600 case TARGET_OBJECT_WCOOKIE:
601 return -1;
602
603 default:
604 return -1;
605 }
606 }
607
608 /* Return non-zero if the thread specified by PTID is alive. */
609
610 static int
611 inf_ptrace_thread_alive (struct target_ops *ops, ptid_t ptid)
612 {
613 /* ??? Is kill the right way to do this? */
614 return (kill (ptid_get_pid (ptid), 0) != -1);
615 }
616
617 /* Print status information about what we're accessing. */
618
619 static void
620 inf_ptrace_files_info (struct target_ops *ignore)
621 {
622 struct inferior *inf = current_inferior ();
623
624 printf_filtered (_("\tUsing the running image of %s %s.\n"),
625 inf->attach_flag ? "attached" : "child",
626 target_pid_to_str (inferior_ptid));
627 }
628
629 static char *
630 inf_ptrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
631 {
632 return normal_pid_to_str (ptid);
633 }
634
635 /* Create a prototype ptrace target. The client can override it with
636 local methods. */
637
638 struct target_ops *
639 inf_ptrace_target (void)
640 {
641 struct target_ops *t = inf_child_target ();
642
643 t->to_attach = inf_ptrace_attach;
644 t->to_detach = inf_ptrace_detach;
645 t->to_resume = inf_ptrace_resume;
646 t->to_wait = inf_ptrace_wait;
647 t->to_files_info = inf_ptrace_files_info;
648 t->to_kill = inf_ptrace_kill;
649 t->to_create_inferior = inf_ptrace_create_inferior;
650 #ifdef PT_GET_PROCESS_STATE
651 t->to_follow_fork = inf_ptrace_follow_fork;
652 t->to_post_startup_inferior = inf_ptrace_post_startup_inferior;
653 t->to_post_attach = inf_ptrace_post_attach;
654 #endif
655 t->to_mourn_inferior = inf_ptrace_mourn_inferior;
656 t->to_thread_alive = inf_ptrace_thread_alive;
657 t->to_pid_to_str = inf_ptrace_pid_to_str;
658 t->to_stop = inf_ptrace_stop;
659 t->to_xfer_partial = inf_ptrace_xfer_partial;
660
661 return t;
662 }
663 \f
664
665 /* Pointer to a function that returns the offset within the user area
666 where a particular register is stored. */
667 static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
668
669 /* Fetch register REGNUM from the inferior. */
670
671 static void
672 inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
673 {
674 struct gdbarch *gdbarch = get_regcache_arch (regcache);
675 CORE_ADDR addr;
676 size_t size;
677 PTRACE_TYPE_RET *buf;
678 int pid, i;
679
680 /* This isn't really an address, but ptrace thinks of it as one. */
681 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
682 if (addr == (CORE_ADDR)-1
683 || gdbarch_cannot_fetch_register (gdbarch, regnum))
684 {
685 regcache_raw_supply (regcache, regnum, NULL);
686 return;
687 }
688
689 /* Cater for systems like GNU/Linux, that implement threads as
690 separate processes. */
691 pid = ptid_get_lwp (inferior_ptid);
692 if (pid == 0)
693 pid = ptid_get_pid (inferior_ptid);
694
695 size = register_size (gdbarch, regnum);
696 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
697 buf = alloca (size);
698
699 /* Read the register contents from the inferior a chunk at a time. */
700 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
701 {
702 errno = 0;
703 buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
704 if (errno != 0)
705 error (_("Couldn't read register %s (#%d): %s."),
706 gdbarch_register_name (gdbarch, regnum),
707 regnum, safe_strerror (errno));
708
709 addr += sizeof (PTRACE_TYPE_RET);
710 }
711 regcache_raw_supply (regcache, regnum, buf);
712 }
713
714 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
715 for all registers. */
716
717 static void
718 inf_ptrace_fetch_registers (struct target_ops *ops,
719 struct regcache *regcache, int regnum)
720 {
721 if (regnum == -1)
722 for (regnum = 0;
723 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
724 regnum++)
725 inf_ptrace_fetch_register (regcache, regnum);
726 else
727 inf_ptrace_fetch_register (regcache, regnum);
728 }
729
730 /* Store register REGNUM into the inferior. */
731
732 static void
733 inf_ptrace_store_register (const struct regcache *regcache, int regnum)
734 {
735 struct gdbarch *gdbarch = get_regcache_arch (regcache);
736 CORE_ADDR addr;
737 size_t size;
738 PTRACE_TYPE_RET *buf;
739 int pid, i;
740
741 /* This isn't really an address, but ptrace thinks of it as one. */
742 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
743 if (addr == (CORE_ADDR)-1
744 || gdbarch_cannot_store_register (gdbarch, regnum))
745 return;
746
747 /* Cater for systems like GNU/Linux, that implement threads as
748 separate processes. */
749 pid = ptid_get_lwp (inferior_ptid);
750 if (pid == 0)
751 pid = ptid_get_pid (inferior_ptid);
752
753 size = register_size (gdbarch, regnum);
754 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
755 buf = alloca (size);
756
757 /* Write the register contents into the inferior a chunk at a time. */
758 regcache_raw_collect (regcache, regnum, buf);
759 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
760 {
761 errno = 0;
762 ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
763 if (errno != 0)
764 error (_("Couldn't write register %s (#%d): %s."),
765 gdbarch_register_name (gdbarch, regnum),
766 regnum, safe_strerror (errno));
767
768 addr += sizeof (PTRACE_TYPE_RET);
769 }
770 }
771
772 /* Store register REGNUM back into the inferior. If REGNUM is -1, do
773 this for all registers. */
774
775 static void
776 inf_ptrace_store_registers (struct target_ops *ops,
777 struct regcache *regcache, int regnum)
778 {
779 if (regnum == -1)
780 for (regnum = 0;
781 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
782 regnum++)
783 inf_ptrace_store_register (regcache, regnum);
784 else
785 inf_ptrace_store_register (regcache, regnum);
786 }
787
788 /* Create a "traditional" ptrace target. REGISTER_U_OFFSET should be
789 a function returning the offset within the user area where a
790 particular register is stored. */
791
792 struct target_ops *
793 inf_ptrace_trad_target (CORE_ADDR (*register_u_offset)
794 (struct gdbarch *, int, int))
795 {
796 struct target_ops *t = inf_ptrace_target();
797
798 gdb_assert (register_u_offset);
799 inf_ptrace_register_u_offset = register_u_offset;
800 t->to_fetch_registers = inf_ptrace_fetch_registers;
801 t->to_store_registers = inf_ptrace_store_registers;
802
803 return t;
804 }
This page took 0.052594 seconds and 4 git commands to generate.