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