]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/inf-ptrace.c
[gas/ARM] Remove spurious comments
[thirdparty/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
735f54b4
MK
39#ifdef PT_GET_PROCESS_STATE
40
d83ad864
DB
41/* Target hook for follow_fork. On entry and at return inferior_ptid is
42 the ptid of the followed inferior. */
43
735f54b4 44static int
07107ca6
LM
45inf_ptrace_follow_fork (struct target_ops *ops, int follow_child,
46 int detach_fork)
735f54b4 47{
d83ad864 48 if (!follow_child)
735f54b4 49 {
ebf3aa72
MK
50 struct thread_info *tp = inferior_thread ();
51 pid_t child_pid = ptid_get_pid (tp->pending_follow.value.related_pid);
191c4426 52
b242c3c2
PA
53 /* Breakpoints have already been detached from the child by
54 infrun.c. */
735f54b4 55
d83ad864 56 if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
735f54b4
MK
57 perror_with_name (("ptrace"));
58 }
59
60 return 0;
61}
62
e85e8e5e
MK
63static int
64inf_ptrace_insert_fork_catchpoint (struct target_ops *self, int pid)
65{
66 return 0;
67}
68
69static int
70inf_ptrace_remove_fork_catchpoint (struct target_ops *self, int pid)
71{
72 return 0;
73}
74
735f54b4
MK
75#endif /* PT_GET_PROCESS_STATE */
76\f
77
4b8a1a28 78/* Prepare to be traced. */
5bf970f9
AC
79
80static void
c7c14b96 81inf_ptrace_me (void)
5bf970f9 82{
c7c14b96 83 /* "Trace me, Dr. Memory!" */
0db8980c
SDJ
84 if (ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3) 0, 0) < 0)
85 trace_start_error_with_name ("ptrace");
5bf970f9
AC
86}
87
136d6dae
VP
88/* Start a new inferior Unix child process. EXEC_FILE is the file to
89 run, ALLARGS is a string containing the arguments to the program.
90 ENV is the environment vector to pass. If FROM_TTY is non-zero, be
91 chatty about it. */
5bf970f9
AC
92
93static void
136d6dae 94inf_ptrace_create_inferior (struct target_ops *ops,
7c5ded6a
SDJ
95 const char *exec_file, const std::string &allargs,
96 char **env, int from_tty)
5bf970f9 97{
2090129c
SDJ
98 pid_t pid;
99 ptid_t ptid;
136d6dae 100
c0edd9ed
JK
101 /* Do not change either targets above or the same target if already present.
102 The reason is the target stack is shared across multiple inferiors. */
103 int ops_already_pushed = target_is_pushed (ops);
25f43500 104 struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
c0edd9ed
JK
105
106 if (! ops_already_pushed)
107 {
108 /* Clear possible core file with its process_stratum. */
109 push_target (ops);
25f43500 110 make_cleanup_unpush_target (ops);
c0edd9ed
JK
111 }
112
136d6dae 113 pid = fork_inferior (exec_file, allargs, env, inf_ptrace_me, NULL,
e69860f1 114 NULL, NULL, NULL);
136d6dae 115
2090129c
SDJ
116 ptid = pid_to_ptid (pid);
117 /* We have something that executes now. We'll be running through
118 the shell at this point (if startup-with-shell is true), but the
119 pid shouldn't change. */
120 add_thread_silent (ptid);
121
25f43500 122 discard_cleanups (back_to);
5bf970f9 123
2090129c 124 gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED);
c7c14b96
MK
125
126 /* On some targets, there must be some explicit actions taken after
127 the inferior has been started up. */
2090129c 128 target_post_startup_inferior (ptid);
5bf970f9
AC
129}
130
e4ef629d
MK
131#ifdef PT_GET_PROCESS_STATE
132
133static void
2e97a79e 134inf_ptrace_post_startup_inferior (struct target_ops *self, ptid_t pid)
e4ef629d
MK
135{
136 ptrace_event_t pe;
137
138 /* Set the initial event mask. */
139 memset (&pe, 0, sizeof pe);
140 pe.pe_set_event |= PTRACE_FORK;
141 if (ptrace (PT_SET_EVENT_MASK, ptid_get_pid (pid),
142 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
143 perror_with_name (("ptrace"));
144}
145
146#endif
147
4b8a1a28
MK
148/* Clean up a rotting corpse of an inferior after it died. */
149
c7c14b96 150static void
136d6dae 151inf_ptrace_mourn_inferior (struct target_ops *ops)
5bf970f9 152{
4b8a1a28
MK
153 int status;
154
155 /* Wait just one more time to collect the inferior's exit status.
f010475d 156 Do not check whether this succeeds though, since we may be
4b8a1a28 157 dealing with a process that we attached to. Such a process will
3d450bdd 158 only report its exit status to its original parent. */
4b8a1a28
MK
159 waitpid (ptid_get_pid (inferior_ptid), &status, 0);
160
c1ee2fb3 161 inf_child_mourn_inferior (ops);
5bf970f9
AC
162}
163
4b8a1a28
MK
164/* Attach to the process specified by ARGS. If FROM_TTY is non-zero,
165 be chatty about it. */
5bf970f9
AC
166
167static void
c0939df1 168inf_ptrace_attach (struct target_ops *ops, const char *args, int from_tty)
5bf970f9
AC
169{
170 char *exec_file;
4b8a1a28 171 pid_t pid;
181e7f93 172 struct inferior *inf;
5bf970f9 173
c0edd9ed
JK
174 /* Do not change either targets above or the same target if already present.
175 The reason is the target stack is shared across multiple inferiors. */
176 int ops_already_pushed = target_is_pushed (ops);
25f43500 177 struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
c0edd9ed 178
74164c56 179 pid = parse_pid_to_attach (args);
5bf970f9 180
f6ffd89b 181 if (pid == getpid ()) /* Trying to masturbate? */
8a3fe4f8 182 error (_("I refuse to debug myself!"));
5bf970f9 183
c0edd9ed
JK
184 if (! ops_already_pushed)
185 {
186 /* target_pid_to_str already uses the target. Also clear possible core
187 file with its process_stratum. */
188 push_target (ops);
25f43500 189 make_cleanup_unpush_target (ops);
c0edd9ed
JK
190 }
191
5bf970f9
AC
192 if (from_tty)
193 {
4b8a1a28 194 exec_file = get_exec_file (0);
5bf970f9
AC
195
196 if (exec_file)
a3f17187 197 printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file,
5bf970f9
AC
198 target_pid_to_str (pid_to_ptid (pid)));
199 else
a3f17187 200 printf_unfiltered (_("Attaching to %s\n"),
5bf970f9
AC
201 target_pid_to_str (pid_to_ptid (pid)));
202
203 gdb_flush (gdb_stdout);
204 }
205
6e1e94ea
MK
206#ifdef PT_ATTACH
207 errno = 0;
4b8a1a28 208 ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0);
6e1e94ea 209 if (errno != 0)
e2e0b3e5 210 perror_with_name (("ptrace"));
6e1e94ea 211#else
8a3fe4f8 212 error (_("This system does not support attaching to a process"));
6e1e94ea 213#endif
5bf970f9 214
6c95b8df
PA
215 inf = current_inferior ();
216 inferior_appeared (inf, pid);
181e7f93 217 inf->attach_flag = 1;
6c95b8df 218 inferior_ptid = pid_to_ptid (pid);
7f9f62ba 219
af990527
PA
220 /* Always add a main thread. If some target extends the ptrace
221 target, it should decorate the ptid later with more info. */
222 add_thread_silent (inferior_ptid);
223
25f43500 224 discard_cleanups (back_to);
5bf970f9
AC
225}
226
e4ef629d
MK
227#ifdef PT_GET_PROCESS_STATE
228
460fac3c 229static void
f045800c 230inf_ptrace_post_attach (struct target_ops *self, int pid)
e4ef629d
MK
231{
232 ptrace_event_t pe;
233
234 /* Set the initial event mask. */
235 memset (&pe, 0, sizeof pe);
236 pe.pe_set_event |= PTRACE_FORK;
237 if (ptrace (PT_SET_EVENT_MASK, pid,
238 (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
239 perror_with_name (("ptrace"));
240}
241
242#endif
243
4b8a1a28 244/* Detach from the inferior, optionally passing it the signal
f010475d 245 specified by ARGS. If FROM_TTY is non-zero, be chatty about it. */
5bf970f9
AC
246
247static void
52554a0e 248inf_ptrace_detach (struct target_ops *ops, const char *args, int from_tty)
5bf970f9 249{
4b8a1a28 250 pid_t pid = ptid_get_pid (inferior_ptid);
6e1e94ea 251 int sig = 0;
5bf970f9 252
0f48b757 253 target_announce_detach (from_tty);
5bf970f9 254 if (args)
6e1e94ea 255 sig = atoi (args);
5bf970f9 256
6e1e94ea 257#ifdef PT_DETACH
4b8a1a28 258 /* We'd better not have left any breakpoints in the program or it'll
f010475d 259 die when it hits one. Also note that this may only work if we
4b8a1a28
MK
260 previously attached to the inferior. It *might* work if we
261 started the process ourselves. */
6e1e94ea 262 errno = 0;
4b8a1a28 263 ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, sig);
6e1e94ea 264 if (errno != 0)
e2e0b3e5 265 perror_with_name (("ptrace"));
6e1e94ea 266#else
8a3fe4f8 267 error (_("This system does not support detaching from a process"));
6e1e94ea 268#endif
5bf970f9 269
ced2dffb
PA
270 inf_ptrace_detach_success (ops);
271}
272
273/* See inf-ptrace.h. */
274
275void
276inf_ptrace_detach_success (struct target_ops *ops)
277{
278 pid_t pid = ptid_get_pid (inferior_ptid);
279
5bf970f9 280 inferior_ptid = null_ptid;
7f9f62ba 281 detach_inferior (pid);
7a7d3353 282
6a3cb8e8 283 inf_child_maybe_unpush_target (ops);
5bf970f9
AC
284}
285
4b8a1a28
MK
286/* Kill the inferior. */
287
5bf970f9 288static void
7d85a9c0 289inf_ptrace_kill (struct target_ops *ops)
5bf970f9 290{
4b8a1a28 291 pid_t pid = ptid_get_pid (inferior_ptid);
c7c14b96 292 int status;
c7c14b96
MK
293
294 if (pid == 0)
295 return;
296
4b8a1a28
MK
297 ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
298 waitpid (pid, &status, 0);
299
bc1e6c81 300 target_mourn_inferior (inferior_ptid);
5bf970f9
AC
301}
302
bfedc46a 303/* Interrupt the inferior. */
c7c14b96 304
5bf970f9 305static void
bfedc46a 306inf_ptrace_interrupt (struct target_ops *self, ptid_t ptid)
5bf970f9 307{
4b8a1a28
MK
308 /* Send a SIGINT to the process group. This acts just like the user
309 typed a ^C on the controlling terminal. Note that using a
310 negative process number in kill() is a System V-ism. The proper
311 BSD interface is killpg(). However, all modern BSDs support the
312 System V interface too. */
7e1789f5 313 kill (-inferior_process_group (), SIGINT);
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;
bfedc46a 697 t->to_interrupt = inf_ptrace_interrupt;
c7c14b96 698 t->to_xfer_partial = inf_ptrace_xfer_partial;
e8ace1c0
MK
699#if defined (PT_IO) && defined (PIOD_READ_AUXV)
700 t->to_auxv_parse = inf_ptrace_auxv_parse;
701#endif
8785ced0
MK
702
703 return t;
704}
705\f
706
4b8a1a28 707/* Pointer to a function that returns the offset within the user area
8785ced0 708 where a particular register is stored. */
7714d83a 709static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
8785ced0
MK
710
711/* Fetch register REGNUM from the inferior. */
712
713static void
56be3814 714inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
8785ced0 715{
ac7936df 716 struct gdbarch *gdbarch = regcache->arch ();
8785ced0
MK
717 CORE_ADDR addr;
718 size_t size;
719 PTRACE_TYPE_RET *buf;
bcc0c096
SM
720 pid_t pid;
721 int i;
8785ced0 722
7714d83a 723 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 724 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
8d4c1ba3 725 if (addr == (CORE_ADDR)-1
3b3b1423 726 || gdbarch_cannot_fetch_register (gdbarch, regnum))
10d6c8cd 727 {
56be3814 728 regcache_raw_supply (regcache, regnum, NULL);
10d6c8cd
DJ
729 return;
730 }
731
bcc0c096 732 pid = get_ptrace_pid (regcache_get_ptid (regcache));
8785ced0 733
3b3b1423 734 size = register_size (gdbarch, regnum);
8785ced0 735 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
4397c913 736 buf = (PTRACE_TYPE_RET *) alloca (size);
8785ced0 737
10d6c8cd 738 /* Read the register contents from the inferior a chunk at a time. */
8785ced0
MK
739 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
740 {
741 errno = 0;
f7dd0ed7 742 buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
8785ced0 743 if (errno != 0)
4b8a1a28 744 error (_("Couldn't read register %s (#%d): %s."),
3b3b1423 745 gdbarch_register_name (gdbarch, regnum),
c9f4d572 746 regnum, safe_strerror (errno));
8785ced0
MK
747
748 addr += sizeof (PTRACE_TYPE_RET);
749 }
56be3814 750 regcache_raw_supply (regcache, regnum, buf);
8785ced0
MK
751}
752
753/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
754 for all registers. */
755
756static void
28439f5e
PA
757inf_ptrace_fetch_registers (struct target_ops *ops,
758 struct regcache *regcache, int regnum)
8785ced0
MK
759{
760 if (regnum == -1)
3b3b1423 761 for (regnum = 0;
ac7936df 762 regnum < gdbarch_num_regs (regcache->arch ());
3b3b1423 763 regnum++)
56be3814 764 inf_ptrace_fetch_register (regcache, regnum);
8785ced0 765 else
56be3814 766 inf_ptrace_fetch_register (regcache, regnum);
8785ced0
MK
767}
768
769/* Store register REGNUM into the inferior. */
770
771static void
56be3814 772inf_ptrace_store_register (const struct regcache *regcache, int regnum)
8785ced0 773{
ac7936df 774 struct gdbarch *gdbarch = regcache->arch ();
8785ced0
MK
775 CORE_ADDR addr;
776 size_t size;
777 PTRACE_TYPE_RET *buf;
bcc0c096
SM
778 pid_t pid;
779 int i;
8785ced0 780
7714d83a 781 /* This isn't really an address, but ptrace thinks of it as one. */
3b3b1423 782 addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
8d4c1ba3 783 if (addr == (CORE_ADDR)-1
3b3b1423 784 || gdbarch_cannot_store_register (gdbarch, regnum))
10d6c8cd
DJ
785 return;
786
bcc0c096 787 pid = get_ptrace_pid (regcache_get_ptid (regcache));
8785ced0 788
3b3b1423 789 size = register_size (gdbarch, regnum);
8785ced0 790 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
4397c913 791 buf = (PTRACE_TYPE_RET *) alloca (size);
8785ced0 792
10d6c8cd 793 /* Write the register contents into the inferior a chunk at a time. */
56be3814 794 regcache_raw_collect (regcache, regnum, buf);
8785ced0
MK
795 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
796 {
797 errno = 0;
f7dd0ed7 798 ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
8785ced0 799 if (errno != 0)
4b8a1a28 800 error (_("Couldn't write register %s (#%d): %s."),
3b3b1423 801 gdbarch_register_name (gdbarch, regnum),
c9f4d572 802 regnum, safe_strerror (errno));
8785ced0
MK
803
804 addr += sizeof (PTRACE_TYPE_RET);
805 }
806}
807
808/* Store register REGNUM back into the inferior. If REGNUM is -1, do
809 this for all registers. */
810
2c0b251b 811static void
28439f5e
PA
812inf_ptrace_store_registers (struct target_ops *ops,
813 struct regcache *regcache, int regnum)
8785ced0
MK
814{
815 if (regnum == -1)
3b3b1423 816 for (regnum = 0;
ac7936df 817 regnum < gdbarch_num_regs (regcache->arch ());
3b3b1423 818 regnum++)
56be3814 819 inf_ptrace_store_register (regcache, regnum);
8785ced0 820 else
56be3814 821 inf_ptrace_store_register (regcache, regnum);
8785ced0
MK
822}
823
824/* Create a "traditional" ptrace target. REGISTER_U_OFFSET should be
825 a function returning the offset within the user area where a
826 particular register is stored. */
827
828struct target_ops *
7714d83a
UW
829inf_ptrace_trad_target (CORE_ADDR (*register_u_offset)
830 (struct gdbarch *, int, int))
8785ced0
MK
831{
832 struct target_ops *t = inf_ptrace_target();
833
834 gdb_assert (register_u_offset);
835 inf_ptrace_register_u_offset = register_u_offset;
836 t->to_fetch_registers = inf_ptrace_fetch_registers;
837 t->to_store_registers = inf_ptrace_store_registers;
838
5bf970f9
AC
839 return t;
840}