~ubuntu-branches/ubuntu/karmic/insight/karmic

« back to all changes in this revision

Viewing changes to gdb/infptrace.c

  • Committer: Bazaar Package Importer
  • Author(s): Masayuki Hatta (mhatta)
  • Date: 2007-12-04 22:37:09 UTC
  • mfrom: (1.2.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20071204223709-jxj396d1ox92s8ox
Tags: 6.7.1.dfsg.1-1
* New upstream release.
* This typo has been fixed in the upstream - closes: #314037.
* Removed non-free documents (GFDL'd with Invariant Sections, etc.).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Low level Unix child interface to ptrace, for GDB when running under Unix.
2
 
   Copyright (C) 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., 51 Franklin Street, Fifth Floor,
21
 
   Boston, MA 02110-1301, 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
 
int
58
 
call_ptrace (int request, int pid, PTRACE_ARG3_TYPE addr, int data)
59
 
{
60
 
  return ptrace (request, pid, addr, data);
61
 
}
62
 
 
63
 
/* Wait for a process to finish, possibly running a target-specific
64
 
   hook before returning.  */
65
 
 
66
 
/* NOTE: cagney: 2004-09-29: Dependant on the native configuration,
67
 
   "hppah-nat.c" may either call this or infttrace.c's implementation
68
 
   of ptrace_wait.  See "hppahpux.mh".  */
69
 
 
70
 
int
71
 
ptrace_wait (ptid_t ptid, int *status)
72
 
{
73
 
  int wstate;
74
 
 
75
 
  wstate = wait (status);
76
 
  return wstate;
77
 
}
78
 
 
79
 
#ifndef DEPRECATED_KILL_INFERIOR
80
 
/* NOTE: cagney/2004-09-12: Instead of definining this macro, code
81
 
   should call inf_ptrace_target to get a basic ptrace target and then
82
 
   locally update any necessary methods.  See ppcnbsd-nat.c.  */
83
 
 
84
 
void
85
 
kill_inferior (void)
86
 
{
87
 
  int status;
88
 
  int pid =  PIDGET (inferior_ptid);
89
 
 
90
 
  if (pid == 0)
91
 
    return;
92
 
 
93
 
  /* This once used to call "kill" to kill the inferior just in case
94
 
     the inferior was still running.  As others have noted in the past
95
 
     (kingdon) there shouldn't be any way to get here if the inferior
96
 
     is still running -- else there's a major problem elsewere in gdb
97
 
     and it needs to be fixed.
98
 
 
99
 
     The kill call causes problems under hpux10, so it's been removed;
100
 
     if this causes problems we'll deal with them as they arise.  */
101
 
  ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3) 0, 0);
102
 
  wait (&status);
103
 
  target_mourn_inferior ();
104
 
}
105
 
#endif /* DEPRECATED_KILL_INFERIOR */
106
 
 
107
 
#ifndef DEPRECATED_CHILD_RESUME
108
 
/* NOTE: cagney/2004-09-12: Instead of definining this macro, code
109
 
   should call inf_ptrace_target to get a basic ptrace target and then
110
 
   locally update any necessary methods.  See ppcnbsd-nat.c.  */
111
 
 
112
 
/* Resume execution of the inferior process.
113
 
   If STEP is nonzero, single-step it.
114
 
   If SIGNAL is nonzero, give it that signal.  */
115
 
 
116
 
void
117
 
child_resume (ptid_t ptid, int step, enum target_signal signal)
118
 
