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