2004-09-13 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / infptrace.c
CommitLineData
c906108c 1/* Low level Unix child interface to ptrace, for GDB when running under Unix.
0a65a603 2 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
2689df5a 3 1998, 1999, 2000, 2001, 2002, 2004
c906108c
SS
4 Free Software Foundation, Inc.
5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include "defs.h"
8cbba7c8 24#include "command.h"
c906108c 25#include "frame.h"
8cbba7c8 26#include "gdbcore.h"
c906108c 27#include "inferior.h"
4e052eda 28#include "regcache.h"
8cbba7c8 29#include "target.h"
ed9a39eb 30
8cbba7c8 31#include "gdb_assert.h"
03f2053f 32#include "gdb_wait.h"
8cbba7c8 33#include "gdb_string.h"
c906108c 34
c906108c 35#include <sys/param.h>
4b14d3e4 36#include "gdb_dirent.h"
c906108c
SS
37#include <signal.h>
38#include <sys/ioctl.h>
39
11003ae3 40#include "gdb_ptrace.h"
c906108c 41
c0ccb908 42#ifdef HAVE_SYS_FILE_H
c906108c
SS
43#include <sys/file.h>
44#endif
652fc137 45
c906108c
SS
46#if !defined (FETCH_INFERIOR_REGISTERS)
47#include <sys/user.h> /* Probably need to poke the user structure */
c906108c
SS
48#endif /* !FETCH_INFERIOR_REGISTERS */
49
50#if !defined (CHILD_XFER_MEMORY)
a14ed312 51static void udot_info (char *, int);
c906108c
SS
52#endif
53
a14ed312 54void _initialize_infptrace (void);
c906108c 55\f
c5aa993b 56
c906108c
SS
57/* This function simply calls ptrace with the given arguments.
58 It exists so that all calls to ptrace are isolated in this
59 machine-dependent file. */
60int
f8707cac 61call_ptrace (int request, int pid, PTRACE_ARG3_TYPE addr, int data)
c906108c
SS
62{
63 int pt_status = 0;
64
65#if 0
66 int saved_errno;
67
68 printf ("call_ptrace(request=%d, pid=%d, addr=0x%x, data=0x%x)",
69 request, pid, addr, data);
70#endif
71#if defined(PT_SETTRC)
72 /* If the parent can be told to attach to us, try to do it. */
c5aa993b
JM
73 if (request == PT_SETTRC)
74 {
75 errno = 0;
daa98270 76#ifndef PTRACE_TYPE_ARG5
ed9a39eb
JM
77 pt_status = ptrace (PT_SETTRC, pid, addr, data);
78#else
c5aa993b
JM
79 /* Deal with HPUX 8.0 braindamage. We never use the
80 calls which require the fifth argument. */
ed9a39eb 81 pt_status = ptrace (PT_SETTRC, pid, addr, data, 0);
c906108c 82#endif
c5aa993b
JM
83 if (errno)
84 perror_with_name ("ptrace");
c906108c 85#if 0
c5aa993b 86 printf (" = %d\n", pt_status);
c906108c 87#endif
c5aa993b
JM
88 if (pt_status < 0)
89 return pt_status;
90 else
91 return parent_attach_all (pid, addr, data);
92 }
c906108c
SS
93#endif
94
95#if defined(PT_CONTIN1)
96 /* On HPUX, PT_CONTIN1 is a form of continue that preserves pending
97 signals. If it's available, use it. */
98 if (request == PT_CONTINUE)
99 request = PT_CONTIN1;
100#endif
101
102#if defined(PT_SINGLE1)
103 /* On HPUX, PT_SINGLE1 is a form of step that preserves pending
104 signals. If it's available, use it. */
105 if (request == PT_STEP)
106 request = PT_SINGLE1;
107#endif
108
109#if 0
110 saved_errno = errno;
111 errno = 0;
112#endif
daa98270 113#ifndef PTRACE_TYPE_ARG5
ed9a39eb
JM
114 pt_status = ptrace (request, pid, addr, data);
115#else
c5aa993b
JM
116 /* Deal with HPUX 8.0 braindamage. We never use the
117 calls which require the fifth argument. */
ed9a39eb 118 pt_status = ptrace (request, pid, addr, data, 0);
c906108c 119#endif
ed9a39eb 120
c906108c
SS
121#if 0
122 if (errno)
123 printf (" [errno = %d]", errno);
124
125 errno = saved_errno;
126 printf (" = 0x%x\n", pt_status);
127#endif
128 return pt_status;
129}
130
131
daa98270 132#if defined (DEBUG_PTRACE) || defined (PTRACE_TYPE_ARG5)
c906108c
SS
133/* For the rest of the file, use an extra level of indirection */
134/* This lets us breakpoint usefully on call_ptrace. */
135#define ptrace call_ptrace
136#endif
137
138/* Wait for a process to finish, possibly running a target-specific
139 hook before returning. */
140
141int
39f77062 142ptrace_wait (ptid_t ptid, int *status)
c906108c
SS
143{
144 int wstate;
145
146 wstate = wait (status);
39f77062 147 target_post_wait (pid_to_ptid (wstate), *status);
c906108c
SS
148 return wstate;
149}
150
4de4c07c 151#ifndef KILL_INFERIOR
c906108c 152void
fba45db2 153kill_inferior (void)
c906108c
SS
154{
155 int status;
39f77062 156 int pid = PIDGET (inferior_ptid);
c906108c 157
39f77062 158 if (pid == 0)
c906108c
SS
159 return;
160
161 /* This once used to call "kill" to kill the inferior just in case
162 the inferior was still running. As others have noted in the past
163 (kingdon) there shouldn't be any way to get here if the inferior
164 is still running -- else there's a major problem elsewere in gdb
165 and it needs to be fixed.
166
167 The kill call causes problems under hpux10, so it's been removed;
168 if this causes problems we'll deal with them as they arise. */
655c5466 169 ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3) 0, 0);
39f77062 170 ptrace_wait (null_ptid, &status);
c906108c
SS
171 target_mourn_inferior ();
172}
4de4c07c 173#endif /* KILL_INFERIOR */
c906108c
SS
174
175#ifndef CHILD_RESUME
176
177/* Resume execution of the inferior process.
178 If STEP is nonzero, single-step it.
179 If SIGNAL is nonzero, give it that signal. */
180
181void
39f77062 182child_resume (ptid_t ptid, int step, enum target_signal signal)
c906108c 183{
8cbba7c8 184 int request = PT_CONTINUE;
39f77062
KB
185 int pid = PIDGET (ptid);
186
c906108c
SS
187 if (pid == -1)
188 /* Resume all threads. */
189 /* I think this only gets used in the non-threaded case, where "resume
39f77062
KB
190 all threads" and "resume inferior_ptid" are the same. */
191 pid = PIDGET (inferior_ptid);
c906108c 192
c906108c
SS
193 if (step)
194 {
8cbba7c8
MK
195 /* If this system does not support PT_STEP, a higher level
196 function will have called single_step() to transmute the step
197 request into a continue request (by setting breakpoints on
198 all possible successor instructions), so we don't have to
199 worry about that here. */
200
201 gdb_assert (!SOFTWARE_SINGLE_STEP_P ());
202 request = PT_STEP;
c906108c 203 }
c906108c 204
8cbba7c8
MK
205 /* An address of (PTRACE_TYPE_ARG3)1 tells ptrace to continue from
206 where it was. If GDB wanted it to start some other way, we have
207 already written a new PC value to the child. */
208
209 errno = 0;
210 ptrace (request, pid, (PTRACE_TYPE_ARG3)1, target_signal_to_host (signal));
211 if (errno != 0)
212 perror_with_name ("ptrace");
c906108c
SS
213}
214#endif /* CHILD_RESUME */
c906108c 215\f
8cbba7c8 216
c906108c 217/* Start debugging the process whose number is PID. */
8cbba7c8 218
c906108c 219int
fba45db2 220attach (int pid)
c906108c 221{
d966f0cb 222#ifdef PT_ATTACH
11003ae3 223 errno = 0;
655c5466 224 ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3) 0, 0);
8cbba7c8 225 if (errno != 0)
c906108c
SS
226 perror_with_name ("ptrace");
227 attach_flag = 1;
228 return pid;
d966f0cb
AC
229#else
230 error ("This system does not support attaching to a process");
231#endif
c906108c
SS
232}
233
8cbba7c8
MK
234/* Stop debugging the process whose number is PID and continue it with
235 signal number SIGNAL. SIGNAL = 0 means just continue it. */
c906108c
SS
236
237void
fba45db2 238detach (int signal)
c906108c 239{
d966f0cb 240#ifdef PT_DETACH
8cbba7c8
MK
241 int pid = PIDGET (inferior_ptid);
242
11003ae3 243 errno = 0;
8cbba7c8
MK
244 ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3) 1, signal);
245 if (errno != 0)
246 perror_with_name ("ptrace");
c906108c 247 attach_flag = 0;
d966f0cb
AC
248#else
249 error ("This system does not support detaching from a process");
250#endif
c906108c 251}
c906108c 252\f
c906108c 253
652fc137 254#ifndef FETCH_INFERIOR_REGISTERS
c906108c 255
652fc137
MK
256/* U_REGS_OFFSET is the offset of the registers within the u area. */
257#ifndef U_REGS_OFFSET
258
259#ifndef offsetof
c906108c
SS
260#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
261#endif
262
c906108c 263#define U_REGS_OFFSET \
39f77062 264 ptrace (PT_READ_U, PIDGET (inferior_ptid), \
655c5466 265 (PTRACE_TYPE_ARG3) (offsetof (struct user, u_ar0)), 0) \
c906108c
SS
266 - KERNEL_U_ADDR
267#endif
268
652fc137 269/* Fetch register REGNUM from the inferior. */
c906108c
SS
270
271static void
652fc137 272fetch_register (int regnum)
c906108c 273{
652fc137
MK
274 CORE_ADDR addr;
275 size_t size;
276 PTRACE_TYPE_RET *buf;
277 int tid, i;
278
279 if (CANNOT_FETCH_REGISTER (regnum))
c906108c 280 {
652fc137 281 regcache_raw_supply (current_regcache, regnum, NULL);
c906108c
SS
282 return;
283 }
284
652fc137
MK
285 /* GNU/Linux LWP ID's are process ID's. */
286 tid = TIDGET (inferior_ptid);
287 if (tid == 0)
288 tid = PIDGET (inferior_ptid); /* Not a threaded program. */
289
290 /* This isn't really an address. But ptrace thinks of it as one. */
291 addr = register_addr (regnum, U_REGS_OFFSET);
292 size = register_size (current_gdbarch, regnum);
ed9a39eb 293
652fc137
MK
294 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
295 buf = alloca (size);
c906108c 296
652fc137
MK
297 /* Read the register contents from the inferior a chuck at the time. */
298 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
c906108c
SS
299 {
300 errno = 0;
652fc137 301 buf[i] = ptrace (PT_READ_U, tid, (PTRACE_TYPE_ARG3) addr, 0);
c906108c 302 if (errno != 0)
652fc137
MK
303 error ("Couldn't read register %s (#%d): %s.", REGISTER_NAME (regnum),
304 regnum, safe_strerror (errno));
305
306 addr += sizeof (PTRACE_TYPE_RET);
c906108c 307 }
652fc137 308 regcache_raw_supply (current_regcache, regnum, buf);
c906108c
SS
309}
310
652fc137
MK
311/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
312 for all registers. */
c906108c
SS
313
314void
652fc137 315fetch_inferior_registers (int regnum)
c906108c 316{
652fc137
MK
317 if (regnum == -1)
318 for (regnum = 0; regnum < NUM_REGS; regnum++)
319 fetch_register (regnum);
c906108c 320 else
652fc137 321 fetch_register (regnum);
c906108c
SS
322}
323
652fc137 324/* Store register REGNUM into the inferior. */
c906108c
SS
325
326static void
652fc137 327store_register (int regnum)
c906108c 328{
652fc137
MK
329 CORE_ADDR addr;
330 size_t size;
331 PTRACE_TYPE_RET *buf;
332 int tid, i;
c906108c 333
652fc137
MK
334 if (CANNOT_STORE_REGISTER (regnum))
335 return;
ed9a39eb 336
652fc137
MK
337 /* GNU/Linux LWP ID's are process ID's. */
338 tid = TIDGET (inferior_ptid);
339 if (tid == 0)
340 tid = PIDGET (inferior_ptid); /* Not a threaded program. */
c906108c 341
652fc137
MK
342 /* This isn't really an address. But ptrace thinks of it as one. */
343 addr = register_addr (regnum, U_REGS_OFFSET);
344 size = register_size (current_gdbarch, regnum);
8b6f1f3a 345
652fc137
MK
346 gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
347 buf = alloca (size);
8b6f1f3a 348
652fc137
MK
349 /* Write the register contents into the inferior a chunk at the time. */
350 regcache_raw_collect (current_regcache, regnum, buf);
351 for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
c906108c
SS
352 {
353 errno = 0;
652fc137 354 ptrace (PT_WRITE_U, tid, (PTRACE_TYPE_ARG3) addr, buf[i]);
c906108c 355 if (errno != 0)
652fc137
MK
356 error ("Couldn't write register %s (#%d): %s.", REGISTER_NAME (regnum),
357 regnum, safe_strerror (errno));
358
359 addr += sizeof (PTRACE_TYPE_RET);
c906108c
SS
360 }
361}
362
652fc137
MK
363/* Store register REGNUM back into the inferior. If REGNUM is -1, do
364 this for all registers (including the floating point registers). */
c906108c
SS
365
366void
652fc137 367store_inferior_registers (int regnum)
c906108c 368{
652fc137
MK
369 if (regnum == -1)
370 for (regnum = 0; regnum < NUM_REGS; regnum++)
371 store_register (regnum);
c906108c 372 else
652fc137 373 store_register (regnum);
c906108c 374}
652fc137
MK
375
376#endif /* not FETCH_INFERIOR_REGISTERS. */
c906108c
SS
377\f
378
94cd915f
MS
379/* Set an upper limit on alloca. */
380#ifndef GDB_MAX_ALLOCA
381#define GDB_MAX_ALLOCA 0x1000
382#endif
383
c906108c
SS
384#if !defined (CHILD_XFER_MEMORY)
385/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
3c2fb7bd
MK
386 in the NEW_SUN_PTRACE case. It ought to be straightforward. But
387 it appears that writing did not write the data that I specified. I
388 cannot understand where it got the data that it actually did write. */
c906108c 389
3c2fb7bd
MK
390/* Copy LEN bytes to or from inferior's memory starting at MEMADDR to
391 debugger memory starting at MYADDR. Copy to inferior if WRITE is
392 nonzero. TARGET is ignored.
c5aa993b 393
3c2fb7bd
MK
394 Returns the length copied, which is either the LEN argument or
395 zero. This xfer function does not do partial moves, since
396 child_ops doesn't allow memory operations to cross below us in the
397 target stack anyway. */
c906108c
SS
398
399int
73186089 400child_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
0a65a603 401 struct mem_attrib *attrib, struct target_ops *target)
c906108c 402{
3c2fb7bd 403 int i;
c906108c 404 /* Round starting address down to longword boundary. */
88800403 405 CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
c906108c 406 /* Round ending address up; get number of longwords that makes. */
88800403
MK
407 int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
408 / sizeof (PTRACE_TYPE_RET));
409 int alloc = count * sizeof (PTRACE_TYPE_RET);
410 PTRACE_TYPE_RET *buffer;
94cd915f
MS
411 struct cleanup *old_chain = NULL;
412
371a6e84
MK
413#ifdef PT_IO
414 /* OpenBSD 3.1, NetBSD 1.6 and FreeBSD 5.0 have a new PT_IO request
415 that promises to be much more efficient in reading and writing
416 data in the traced process's address space. */
417
418 {
419 struct ptrace_io_desc piod;
420
421 /* NOTE: We assume that there are no distinct address spaces for
422 instruction and data. */
423 piod.piod_op = write ? PIOD_WRITE_D : PIOD_READ_D;
424 piod.piod_offs = (void *) memaddr;
425 piod.piod_addr = myaddr;
426 piod.piod_len = len;
427
428 if (ptrace (PT_IO, PIDGET (inferior_ptid), (caddr_t) &piod, 0) == -1)
429 {
430 /* If the PT_IO request is somehow not supported, fallback on
431 using PT_WRITE_D/PT_READ_D. Otherwise we will return zero
432 to indicate failure. */
433 if (errno != EINVAL)
434 return 0;
435 }
436 else
437 {
438 /* Return the actual number of bytes read or written. */
439 return piod.piod_len;
440 }
441 }
442#endif
443
c906108c 444 /* Allocate buffer of that many longwords. */
94cd915f
MS
445 if (len < GDB_MAX_ALLOCA)
446 {
88800403 447 buffer = (PTRACE_TYPE_RET *) alloca (alloc);
94cd915f
MS
448 }
449 else
450 {
88800403 451 buffer = (PTRACE_TYPE_RET *) xmalloc (alloc);
94cd915f
MS
452 old_chain = make_cleanup (xfree, buffer);
453 }
c906108c
SS
454
455 if (write)
456 {
3c2fb7bd
MK
457 /* Fill start and end extra bytes of buffer with existing memory
458 data. */
88800403 459 if (addr != memaddr || len < (int) sizeof (PTRACE_TYPE_RET))
c5aa993b
JM
460 {
461 /* Need part of initial word -- fetch it. */
39f77062 462 buffer[0] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
655c5466 463 (PTRACE_TYPE_ARG3) addr, 0);
c5aa993b 464 }
c906108c 465
3c2fb7bd 466 if (count > 1) /* FIXME, avoid if even boundary. */
c906108c 467 {
3c2fb7bd
MK
468 buffer[count - 1] =
469 ptrace (PT_READ_I, PIDGET (inferior_ptid),
655c5466 470 ((PTRACE_TYPE_ARG3)
88800403 471 (addr + (count - 1) * sizeof (PTRACE_TYPE_RET))), 0);
c906108c
SS
472 }
473
3c2fb7bd 474 /* Copy data to be written over corresponding part of buffer. */
88800403 475 memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
3c2fb7bd 476 myaddr, len);
c906108c
SS
477
478 /* Write the entire buffer. */
88800403 479 for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
c906108c
SS
480 {
481 errno = 0;
39f77062 482 ptrace (PT_WRITE_D, PIDGET (inferior_ptid),
655c5466 483 (PTRACE_TYPE_ARG3) addr, buffer[i]);
c906108c 484 if (errno)
c5aa993b 485 {
c906108c 486 /* Using the appropriate one (I or D) is necessary for
c5aa993b 487 Gould NP1, at least. */
c906108c 488 errno = 0;
39f77062 489 ptrace (PT_WRITE_I, PIDGET (inferior_ptid),
655c5466 490 (PTRACE_TYPE_ARG3) addr, buffer[i]);
c906108c
SS
491 }
492 if (errno)
493 return 0;
494 }
c906108c
SS
495 }
496 else
497 {
3c2fb7bd 498 /* Read all the longwords. */
88800403 499 for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
c906108c
SS
500 {
501 errno = 0;
39f77062 502 buffer[i] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
655c5466 503 (PTRACE_TYPE_ARG3) addr, 0);
c906108c
SS
504 if (errno)
505 return 0;
506 QUIT;
507 }
508
509 /* Copy appropriate bytes out of the buffer. */
510 memcpy (myaddr,
88800403 511 (char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
c906108c
SS
512 len);
513 }
3c2fb7bd 514
94cd915f
MS
515 if (old_chain != NULL)
516 do_cleanups (old_chain);
c906108c
SS
517 return len;
518}
c906108c 519\f
c5aa993b 520
c906108c 521static void
fba45db2 522udot_info (char *dummy1, int dummy2)
c906108c
SS
523{
524#if defined (KERNEL_U_SIZE)
7343d46a 525 long udot_off; /* Offset into user struct */
c5aa993b
JM
526 int udot_val; /* Value from user struct at udot_off */
527 char mess[128]; /* For messages */
c906108c
SS
528#endif
529
c5aa993b
JM
530 if (!target_has_execution)
531 {
532 error ("The program is not being run.");
533 }
c906108c
SS
534
535#if !defined (KERNEL_U_SIZE)
536
537 /* Adding support for this command is easy. Typically you just add a
538 routine, called "kernel_u_size" that returns the size of the user
539 struct, to the appropriate *-nat.c file and then add to the native
540 config file "#define KERNEL_U_SIZE kernel_u_size()" */
541 error ("Don't know how large ``struct user'' is in this version of gdb.");
542
543#else
544
545 for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val))
546 {
547 if ((udot_off % 24) == 0)
548 {
549 if (udot_off > 0)
550 {
551 printf_filtered ("\n");
552 }
7343d46a 553 printf_filtered ("%s:", paddr (udot_off));
c906108c 554 }
655c5466 555 udot_val = ptrace (PT_READ_U, PIDGET (inferior_ptid), (PTRACE_TYPE_ARG3) udot_off, 0);
c906108c
SS
556 if (errno != 0)
557 {
7343d46a
AC
558 sprintf (mess, "\nreading user struct at offset 0x%s",
559 paddr_nz (udot_off));
c906108c
SS
560 perror_with_name (mess);
561 }
562 /* Avoid using nonportable (?) "*" in print specs */
563 printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val);
564 }
565 printf_filtered ("\n");
566
567#endif
568}
569#endif /* !defined (CHILD_XFER_MEMORY). */
c906108c 570\f
c5aa993b 571
c906108c 572void
fba45db2 573_initialize_infptrace (void)
c906108c
SS
574{
575#if !defined (CHILD_XFER_MEMORY)
576 add_info ("udot", udot_info,
577 "Print contents of kernel ``struct user'' for current child.");
578#endif
579}
This page took 0.411466 seconds and 4 git commands to generate.