{
119
 
  int request = PT_CONTINUE;
120
 
  int pid = PIDGET (ptid);
121
 
 
122
 
  if (pid == -1)
123
 
    /* Resume all threads.  */
124
 
    /* I think this only gets used in the non-threaded case, where "resume
125
 
       all threads" and "resume inferior_ptid" are the same.  */
126
 
    pid = PIDGET (inferior_ptid);
127
 
 
128
 
  if (step)
129
 
    {
130
 
      /* If this system does not support PT_STEP, a higher level
131
 
         function will have called single_step() to transmute the step
132
 
         request into a continue request (by setting breakpoints on
133
 
         all possible successor instructions), so we don't have to
134
 
         worry about that here.  */
135
 
 
136
 
      gdb_assert (!SOFTWARE_SINGLE_STEP_P ());
137
 
      request = PT_STEP;
138
 
    }
139
 
 
140
 
  /* An address of (PTRACE_TYPE_ARG3)1 tells ptrace to continue from
141
 
     where it was.  If GDB wanted it to start some other way, we have
142
 
     already written a new PC value to the child.  */
143
 
 
144
 
  errno = 0;
145
 
  ptrace (request, pid, (PTRACE_TYPE_ARG3)1, target_signal_to_host (signal));
146
 
  if (errno != 0)
147
 
    perror_with_name (("ptrace"));
148
 
}
149
 
#endif /* DEPRECATED_CHILD_RESUME */
150
 
 
151
 
 
152
 
/* Start debugging the process whose number is PID.  */
153
 
 
154
 
int
155
 
attach (int pid)
156
 
{
157
 
#ifdef PT_ATTACH
158
 
  errno = 0;
159
 
  ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3) 0, 0);
160
 
  if (errno != 0)
161
 
    perror_with_name (("ptrace"));
162
 
  attach_flag = 1;
163
 
  return pid;
164
 
#else
165
 
  error (_("This system does not support attaching to a process"));
166
 
#endif
167
 
}
168
 
 
169
 
/* Stop debugging the process whose number is PID and continue it with
170
 
   signal number SIGNAL.  SIGNAL = 0 means just continue it.  */
171
 
 
172
 
void
173
 
detach (int signal)
174
 
{
175
 
#ifdef PT_DETACH
176
 
  int pid = PIDGET (inferior_ptid);
177
 
 
178
 
  errno = 0;
179
 
  ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3) 1, signal);
180
 
  if (errno != 0)
181
 
    perror_with_name (("ptrace"));
182
 
  attach_flag = 0;
183
 
#else
184
 
  error (_("This system does not support detaching from a process"));
185
 
#endif
186
 
}
187
 
 
188
 
 
189
 
#ifndef FETCH_INFERIOR_REGISTERS
190
 
 
191
 
/* U_REGS_OFFSET is the offset of the registers within the u area.  */
192
 
#ifndef U_REGS_OFFSET
193
 
 
194
 
#ifndef offsetof
195
 
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
196
 
#endif
197
 
 
198
 
#define U_REGS_OFFSET \
199
 
  ptrace (PT_READ_U, PIDGET (inferior_ptid), \
200
 
          (PTRACE_TYPE_ARG3) (offsetof (struct user, u_ar0)), 0) \
201
 
    - KERNEL_U_ADDR
202
 
#endif
203
 
 
204
 
/* Fetch register REGNUM from the inferior.  */
205
 
 
206
 
static void
207
 
fetch_register (int regnum)
208
 
{
209
 
  CORE_ADDR addr;
210
 
  size_t size;
211
 
  PTRACE_TYPE_RET *buf;
212
 
  int tid, i;
213
 
 
214
 
  if (CANNOT_FETCH_REGISTER (regnum))
215
 
    {
216
 
      regcache_raw_supply (current_regcache, regnum, NULL);
217
 
      return;
218
 
    }
219
 
 
220
 
  /* GNU/Linux LWP ID's are process ID's.  */
221
 
  tid = TIDGET (inferior_ptid);
222
 
  if (tid == 0)
223
 
    tid = PIDGET (inferior_ptid); /* Not a threaded program.  */
224
 
 
225
 
  /* This isn't really an address.  But ptrace thinks of it as one.  */
226
 
  addr = register_addr (regnum, U_REGS_OFFSET);
227
 
  size = register_size (current_gdbarch, regnum);
228
 
 
229
 
  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
230
 
  buf = alloca (size);
231
 
 
232
 
  /* Read the register contents from the inferior a chuck at the time.  */
233
 
  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
234
 
    {
235
 
      errno = 0;
236
 
      buf[i] = ptrace (PT_READ_U, tid, (PTRACE_TYPE_ARG3) addr, 0);
237
 
      if (errno != 0)
238
 
        error (_("Couldn't read register %s (#%d): %s."), REGISTER_NAME (regnum),
239
 
               regnum, safe_strerror (errno));
240
 
 
241
 
      addr += sizeof (PTRACE_TYPE_RET);
242
 
    }
243
 
  regcache_raw_supply (current_regcache, regnum, buf);
244
 
}
245
 
 
246
 
/* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
247
 
   for all registers.  */
248
 
 
249
 
void
250
 
fetch_inferior_registers (int regnum)
251
 
{
252
 
  if (regnum == -1)
253
 
    for (regnum = 0; regnum < NUM_REGS; regnum++)
254
 
      fetch_register (regnum);
255
 
  else
256
 
    fetch_register (regnum);
257
 
}
258
 
 
259
 
/* Store register REGNUM into the inferior.  */
260
 
 
261
 
static void
262
 
store_register (int regnum)
263
 
{
264
 
  CORE_ADDR addr;
265
 
  size_t size;
266
 
  PTRACE_TYPE_RET *buf;
267
 
  int tid, i;
268
 
 
269
 
  if (CANNOT_STORE_REGISTER (regnum))
270
 
    return;
271
 
 
272
 
  /* GNU/Linux LWP ID's are process ID's.  */
273
 
  tid = TIDGET (inferior_ptid);
274
 
  if (tid == 0)
275
 
    tid = PIDGET (inferior_ptid); /* Not a threaded program.  */
276
 
 
277
 
  /* This isn't really an address.  But ptrace thinks of it as one.  */
278
 
  addr = register_addr (regnum, U_REGS_OFFSET);
279
 
  size = register_size (current_gdbarch, regnum);
280
 
 
281
 
  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
282
 
  buf = alloca (size);
283
 
 
284
 
  /* Write the register contents into the inferior a chunk at the time.  */
285
 
  regcache_raw_collect (current_regcache, regnum, buf);
286
 
  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
287
 
    {
288
 
      errno = 0;
289
 
      ptrace (PT_WRITE_U, tid, (PTRACE_TYPE_ARG3) addr, buf[i]);
290
 
      if (errno != 0)
291
 
        error (_("Couldn't write register %s (#%d): %s."),
292
 
               REGISTER_NAME (regnum), regnum, safe_strerror (errno));
293
 
 
294
 
      addr += sizeof (PTRACE_TYPE_RET);
295
 
    }
296
 
}
297
 
 
298
 
/* Store register REGNUM back into the inferior.  If REGNUM is -1, do
299
 
   this for all registers (including the floating point registers).  */
300
 
 
301
 
void
302
 
store_inferior_registers (int regnum)
303
 
{
304
 
  if (regnum == -1)
305
 
    for (regnum = 0; regnum < NUM_REGS; regnum++)
306
 
      store_register (regnum);
307
 
  else
308
 
    store_register (regnum);
309
 
}
310
 
 
311
 
#endif /* not FETCH_INFERIOR_REGISTERS.  */
312
 
 
313
 
 
314
 
/* Set an upper limit on alloca.  */
315
 
#ifndef GDB_MAX_ALLOCA
316
 
#define GDB_MAX_ALLOCA 0x1000
317
 
#endif
318
 
 
319
 
#if !defined (CHILD_XFER_MEMORY)
320
 
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
321
 
   in the NEW_SUN_PTRACE case.  It ought to be straightforward.  But
322
 
   it appears that writing did not write the data that I specified.  I
323
 
   cannot understand where it got the data that it actually did write.  */
324
 
 
325
 
/* Copy LEN bytes to or from inferior's memory starting at MEMADDR to
326
 
   debugger memory starting at MYADDR.  Copy to inferior if WRITE is
327
 
   nonzero.  TARGET is ignored.
328
 
 
329
 
   Returns the length copied, which is either the LEN argument or
330
 
   zero.  This xfer function does not do partial moves, since
331
 
   deprecated_child_ops doesn't allow memory operations to cross below
332
 
   us in the target stack anyway.  */
