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