* top.c (print_gdb_version): Update copyright year.
[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,
9b254dd1 4 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
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;
735f54b4 76
4e1c45ea
PA
77 struct thread_info *tp;
78
79 /* Otherwise, deleting the parent would get rid of this
80 breakpoint. */
81 last_tp->step_resume_breakpoint = NULL;
82
83 /* Before detaching from the parent, remove all breakpoints from
84 it. */
85 detach_breakpoints (pid);
735f54b4
MK
86
87 if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
88 perror_with_name (("ptrace"));
4e1c45ea 89
7f9f62ba
PA
90 /* Switch inferior_ptid out of the parent's way. */
91 inferior_ptid = pid_to_ptid (fpid);
92
4e1c45ea 93 /* Delete the parent. */
7f9f62ba 94 detach_inferior (pid);
4e1c45ea
PA
95
96 /* Add the child. */
7f9f62ba 97 add_inferior (fpid);
4e1c45ea
PA
98 tp = add_thread_silent (inferior_ptid);
99
100 tp->step_resume_breakpoint = step_resume_breakpoint;
101 tp->step_range_start = step_range_start;
102 tp->step_range_end = step_range_end;
103 tp->step_frame_id = step_frame_id;
104
105 /* Reset breakpoints in the child as appropriate. */
106 follow_inferior_reset_breakpoints ();
735f54b4
MK
107 }
108 else
109 {
110 inferior_ptid = pid_to_ptid (pid);
111 detach_breakpoints (fpid);
112
113 if (ptrace (PT_DETACH, fpid, (PTRACE_TYPE_ARG3)1, 0) == -1)
114 perror_with_name (("ptrace"));
7f9f62ba 115 detach_inferior (pid);
735f54b4
MK
116 }
117
118 return 0;
119}
120
121#endif /* PT_GET_PROCESS_STATE */
122\f
123
4b8a1a28 124/* Prepare to be traced. */
5bf970f9
AC
125
126static void
c7c14b96 127inf_ptrace_me (void)
5bf970f9 128{
c7c14b96 129 /* "Trace me, Dr. Memory!" */
4b8a1a28 130 ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3)0, 0);
5bf970f9
AC
131}
132
136d6dae
VP
133/* Start a new inferior Unix child process. EXEC_FILE is the file to
134 run, ALLARGS is a string containing the arguments to the program.
135 ENV is the environment vector to pass. If FROM_TTY is non-zero, be
136 chatty about it. */
5bf970f9
AC
137
138static void
136d6dae
VP
139inf_ptrace_create_inferior (struct target_ops *ops,
140 char *exec_file, char *allargs, char **env,
141 int from_tty)
5bf970f9 142{
136d6dae
VP
143 int pid;
144
145 pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL,
146 NULL, NULL);
147
148 push_target (ops);
5bf970f9 149
c7c14b96
MK
150 /* On some targets, there must be some explicit synchronization
151 between the parent and child processes after the debugger
152 forks, and before the child execs the debuggee program. This
153 call basically gives permission for the child to exec. */
5bf970f9 154
c7c14b96 155 target_acknowledge_created_inferior (pid);
5bf970f9 156
c7c14b96
MK
157 /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h, and will
158 be 1 or 2 depending on whether we're starting without or with a
159 shell. */
160 startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
161
162 /* On some targets, there must be some explicit actions taken after
163 the inferior has been started up. */
164 target_post_startup_inferior (pid_to_ptid (pid));
5bf970f9
AC
165}
166
e4ef629d
MK
167#ifdef PT_GET_PROCESS_STATE
168
169static void
170inf_ptrace_post_startup_inferior (ptid_t pid)
171{
172 ptrace_event_t pe;
173
174 /* Set the initial event mask. */
175 memset (&pe, 0, sizeof pe);
176 pe.pe_set_event |= PTRACE_FORK;
177 if (ptrace (PT_SET_EVENT_MASK, ptid_get_pid (pid),
178 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
179 perror_with_name (("ptrace"));
180}
181
182#endif
183
4b8a1a28
MK
184/* Clean up a rotting corpse of an inferior after it died. */
185
c7c14b96 186static void
136d6dae 187inf_ptrace_mourn_inferior (struct target_ops *ops)
5bf970f9 188{
4b8a1a28
MK
189 int status;
190
191 /* Wait just one more time to collect the inferior's exit status.
f010475d 192 Do not check whether this succeeds though, since we may be
4b8a1a28 193 dealing with a process that we attached to. Such a process will
3d450bdd 194 only report its exit status to its original parent. */
4b8a1a28
MK
195 waitpid (ptid_get_pid (inferior_ptid), &status, 0);
196
136d6dae 197 unpush_target (ops);
c7c14b96 198 generic_mourn_inferior ();
5bf970f9
AC
199}
200
4b8a1a28
MK
201/* Attach to the process specified by ARGS. If FROM_TTY is non-zero,
202 be chatty about it. */
5bf970f9
AC
203
204static void
136d6dae 205inf_ptrace_attach (struct target_ops *ops, char *args, int from_tty)
5bf970f9
AC
206{
207 char *exec_file;
4b8a1a28 208 pid_t pid;
5bf970f9 209 char *dummy;
181e7f93 210 struct inferior *inf;
5bf970f9
AC
211
212 if (!args)
e2e0b3e5 213 error_no_arg (_("process-id to attach"));
5bf970f9
AC
214
215 dummy = args;
216 pid = strtol (args, &dummy, 0);
f6ffd89b 217 /* Some targets don't set errno on errors, grrr! */
6e1e94ea 218 if (pid == 0 && args == dummy)
8a3fe4f8 219 error (_("Illegal process-id: %s."), args);
5bf970f9 220
f6ffd89b 221 if (pid == getpid ()) /* Trying to masturbate? */
8a3fe4f8 222 error (_("I refuse to debug myself!"));
5bf970f9
AC
223
224 if (from_tty)
225 {
4b8a1a28 226 exec_file = get_exec_file (0);
5bf970f9
AC
227
228 if (exec_file)
a3f17187 229 printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
5bf970f9
AC
230 target_pid_to_str (pid_to_ptid (pid)));
231 else
a3f17187 232 printf_unfiltered (_("Attaching to %s\n"),
5bf970f9
AC
233 target_pid_to_str (pid_to_ptid (pid)));
234
235 gdb_flush (gdb_stdout);
236 }
237
6e1e94ea
MK
238#ifdef PT_ATTACH
239 errno = 0;
4b8a1a28 240 ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0);
6e1e94ea 241 if (errno != 0)
e2e0b3e5 242 perror_with_name (("ptrace"));
6e1e94ea 243#else
8a3fe4f8 244 error (_("This system does not support attaching to a process"));
6e1e94ea 245#endif
5bf970f9
AC
246
247 inferior_ptid = pid_to_ptid (pid);
af990527 248
181e7f93
PA
249 inf = add_inferior (pid);
250 inf->attach_flag = 1;
7f9f62ba 251
af990527
PA
252 /* Always add a main thread. If some target extends the ptrace
253 target, it should decorate the ptid later with more info. */
254 add_thread_silent (inferior_ptid);
255
136d6dae 256 push_target(ops);
5bf970f9
AC
257}
258
e4ef629d
MK
259#ifdef PT_GET_PROCESS_STATE
260
261void
262inf_ptrace_post_attach (int pid)
263{
264 ptrace_event_t pe;
265
266 /* Set the initial event mask. */
267 memset (&pe, 0, sizeof pe);
268 pe.pe_set_event |= PTRACE_FORK;
269 if (ptrace (PT_SET_EVENT_MASK, pid,
270 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
271 perror_with_name (("ptrace"));
272}
273
274#endif
275
4b8a1a28 276/* Detach from the inferior, optionally passing it the signal
f010475d 277 specified by ARGS. If FROM_TTY is non-zero, be chatty about it. */
5bf970f9
AC
278
279static void
136d6dae 280inf_ptrace_detach (struct target_ops *ops, char *args, int from_tty)
5bf970f9 281{
4b8a1a28 282 pid_t pid = ptid_get_pid (inferior_ptid);
6e1e94ea 283 int sig = 0;
5bf970f9
AC
284
285 if (from_tty)
286 {
287 char *exec_file = get_exec_file (0);
288 if (exec_file == 0)
289 exec_file = "";
a3f17187 290 printf_unfiltered (_("Detaching from program: %s, %s\n"), exec_file,
5bf970f9
AC
291 target_pid_to_str (pid_to_ptid (pid)));
292 gdb_flush (gdb_stdout);
293 }
294 if (args)
6e1e94ea 295 sig = atoi (args);
5bf970f9 296
6e1e94ea 297#ifdef PT_DETACH
4b8a1a28 298 /* We'd better not have left any breakpoints in the program or it'll
f010475d 299 die when it hits one. Also note that this may only work if we
4b8a1a28
MK
300 previously attached to the inferior. It *might* work if we
301 started the process ourselves. */
6e1e94ea 302 errno = 0;
4b8a1a28 303 ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, sig);
6e1e94ea 304 if (errno != 0)
e2e0b3e5 305 perror_with_name (("ptrace"));
6e1e94ea 306#else
8a3fe4f8 307 error (_("This system does not support detaching from a process"));
6e1e94ea 308#endif
5bf970f9
AC
309
310 inferior_ptid = null_ptid;
7f9f62ba 311 detach_inferior (pid);
7a7d3353
PA
312
313 if (!have_inferiors ())
314 unpush_target (ops);
5bf970f9
AC
315}
316
4b8a1a28
MK
317/* Kill the inferior. */
318
5bf970f9 319static void
4b8a1a28 320inf_ptrace_kill (void)
5bf970f9 321{
4b8a1a28 322 pid_t pid = ptid_get_pid (inferior_ptid);
c7c14b96 323 int status;
c7c14b96
MK
324
325 if (pid == 0)
326 return;
327
4b8a1a28
MK
328 ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
329 waitpid (pid, &status, 0);
330
c7c14b96 331 target_mourn_inferior ();
5bf970f9
AC
332}
333
4b8a1a28 334/* Stop the inferior. */
c7c14b96 335
5bf970f9 336static void
94cc34af 337inf_ptrace_stop (ptid_t ptid)
5bf970f9 338{
4b8a1a28
MK
339 /* Send a SIGINT to the process group. This acts just like the user
340 typed a ^C on the controlling terminal. Note that using a
341 negative process number in kill() is a System V-ism. The proper
342 BSD interface is killpg(). However, all modern BSDs support the
343 System V interface too. */
c7c14b96 344 kill (-inferior_process_group, SIGINT);
5bf970f9
AC
345}
346
4b8a1a28
MK
347/* Resume execution of thread PTID, or all threads if PTID is -1. If
348 STEP is nonzero, single-step it. If SIGNAL is nonzero, give it
349 that signal. */
5bf970f9
AC
350
351static void
c7c14b96 352inf_ptrace_resume (ptid_t ptid, int step, enum target_signal signal)
5bf970f9 353{
4b8a1a28 354 pid_t pid = ptid_get_pid (ptid);
c7c14b96 355 int request = PT_CONTINUE;
c7c14b96
MK
356
357 if (pid == -1)
4b8a1a28
MK
358 /* Resume all threads. Traditionally ptrace() only supports
359 single-threaded processes, so simply resume the inferior. */
360 pid = ptid_get_pid (inferior_ptid);
c7c14b96
MK
361
362 if (step)
363 {
364 /* If this system does not support PT_STEP, a higher level
365 function will have called single_step() to transmute the step
366 request into a continue request (by setting breakpoints on
367 all possible successor instructions), so we don't have to
368 worry about that here. */
369 request = PT_STEP;
370 }
371
372 /* An address of (PTRACE_TYPE_ARG3)1 tells ptrace to continue from
373 where it was. If GDB wanted it to start some other way, we have
4b8a1a28 374 already written a new program counter value to the child. */
c7c14b96 375 errno = 0;
4b8a1a28 376 ptrace (request, pid, (PTRACE_TYPE_ARG3)1, target_signal_to_host (signal));
c7c14b96
MK
377 if (errno != 0)
378 perror_with_name (("ptrace"));
5bf970f9
AC
379}
380
4b8a1a28
MK
381/* Wait for the child specified by PTID to do something. Return the
382 process ID of the child, or MINUS_ONE_PTID in case of error; store
383 the status in *OURSTATUS. */
5bf970f9 384
c7c14b96
MK
385static ptid_t
386inf_ptrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
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
598inf_ptrace_thread_alive (ptid_t ptid)
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
8785ced0
MK
616/* Create a prototype ptrace target. The client can override it with
617 local methods. */
618
5bf970f9
AC
619struct target_ops *
620inf_ptrace_target (void)
621{
622 struct target_ops *t = inf_child_target ();
8785ced0 623
5bf970f9 624 t->to_attach = inf_ptrace_attach;
5bf970f9
AC
625 t->to_detach = inf_ptrace_detach;
626 t->to_resume = inf_ptrace_resume;
627 t->to_wait = inf_ptrace_wait;
5bf970f9 628 t->to_files_info = inf_ptrace_files_info;
4b8a1a28 629 t->to_kill = inf_ptrace_kill;
5bf970f9 630 t->to_create_inferior = inf_ptrace_create_inferior;
735f54b4
MK
631#ifdef PT_GET_PROCESS_STATE
632 t->to_follow_fork = inf_ptrace_follow_fork;
e4ef629d
MK
633 t->to_post_startup_inferior = inf_ptrace_post_startup_inferior;
634 t->to_post_attach = inf_ptrace_post_attach;
735f54b4 635#endif
5bf970f9 636 t->to_mourn_inferior = inf_ptrace_mourn_inferior;
5bf970f9 637 t->to_thread_alive = inf_ptrace_thread_alive;
4b8a1a28 638 t->to_pid_to_str = normal_pid_to_str;
5bf970f9 639 t->to_stop = inf_ptrace_stop;
c7c14b96 640 t->to_xfer_partial = inf_ptrace_xfer_partial;
8785ced0
MK
641
642 return t;
643}
644\f
645
4b8a1a28 646/* Pointer to a function that returns the offset within the user area
8785ced0 647 where a particular register is stored. */
7714d83a 648static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
8785ced0
MK
649
650/* Fetch register REGNUM from the inferior. */
651
652static void
56be3814 653inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
8785ced0 654{
3b3b1423 655 struct gdbarch *gdbarch = get_regcache_arch (regcache);
8785ced0
MK
656 CORE_ADDR addr;
657 size_t size;
658 PTRACE_TYPE_RET *buf;
659 int pid, i;
660
7714d83a 661 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 662 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
8d4c1ba3 663 if (addr == (CORE_ADDR)-1
3b3b1423 664 || gdbarch_cannot_fetch_register (gdbarch, regnum))
10d6c8cd 665 {
56be3814 666 regcache_raw_supply (regcache, regnum, NULL);
10d6c8cd
DJ
667 return;
668 }
669
8785ced0 670 /* Cater for systems like GNU/Linux, that implement threads as
10d6c8cd 671 separate processes. */
8785ced0
MK
672 pid = ptid_get_lwp (inferior_ptid);
673 if (pid == 0)
674 pid = ptid_get_pid (inferior_ptid);
675
3b3b1423 676 size = register_size (gdbarch, regnum);
8785ced0
MK
677 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
678 buf = alloca (size);
679
10d6c8cd 680 /* Read the register contents from the inferior a chunk at a time. */
8785ced0
MK
681 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
682 {
683 errno = 0;
f7dd0ed7 684 buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
8785ced0 685 if (errno != 0)
4b8a1a28 686 error (_("Couldn't read register %s (#%d): %s."),
3b3b1423 687 gdbarch_register_name (gdbarch, regnum),
c9f4d572 688 regnum, safe_strerror (errno));
8785ced0
MK
689
690 addr += sizeof (PTRACE_TYPE_RET);
691 }
56be3814 692 regcache_raw_supply (regcache, regnum, buf);
8785ced0
MK
693}
694
695/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
696 for all registers. */
697
698static void
56be3814 699inf_ptrace_fetch_registers (struct regcache *regcache, int regnum)
8785ced0
MK
700{
701 if (regnum == -1)
3b3b1423
UW
702 for (regnum = 0;
703 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
704 regnum++)
56be3814 705 inf_ptrace_fetch_register (regcache, regnum);
8785ced0 706 else
56be3814 707 inf_ptrace_fetch_register (regcache, regnum);
8785ced0
MK
708}
709
710/* Store register REGNUM into the inferior. */
711
712static void
56be3814 713inf_ptrace_store_register (const struct regcache *regcache, int regnum)
8785ced0 714{
3b3b1423 715 struct gdbarch *gdbarch = get_regcache_arch (regcache);
8785ced0
MK
716 CORE_ADDR addr;
717 size_t size;
718 PTRACE_TYPE_RET *buf;
719 int pid, i;
720
7714d83a 721 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 722 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
8d4c1ba3 723 if (addr == (CORE_ADDR)-1
3b3b1423 724 || gdbarch_cannot_store_register (gdbarch, regnum))
10d6c8cd
DJ
725 return;
726
8785ced0 727 /* Cater for systems like GNU/Linux, that implement threads as
10d6c8cd 728 separate processes. */
8785ced0
MK
729 pid = ptid_get_lwp (inferior_ptid);
730 if (pid == 0)
731 pid = ptid_get_pid (inferior_ptid);
732
3b3b1423 733 size = register_size (gdbarch, regnum);
8785ced0
MK
734 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
735 buf = alloca (size);
736
10d6c8cd 737 /* Write the register contents into the inferior a chunk at a time. */
56be3814 738 regcache_raw_collect (regcache, regnum, buf);
8785ced0
MK
739 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
740 {
741 errno = 0;
f7dd0ed7 742 ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
8785ced0 743 if (errno != 0)
4b8a1a28 744 error (_("Couldn't write register %s (#%d): %s."),
3b3b1423 745 gdbarch_register_name (gdbarch, regnum),
c9f4d572 746 regnum, safe_strerror (errno));
8785ced0
MK
747
748 addr += sizeof (PTRACE_TYPE_RET);
749 }
750}
751
752/* Store register REGNUM back into the inferior. If REGNUM is -1, do
753 this for all registers. */
754
755void
56be3814 756inf_ptrace_store_registers (struct regcache *regcache, int regnum)
8785ced0
MK
757{
758 if (regnum == -1)
3b3b1423
UW
759 for (regnum = 0;
760 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
761 regnum++)
56be3814 762 inf_ptrace_store_register (regcache, regnum);
8785ced0 763 else
56be3814 764 inf_ptrace_store_register (regcache, regnum);
8785ced0
MK
765}
766
767/* Create a "traditional" ptrace target. REGISTER_U_OFFSET should be
768 a function returning the offset within the user area where a
769 particular register is stored. */
770
771struct target_ops *
7714d83a
UW
772inf_ptrace_trad_target (CORE_ADDR (*register_u_offset)
773 (struct gdbarch *, int, int))
8785ced0
MK
774{
775 struct target_ops *t = inf_ptrace_target();
776
777 gdb_assert (register_u_offset);
778 inf_ptrace_register_u_offset = register_u_offset;
779 t->to_fetch_registers = inf_ptrace_fetch_registers;
780 t->to_store_registers = inf_ptrace_store_registers;
781
5bf970f9
AC
782 return t;
783}
This page took 0.357213 seconds and 4 git commands to generate.