333
 
 
334
 
int
335
 
child_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
336
 
                   struct mem_attrib *attrib, struct target_ops *target)
337
 
{
338
 
  int i;
339
 
  /* Round starting address down to longword boundary.  */
340
 
  CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_TYPE_RET);
341
 
  /* Round ending address up; get number of longwords that makes.  */
342
 
  int count = ((((memaddr + len) - addr) + sizeof (PTRACE_TYPE_RET) - 1)
343
 
               / sizeof (PTRACE_TYPE_RET));
344
 
  int alloc = count * sizeof (PTRACE_TYPE_RET);
345
 
  PTRACE_TYPE_RET *buffer;
346
 
  struct cleanup *old_chain = NULL;
347
 
 
348
 
#ifdef PT_IO
349
 
  /* OpenBSD 3.1, NetBSD 1.6 and FreeBSD 5.0 have a new PT_IO request
350
 
     that promises to be much more efficient in reading and writing
351
 
     data in the traced process's address space.  */
352
 
 
353
 
  {
354
 
    struct ptrace_io_desc piod;
355
 
 
356
 
    /* NOTE: We assume that there are no distinct address spaces for
357
 
       instruction and data.  */
358
 
    piod.piod_op = write ? PIOD_WRITE_D : PIOD_READ_D;
359
 
    piod.piod_offs = (void *) memaddr;
360
 
    piod.piod_addr = myaddr;
361
 
    piod.piod_len = len;
362
 
 
363
 
    if (ptrace (PT_IO, PIDGET (inferior_ptid), (caddr_t) &piod, 0) == -1)
364
 
      {
365
 
        /* If the PT_IO request is somehow not supported, fallback on
366
 
           using PT_WRITE_D/PT_READ_D.  Otherwise we will return zero
367
 
           to indicate failure.  */
368
 
        if (errno != EINVAL)
369
 
          return 0;
370
 
      }
371
 
    else
372
 
      {
373
 
        /* Return the actual number of bytes read or written.  */
374
 
        return piod.piod_len;
375
 
      }
376
 
  }
377
 
#endif
378
 
 
379
 
  /* Allocate buffer of that many longwords.  */
380
 
  if (len < GDB_MAX_ALLOCA)
381
 
    {
382
 
      buffer = (PTRACE_TYPE_RET *) alloca (alloc);
383
 
    }
384
 
  else
385
 
    {
386
 
      buffer = (PTRACE_TYPE_RET *) xmalloc (alloc);
387
 
      old_chain = make_cleanup (xfree, buffer);
388
 
    }
389
 
 
390
 
  if (write)
391
 
    {
392
 
      /* Fill start and end extra bytes of buffer with existing memory
393
 
         data.  */
394
 
      if (addr != memaddr || len < (int) sizeof (PTRACE_TYPE_RET))
395
 
        {
396
 
          /* Need part of initial word -- fetch it.  */
397
 
          buffer[0] = ptrace (PT_READ_I, PIDGET (inferior_ptid), 
398
 
                              (PTRACE_TYPE_ARG3) addr, 0);
399
 
        }
400
 
 
401
 
      if (count > 1)            /* FIXME, avoid if even boundary.  */
402
 
        {
403
 
          buffer[count - 1] =
404
 
            ptrace (PT_READ_I, PIDGET (inferior_ptid),
405
 
                    ((PTRACE_TYPE_ARG3)
406
 
                     (addr + (count - 1) * sizeof (PTRACE_TYPE_RET))), 0);
407
 
        }
408
 
 
409
 
      /* Copy data to be written over corresponding part of buffer.  */
410
 
      memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
411
 
              myaddr, len);
412
 
 
413
 
      /* Write the entire buffer.  */
414
 
      for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
