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