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