415
 
        {
416
 
          errno = 0;
417
 
          ptrace (PT_WRITE_D, PIDGET (inferior_ptid), 
418
 
                  (PTRACE_TYPE_ARG3) addr, buffer[i]);
419
 
          if (errno)
420
 
            {
421
 
              /* Using the appropriate one (I or D) is necessary for
422
 
                 Gould NP1, at least.  */
423
 
              errno = 0;
424
 
              ptrace (PT_WRITE_I, PIDGET (inferior_ptid), 
425
 
                      (PTRACE_TYPE_ARG3) addr, buffer[i]);
426
 
            }
427
 
          if (errno)
428
 
            return 0;
429
 
        }
430
 
    }
431
 
  else
432
 
    {
433
 
      /* Read all the longwords.  */
434
 
      for (i = 0; i < count; i++, addr += sizeof (PTRACE_TYPE_RET))
435
 
        {
436
 
          errno = 0;
437
 
          buffer[i] = ptrace (PT_READ_I, PIDGET (inferior_ptid),
438
 
                              (PTRACE_TYPE_ARG3) addr, 0);
439
 
          if (errno)
440
 
            return 0;
441
 
          QUIT;
442
 
        }
443
 
 
444
 
      /* Copy appropriate bytes out of the buffer.  */
445
 
      memcpy (myaddr,
446
 
              (char *) buffer + (memaddr & (sizeof (PTRACE_TYPE_RET) - 1)),
447
 
              len);
448
 
    }
449
 
 
450
 
  if (old_chain != NULL)
451
 
    do_cleanups (old_chain);
452
 
  return len;
453
 
}
454
 
 
455
 
 
456
 
static void
457
 
udot_info (char *dummy1, int dummy2)
458
 
{
459
 
#if defined (KERNEL_U_SIZE)
460
 
  long udot_off;                        /* Offset into user struct */
461
 
  int udot_val;                 /* Value from user struct at udot_off */
462
 
  char mess[128];               /* For messages */
463
 
#endif
464
 
 
465
 
  if (!target_has_execution)
466
 
    {
467
 
      error (_("The program is not being run."));
468
 
    }
469
 
 
470
 
#if !defined (KERNEL_U_SIZE)
471
 
 
472
 
  /* Adding support for this command is easy.  Typically you just add a
473
 
     routine, called "kernel_u_size" that returns the size of the user
474
 
     struct, to the appropriate *-nat.c file and then add to the native
475
 
     config file "#define KERNEL_U_SIZE kernel_u_size()" */
476
 
  error (_("Don't know how large ``struct user'' is in this version of gdb."));
477
 
 
478
 
#else
479
 
 
480
 
  for (udot_off = 0; udot_off < KERNEL_U_SIZE; udot_off += sizeof (udot_val))
481
 
    {
482
 
      if ((udot_off % 24) == 0)
483
 
        {
484
 
          if (udot_off > 0)
485
 
            {
486
 
              printf_filtered ("\n");
487
 
            }
488
 
          printf_filtered ("%s:", paddr (udot_off));
489
 
        }
490
 
      udot_val = ptrace (PT_READ_U, PIDGET (inferior_ptid), (PTRACE_TYPE_ARG3) udot_off, 0);
491
 
      if (errno != 0)
492
 
        {
493
 
          sprintf (mess, "\nreading user struct at offset 0x%s",
494
 
                   paddr_nz (udot_off));
495
 
          perror_with_name (mess);
496
 
        }
497
 
      /* Avoid using nonportable (?) "*" in print specs */
498
 
      printf_filtered (sizeof (int) == 4 ? " 0x%08x" : " 0x%16x", udot_val);
499
 
    }
500
 
  printf_filtered ("\n");
501
 
 
502
 
#endif
503
 
}
504
 
#endif /* !defined (CHILD_XFER_MEMORY).  */
505
 
 
506
 
 
507
 
void
508
 
_initialize_infptrace (void)
509
 
{
510
 
#if !defined (CHILD_XFER_MEMORY)
511
 
  add_info ("udot", udot_info,
512
 
            _("Print contents of kernel ``struct user'' for current child."));
513
 
#endif
514
 
}