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