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