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