OSDN Git Service

* target.h (TARGET_WNOHANG): New.
[pf3gnuchains/pf3gnuchains3x.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, int options)
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 }