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