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