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