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