daily update
[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 387static ptid_t
117de6a9
PA
388inf_ptrace_wait (struct target_ops *ops,
389 ptid_t ptid, struct target_waitstatus *ourstatus)
5bf970f9 390{
4b8a1a28
MK
391 pid_t pid;
392 int status, save_errno;
5bf970f9 393
c7c14b96
MK
394 do
395 {
4b8a1a28 396 set_sigint_trap ();
5bf970f9 397
4b8a1a28
MK
398 do
399 {
400 pid = waitpid (ptid_get_pid (ptid), &status, 0);
401 save_errno = errno;
402 }
403 while (pid == -1 && errno == EINTR);
5bf970f9 404
c7c14b96 405 clear_sigint_trap ();
5bf970f9 406
c7c14b96
MK
407 if (pid == -1)
408 {
c7c14b96 409 fprintf_unfiltered (gdb_stderr,
4b8a1a28 410 _("Child process unexpectedly missing: %s.\n"),
c7c14b96
MK
411 safe_strerror (save_errno));
412
413 /* Claim it exited with unknown signal. */
414 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
415 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
fb66883a 416 return inferior_ptid;
c7c14b96
MK
417 }
418
4b8a1a28
MK
419 /* Ignore terminated detached child processes. */
420 if (!WIFSTOPPED (status) && pid != ptid_get_pid (inferior_ptid))
421 pid = -1;
c7c14b96 422 }
4b8a1a28 423 while (pid == -1);
c7c14b96 424
735f54b4
MK
425#ifdef PT_GET_PROCESS_STATE
426 if (WIFSTOPPED (status))
427 {
428 ptrace_state_t pe;
429 pid_t fpid;
430
431 if (ptrace (PT_GET_PROCESS_STATE, pid,
432 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
433 perror_with_name (("ptrace"));
434
435 switch (pe.pe_report_event)
436 {
437 case PTRACE_FORK:
438 ourstatus->kind = TARGET_WAITKIND_FORKED;
3a3e9ee3 439 ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid);
735f54b4
MK
440
441 /* Make sure the other end of the fork is stopped too. */
442 fpid = waitpid (pe.pe_other_pid, &status, 0);
443 if (fpid == -1)
444 perror_with_name (("waitpid"));
445
446 if (ptrace (PT_GET_PROCESS_STATE, fpid,
447 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
448 perror_with_name (("ptrace"));
449
450 gdb_assert (pe.pe_report_event == PTRACE_FORK);
451 gdb_assert (pe.pe_other_pid == pid);
452 if (fpid == ptid_get_pid (inferior_ptid))
453 {
3a3e9ee3 454 ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid);
735f54b4
MK
455 return pid_to_ptid (fpid);
456 }
457
458 return pid_to_ptid (pid);
459 }
460 }
461#endif
462
c7c14b96
MK
463 store_waitstatus (ourstatus, status);
464 return pid_to_ptid (pid);
5bf970f9
AC
465}
466
4b8a1a28
MK
467/* Attempt a transfer all LEN bytes starting at OFFSET between the
468 inferior's OBJECT:ANNEX space and GDB's READBUF/WRITEBUF buffer.
469 Return the number of bytes actually transferred. */
5bf970f9
AC
470
471static LONGEST
472inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5
MK
473 const char *annex, gdb_byte *readbuf,
474 const gdb_byte *writebuf,
475 ULONGEST offset, LONGEST len)
5bf970f9 476{
4b8a1a28
MK
477 pid_t pid = ptid_get_pid (inferior_ptid);
478
5bf970f9
AC
479 switch (object)
480 {
481 case TARGET_OBJECT_MEMORY:
f929a579
AC
482#ifdef PT_IO
483 /* OpenBSD 3.1, NetBSD 1.6 and FreeBSD 5.0 have a new PT_IO
484 request that promises to be much more efficient in reading
485 and writing data in the traced process's address space. */
486 {
487 struct ptrace_io_desc piod;
4b8a1a28 488
f929a579 489 /* NOTE: We assume that there are no distinct address spaces
b457b3dd
MK
490 for instruction and data. However, on OpenBSD 3.9 and
491 later, PIOD_WRITE_D doesn't allow changing memory that's
492 mapped read-only. Since most code segments will be
493 read-only, using PIOD_WRITE_D will prevent us from
494 inserting breakpoints, so we use PIOD_WRITE_I instead. */
495 piod.piod_op = writebuf ? PIOD_WRITE_I : PIOD_READ_D;
f929a579
AC
496 piod.piod_addr = writebuf ? (void *) writebuf : readbuf;
497 piod.piod_offs = (void *) (long) offset;
498 piod.piod_len = len;
499
500 errno = 0;
4b8a1a28 501 if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
f929a579
AC
502 /* Return the actual number of bytes read or written. */
503 return piod.piod_len;
504 /* If the PT_IO request is somehow not supported, fallback on
505 using PT_WRITE_D/PT_READ_D. Otherwise we will return zero
506 to indicate failure. */
507 if (errno != EINVAL)
508 return 0;
509 }
510#endif
511 {
512 union
513 {
514 PTRACE_TYPE_RET word;
4b8a1a28 515 gdb_byte byte[sizeof (PTRACE_TYPE_RET)];
f929a579
AC
516 } buffer;
517 ULONGEST rounded_offset;
518 LONGEST partial_len;
4b8a1a28 519
cb85a953
AC
520 /* Round the start offset down to the next long word
521 boundary. */
f929a579 522 rounded_offset = offset & -(ULONGEST) sizeof (PTRACE_TYPE_RET);
4b8a1a28 523
cb85a953
AC
524 /* Since ptrace will transfer a single word starting at that
525 rounded_offset the partial_len needs to be adjusted down to
526 that (remember this function only does a single transfer).
527 Should the required length be even less, adjust it down
528 again. */
529 partial_len = (rounded_offset + sizeof (PTRACE_TYPE_RET)) - offset;
530 if (partial_len > len)
f929a579 531 partial_len = len;
4b8a1a28 532
f929a579
AC
533 if (writebuf)
534 {
cb85a953
AC
535 /* If OFFSET:PARTIAL_LEN is smaller than
536 ROUNDED_OFFSET:WORDSIZE then a read/modify write will
537 be needed. Read in the entire word. */
f929a579 538 if (rounded_offset < offset
cb85a953
AC
539 || (offset + partial_len
540 < rounded_offset + sizeof (PTRACE_TYPE_RET)))
f929a579 541 /* Need part of initial word -- fetch it. */
4b8a1a28 542 buffer.word = ptrace (PT_READ_I, pid,
f7dd0ed7
UW
543 (PTRACE_TYPE_ARG3)(uintptr_t)
544 rounded_offset, 0);
4b8a1a28 545
f929a579
AC
546 /* Copy data to be written over corresponding part of
547 buffer. */
f6ffd89b
MK
548 memcpy (buffer.byte + (offset - rounded_offset),
549 writebuf, partial_len);
4b8a1a28 550
f929a579 551 errno = 0;
4b8a1a28 552 ptrace (PT_WRITE_D, pid,
f7dd0ed7
UW
553 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
554 buffer.word);
f929a579
AC
555 if (errno)
556 {
557 /* Using the appropriate one (I or D) is necessary for
558 Gould NP1, at least. */
559 errno = 0;
4b8a1a28 560 ptrace (PT_WRITE_I, pid,
f7dd0ed7
UW
561 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
562 buffer.word);
f929a579
AC
563 if (errno)
564 return 0;
565 }
566 }
4b8a1a28 567
f929a579
AC
568 if (readbuf)
569 {
570 errno = 0;
4b8a1a28 571 buffer.word = ptrace (PT_READ_I, pid,
f7dd0ed7
UW
572 (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
573 0);
f929a579
AC
574 if (errno)
575 return 0;
576 /* Copy appropriate bytes out of the buffer. */
577 memcpy (readbuf, buffer.byte + (offset - rounded_offset),
578 partial_len);
579 }
4b8a1a28 580
f929a579
AC
581 return partial_len;
582 }
5bf970f9
AC
583
584 case TARGET_OBJECT_UNWIND_TABLE:
585 return -1;
586
587 case TARGET_OBJECT_AUXV:
588 return -1;
589
590 case TARGET_OBJECT_WCOOKIE:
591 return -1;
592
593 default:
594 return -1;
595 }
596}
597
4b8a1a28 598/* Return non-zero if the thread specified by PTID is alive. */
c7c14b96
MK
599
600static int
601inf_ptrace_thread_alive (ptid_t ptid)
602{
4b8a1a28
MK
603 /* ??? Is kill the right way to do this? */
604 return (kill (ptid_get_pid (ptid), 0) != -1);
c7c14b96
MK
605}
606
607/* Print status information about what we're accessing. */
608
609static void
610inf_ptrace_files_info (struct target_ops *ignore)
611{
181e7f93
PA
612 struct inferior *inf = current_inferior ();
613
4b8a1a28 614 printf_filtered (_("\tUsing the running image of %s %s.\n"),
181e7f93 615 inf->attach_flag ? "attached" : "child",
4b8a1a28 616 target_pid_to_str (inferior_ptid));
5bf970f9
AC
617}
618
117de6a9
PA
619static char *
620inf_ptrace_pid_to_str (struct target_ops *ops, ptid_t ptid)
621{
622 return normal_pid_to_str (ptid);
623}
624
8785ced0
MK
625/* Create a prototype ptrace target. The client can override it with
626 local methods. */
627
5bf970f9
AC
628struct target_ops *
629inf_ptrace_target (void)
630{
631 struct target_ops *t = inf_child_target ();
8785ced0 632
5bf970f9 633 t->to_attach = inf_ptrace_attach;
5bf970f9
AC
634 t->to_detach = inf_ptrace_detach;
635 t->to_resume = inf_ptrace_resume;
636 t->to_wait = inf_ptrace_wait;
5bf970f9 637 t->to_files_info = inf_ptrace_files_info;
4b8a1a28 638 t->to_kill = inf_ptrace_kill;
5bf970f9 639 t->to_create_inferior = inf_ptrace_create_inferior;
735f54b4
MK
640#ifdef PT_GET_PROCESS_STATE
641 t->to_follow_fork = inf_ptrace_follow_fork;
e4ef629d
MK
642 t->to_post_startup_inferior = inf_ptrace_post_startup_inferior;
643 t->to_post_attach = inf_ptrace_post_attach;
735f54b4 644#endif
5bf970f9 645 t->to_mourn_inferior = inf_ptrace_mourn_inferior;
5bf970f9 646 t->to_thread_alive = inf_ptrace_thread_alive;
117de6a9 647 t->to_pid_to_str = inf_ptrace_pid_to_str;
5bf970f9 648 t->to_stop = inf_ptrace_stop;
c7c14b96 649 t->to_xfer_partial = inf_ptrace_xfer_partial;
8785ced0
MK
650
651 return t;
652}
653\f
654
4b8a1a28 655/* Pointer to a function that returns the offset within the user area
8785ced0 656 where a particular register is stored. */
7714d83a 657static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
8785ced0
MK
658
659/* Fetch register REGNUM from the inferior. */
660
661static void
56be3814 662inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
8785ced0 663{
3b3b1423 664 struct gdbarch *gdbarch = get_regcache_arch (regcache);
8785ced0
MK
665 CORE_ADDR addr;
666 size_t size;
667 PTRACE_TYPE_RET *buf;
668 int pid, i;
669
7714d83a 670 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 671 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
8d4c1ba3 672 if (addr == (CORE_ADDR)-1
3b3b1423 673 || gdbarch_cannot_fetch_register (gdbarch, regnum))
10d6c8cd 674 {
56be3814 675 regcache_raw_supply (regcache, regnum, NULL);
10d6c8cd
DJ
676 return;
677 }
678
8785ced0 679 /* Cater for systems like GNU/Linux, that implement threads as
10d6c8cd 680 separate processes. */
8785ced0
MK
681 pid = ptid_get_lwp (inferior_ptid);
682 if (pid == 0)
683 pid = ptid_get_pid (inferior_ptid);
684
3b3b1423 685 size = register_size (gdbarch, regnum);
8785ced0
MK
686 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
687 buf = alloca (size);
688
10d6c8cd 689 /* Read the register contents from the inferior a chunk at a time. */
8785ced0
MK
690 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
691 {
692 errno = 0;
f7dd0ed7 693 buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
8785ced0 694 if (errno != 0)
4b8a1a28 695 error (_("Couldn't read register %s (#%d): %s."),
3b3b1423 696 gdbarch_register_name (gdbarch, regnum),
c9f4d572 697 regnum, safe_strerror (errno));
8785ced0
MK
698
699 addr += sizeof (PTRACE_TYPE_RET);
700 }
56be3814 701 regcache_raw_supply (regcache, regnum, buf);
8785ced0
MK
702}
703
704/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
705 for all registers. */
706
707static void
56be3814 708inf_ptrace_fetch_registers (struct regcache *regcache, int regnum)
8785ced0
MK
709{
710 if (regnum == -1)
3b3b1423
UW
711 for (regnum = 0;
712 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
713 regnum++)
56be3814 714 inf_ptrace_fetch_register (regcache, regnum);
8785ced0 715 else
56be3814 716 inf_ptrace_fetch_register (regcache, regnum);
8785ced0
MK
717}
718
719/* Store register REGNUM into the inferior. */
720
721static void
56be3814 722inf_ptrace_store_register (const struct regcache *regcache, int regnum)
8785ced0 723{
3b3b1423 724 struct gdbarch *gdbarch = get_regcache_arch (regcache);
8785ced0
MK
725 CORE_ADDR addr;
726 size_t size;
727 PTRACE_TYPE_RET *buf;
728 int pid, i;
729
7714d83a 730 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 731 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
8d4c1ba3 732 if (addr == (CORE_ADDR)-1
3b3b1423 733 || gdbarch_cannot_store_register (gdbarch, regnum))
10d6c8cd
DJ
734 return;
735
8785ced0 736 /* Cater for systems like GNU/Linux, that implement threads as
10d6c8cd 737 separate processes. */
8785ced0
MK
738 pid = ptid_get_lwp (inferior_ptid);
739 if (pid == 0)
740 pid = ptid_get_pid (inferior_ptid);
741
3b3b1423 742 size = register_size (gdbarch, regnum);
8785ced0
MK
743 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
744 buf = alloca (size);
745
10d6c8cd 746 /* Write the register contents into the inferior a chunk at a time. */
56be3814 747 regcache_raw_collect (regcache, regnum, buf);
8785ced0
MK
748 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
749 {
750 errno = 0;
f7dd0ed7 751 ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
8785ced0 752 if (errno != 0)
4b8a1a28 753 error (_("Couldn't write register %s (#%d): %s."),
3b3b1423 754 gdbarch_register_name (gdbarch, regnum),
c9f4d572 755 regnum, safe_strerror (errno));
8785ced0
MK
756
757 addr += sizeof (PTRACE_TYPE_RET);
758 }
759}
760
761/* Store register REGNUM back into the inferior. If REGNUM is -1, do
762 this for all registers. */
763
764void
56be3814 765inf_ptrace_store_registers (struct regcache *regcache, int regnum)
8785ced0
MK
766{
767 if (regnum == -1)
3b3b1423
UW
768 for (regnum = 0;
769 regnum < gdbarch_num_regs (get_regcache_arch (regcache));
770 regnum++)
56be3814 771 inf_ptrace_store_register (regcache, regnum);
8785ced0 772 else
56be3814 773 inf_ptrace_store_register (regcache, regnum);
8785ced0
MK
774}
775
776/* Create a "traditional" ptrace target. REGISTER_U_OFFSET should be
777 a function returning the offset within the user area where a
778 particular register is stored. */
779
780struct target_ops *
7714d83a
UW
781inf_ptrace_trad_target (CORE_ADDR (*register_u_offset)
782 (struct gdbarch *, int, int))
8785ced0
MK
783{
784 struct target_ops *t = inf_ptrace_target();
785
786 gdb_assert (register_u_offset);
787 inf_ptrace_register_u_offset = register_u_offset;
788 t->to_fetch_registers = inf_ptrace_fetch_registers;
789 t->to_store_registers = inf_ptrace_store_registers;
790
5bf970f9
AC
791 return t;
792}
This page took 0.418895 seconds and 4 git commands to generate.