* hppa-tdep.c (hppa_frame_find_saved_regs): Change "frame" to
[deliverable/binutils-gdb.git] / gdb / infptrace.c
CommitLineData
bd5635a1 1/* Low level Unix child interface to ptrace, for GDB when running under Unix.
ee0613d1 2 Copyright 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
bd5635a1
RP
3
4This file is part of GDB.
5
b6de2014 6This program is free software; you can redistribute it and/or modify
bd5635a1 7it under the terms of the GNU General Public License as published by
b6de2014
JG
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
bd5635a1 10
b6de2014 11This program is distributed in the hope that it will be useful,
bd5635a1
RP
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
b6de2014
JG
17along with this program; if not, write to the Free Software
18Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
bd5635a1 19
bd5635a1 20#include "defs.h"
bd5635a1
RP
21#include "frame.h"
22#include "inferior.h"
23#include "target.h"
24
25#ifdef USG
26#include <sys/types.h>
27#endif
28
29#include <sys/param.h>
30#include <sys/dir.h>
31#include <signal.h>
32#include <sys/ioctl.h>
ef6f3a8b 33
0626f40d 34#ifndef NO_PTRACE_H
a0f9783e
SG
35#ifdef PTRACE_IN_WRONG_PLACE
36#include <ptrace.h>
37#else
bd5635a1 38#include <sys/ptrace.h>
8ffd75c8 39#endif
0626f40d 40#endif /* NO_PTRACE_H */
8ffd75c8 41
bd5635a1
RP
42#if !defined (PT_KILL)
43#define PT_KILL 8
5090e82c
SG
44#endif
45
46#if !defined (PT_STEP)
bd5635a1
RP
47#define PT_STEP 9
48#define PT_CONTINUE 7
49#define PT_READ_U 3
50#define PT_WRITE_U 6
51#define PT_READ_I 1
8ffd75c8 52#define PT_READ_D 2
bd5635a1 53#define PT_WRITE_I 4
8ffd75c8 54#define PT_WRITE_D 5
5090e82c 55#endif /* No PT_STEP. */
bd5635a1
RP
56
57#ifndef PT_ATTACH
58#define PT_ATTACH PTRACE_ATTACH
59#endif
60#ifndef PT_DETACH
61#define PT_DETACH PTRACE_DETACH
62#endif
63
64#include "gdbcore.h"
ee0613d1 65#ifndef NO_SYS_FILE
bd5635a1 66#include <sys/file.h>
ee0613d1 67#endif
5090e82c
SG
68#if 0
69/* Don't think this is used anymore. On the sequent (not sure whether it's
70 dynix or ptx or both), it is included unconditionally by sys/user.h and
71 not protected against multiple inclusion. */
bd5635a1 72#include <sys/stat.h>
0626f40d
JK
73#endif
74
44ff4c96
JG
75#if !defined (FETCH_INFERIOR_REGISTERS)
76#include <sys/user.h> /* Probably need to poke the user structure */
77#if defined (KERNEL_U_ADDR_BSD)
78#include <a.out.h> /* For struct nlist */
79#endif /* KERNEL_U_ADDR_BSD. */
80#endif /* !FETCH_INFERIOR_REGISTERS */
e676a15f 81
bd5635a1
RP
82\f
83/* This function simply calls ptrace with the given arguments.
84 It exists so that all calls to ptrace are isolated in this
85 machine-dependent file. */
86int
87call_ptrace (request, pid, addr, data)
e676a15f
FF
88 int request, pid;
89 PTRACE_ARG3_TYPE addr;
90 int data;
bd5635a1 91{
5090e82c
SG
92 return ptrace (request, pid, addr, data
93#if defined (FIVE_ARG_PTRACE)
94 /* Deal with HPUX 8.0 braindamage. We never use the
95 calls which require the fifth argument. */
96 , 0
97#endif
98 );
bd5635a1
RP
99}
100
5090e82c 101#if defined (DEBUG_PTRACE) || defined (FIVE_ARG_PTRACE)
bd5635a1
RP
102/* For the rest of the file, use an extra level of indirection */
103/* This lets us breakpoint usefully on call_ptrace. */
104#define ptrace call_ptrace
105#endif
106
bd5635a1 107void
c9c23412 108kill_inferior ()
bd5635a1
RP
109{
110 if (inferior_pid == 0)
111 return;
c9c23412
RP
112 /* ptrace PT_KILL only works if process is stopped!!! So stop it with
113 a real signal first, if we can. */
114 kill (inferior_pid, SIGKILL);
e676a15f 115 ptrace (PT_KILL, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0);
bd5635a1 116 wait ((int *)0);
bd5635a1
RP
117 target_mourn_inferior ();
118}
119
120/* Resume execution of the inferior process.
121 If STEP is nonzero, single-step it.
122 If SIGNAL is nonzero, give it that signal. */
123
124void
5090e82c
SG
125child_resume (pid, step, signal)
126 int pid;
bd5635a1 127 int step;
918fea3e 128 enum target_signal signal;
bd5635a1
RP
129{
130 errno = 0;
d11c44f1 131
5090e82c 132 if (pid == -1)
918fea3e
JL
133 /* Resume all threads. */
134#ifdef PIDGET
135 /* This is for Lynx, and should be cleaned up by having Lynx be
136 a separate debugging target, with its own target_resume function. */
5090e82c
SG
137 pid = PIDGET (inferior_pid);
138#else
918fea3e
JL
139 /* I think this only gets used in the non-threaded case, where "resume
140 all threads" and "resume inferior_pid" are the same. */
5090e82c
SG
141 pid = inferior_pid;
142#endif
143
e676a15f
FF
144 /* An address of (PTRACE_ARG3_TYPE)1 tells ptrace to continue from where
145 it was. (If GDB wanted it to start some other way, we have already
997cc2c0
JG
146 written a new PC value to the child.)
147
148 If this system does not support PT_STEP, a higher level function will
149 have called single_step() to transmute the step request into a
150 continue request (by setting breakpoints on all possible successor
151 instructions), so we don't have to worry about that here. */
d11c44f1 152
bd5635a1 153 if (step)
918fea3e
JL
154 ptrace (PT_STEP, pid, (PTRACE_ARG3_TYPE) 1,
155 target_signal_to_host (signal));
bd5635a1 156 else
918fea3e
JL
157 ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1,
158 target_signal_to_host (signal));
d11c44f1 159
bd5635a1
RP
160 if (errno)
161 perror_with_name ("ptrace");
162}
163\f
164#ifdef ATTACH_DETACH
bd5635a1
RP
165/* Start debugging the process whose number is PID. */
166int
167attach (pid)
168 int pid;
169{
170 errno = 0;
e676a15f 171 ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0);
bd5635a1
RP
172 if (errno)
173 perror_with_name ("ptrace");
174 attach_flag = 1;
175 return pid;
176}
177
178/* Stop debugging the process whose number is PID
179 and continue it with signal number SIGNAL.
180 SIGNAL = 0 means just continue it. */
181
182void
183detach (signal)
184 int signal;
185{
186 errno = 0;
e676a15f 187 ptrace (PT_DETACH, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal);
bd5635a1
RP
188 if (errno)
189 perror_with_name ("ptrace");
190 attach_flag = 0;
191}
192#endif /* ATTACH_DETACH */
193\f
5090e82c
SG
194/* Default the type of the ptrace transfer to int. */
195#ifndef PTRACE_XFER_TYPE
196#define PTRACE_XFER_TYPE int
197#endif
bd5635a1
RP
198
199/* KERNEL_U_ADDR is the amount to subtract from u.u_ar0
200 to get the offset in the core file of the register values. */
5090e82c 201#if defined (KERNEL_U_ADDR_BSD) && !defined (FETCH_INFERIOR_REGISTERS)
bd5635a1
RP
202/* Get kernel_u_addr using BSD-style nlist(). */
203CORE_ADDR kernel_u_addr;
5090e82c 204#endif /* KERNEL_U_ADDR_BSD. */
bd5635a1
RP
205
206void
207_initialize_kernel_u_addr ()
208{
5090e82c 209#if defined (KERNEL_U_ADDR_BSD) && !defined (FETCH_INFERIOR_REGISTERS)
bd5635a1
RP
210 struct nlist names[2];
211
212 names[0].n_un.n_name = "_u";
213 names[1].n_un.n_name = NULL;
214 if (nlist ("/vmunix", names) == 0)
215 kernel_u_addr = names[0].n_value;
216 else
217 fatal ("Unable to get kernel u area address.");
bd5635a1 218#endif /* KERNEL_U_ADDR_BSD. */
bd5635a1 219}
5090e82c
SG
220
221#if !defined (FETCH_INFERIOR_REGISTERS)
bd5635a1
RP
222
223#if !defined (offsetof)
224#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
225#endif
226
227/* U_REGS_OFFSET is the offset of the registers within the u area. */
228#if !defined (U_REGS_OFFSET)
229#define U_REGS_OFFSET \
230 ptrace (PT_READ_U, inferior_pid, \
e676a15f
FF
231 (PTRACE_ARG3_TYPE) (offsetof (struct user, u_ar0)), 0) \
232 - KERNEL_U_ADDR
bd5635a1
RP
233#endif
234
44ff4c96
JG
235/* Registers we shouldn't try to fetch. */
236#if !defined (CANNOT_FETCH_REGISTER)
237#define CANNOT_FETCH_REGISTER(regno) 0
238#endif
239
bd5635a1 240/* Fetch one register. */
44ff4c96 241
bd5635a1
RP
242static void
243fetch_register (regno)
244 int regno;
245{
246 register unsigned int regaddr;
247 char buf[MAX_REGISTER_RAW_SIZE];
44ff4c96 248 char mess[128]; /* For messages */
bd5635a1
RP
249 register int i;
250
251 /* Offset of registers within the u area. */
44ff4c96
JG
252 unsigned int offset;
253
254 if (CANNOT_FETCH_REGISTER (regno))
255 {
5090e82c 256 memset (buf, '\0', REGISTER_RAW_SIZE (regno)); /* Supply zeroes */
44ff4c96
JG
257 supply_register (regno, buf);
258 return;
259 }
260
261 offset = U_REGS_OFFSET;
bd5635a1
RP
262
263 regaddr = register_addr (regno, offset);
5090e82c 264 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
bd5635a1 265 {
44ff4c96 266 errno = 0;
5090e82c
SG
267 *(PTRACE_XFER_TYPE *) &buf[i] = ptrace (PT_READ_U, inferior_pid,
268 (PTRACE_ARG3_TYPE) regaddr, 0);
269 regaddr += sizeof (PTRACE_XFER_TYPE);
44ff4c96
JG
270 if (errno != 0)
271 {
272 sprintf (mess, "reading register %s (#%d)", reg_names[regno], regno);
273 perror_with_name (mess);
274 }
bd5635a1
RP
275 }
276 supply_register (regno, buf);
277}
278
44ff4c96 279
5594d534 280/* Fetch all registers, or just one, from the child process. */
bd5635a1 281
5594d534 282void
bd5635a1
RP
283fetch_inferior_registers (regno)
284 int regno;
285{
286 if (regno == -1)
287 for (regno = 0; regno < NUM_REGS; regno++)
288 fetch_register (regno);
289 else
290 fetch_register (regno);
bd5635a1
RP
291}
292
293/* Registers we shouldn't try to store. */
294#if !defined (CANNOT_STORE_REGISTER)
295#define CANNOT_STORE_REGISTER(regno) 0
296#endif
297
298/* Store our register values back into the inferior.
299 If REGNO is -1, do this for all registers.
300 Otherwise, REGNO specifies which register (so we can save time). */
301
e676a15f 302void
bd5635a1
RP
303store_inferior_registers (regno)
304 int regno;
305{
306 register unsigned int regaddr;
307 char buf[80];
bd5635a1 308 register int i;
bd5635a1
RP
309
310 unsigned int offset = U_REGS_OFFSET;
311
312 if (regno >= 0)
313 {
314 regaddr = register_addr (regno, offset);
5090e82c 315 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(PTRACE_XFER_TYPE))
bd5635a1
RP
316 {
317 errno = 0;
e676a15f 318 ptrace (PT_WRITE_U, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
5090e82c 319 *(PTRACE_XFER_TYPE *) &registers[REGISTER_BYTE (regno) + i]);
bd5635a1
RP
320 if (errno != 0)
321 {
322 sprintf (buf, "writing register number %d(%d)", regno, i);
323 perror_with_name (buf);
bd5635a1 324 }
5090e82c 325 regaddr += sizeof(PTRACE_XFER_TYPE);
bd5635a1
RP
326 }
327 }
328 else
329 {
330 for (regno = 0; regno < NUM_REGS; regno++)
331 {
332 if (CANNOT_STORE_REGISTER (regno))
333 continue;
334 regaddr = register_addr (regno, offset);
5090e82c 335 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof(PTRACE_XFER_TYPE))
bd5635a1
RP
336 {
337 errno = 0;
e676a15f 338 ptrace (PT_WRITE_U, inferior_pid, (PTRACE_ARG3_TYPE) regaddr,
5090e82c 339 *(PTRACE_XFER_TYPE *) &registers[REGISTER_BYTE (regno) + i]);
bd5635a1
RP
340 if (errno != 0)
341 {
342 sprintf (buf, "writing register number %d(%d)", regno, i);
343 perror_with_name (buf);
bd5635a1 344 }
5090e82c 345 regaddr += sizeof(PTRACE_XFER_TYPE);
bd5635a1
RP
346 }
347 }
348 }
bd5635a1
RP
349}
350#endif /* !defined (FETCH_INFERIOR_REGISTERS). */
351\f
918fea3e
JL
352
353#if !defined (CHILD_XFER_MEMORY)
bd5635a1
RP
354/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
355 in the NEW_SUN_PTRACE case.
356 It ought to be straightforward. But it appears that writing did
357 not write the data that I specified. I cannot understand where
358 it got the data that it actually did write. */
359
360/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
361 to debugger memory starting at MYADDR. Copy to inferior if
362 WRITE is nonzero.
363
364 Returns the length copied, which is either the LEN argument or zero.
365 This xfer function does not do partial moves, since child_ops
366 doesn't allow memory operations to cross below us in the target stack
367 anyway. */
368
369int
b6de2014 370child_xfer_memory (memaddr, myaddr, len, write, target)
bd5635a1
RP
371 CORE_ADDR memaddr;
372 char *myaddr;
373 int len;
374 int write;
ee0613d1 375 struct target_ops *target; /* ignored */
bd5635a1
RP
376{
377 register int i;
378 /* Round starting address down to longword boundary. */
5090e82c 379 register CORE_ADDR addr = memaddr & - sizeof (PTRACE_XFER_TYPE);
bd5635a1
RP
380 /* Round ending address up; get number of longwords that makes. */
381 register int count
5090e82c
SG
382 = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
383 / sizeof (PTRACE_XFER_TYPE);
bd5635a1 384 /* Allocate buffer of that many longwords. */
5090e82c
SG
385 register PTRACE_XFER_TYPE *buffer
386 = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
bd5635a1
RP
387
388 if (write)
389 {
390 /* Fill start and end extra bytes of buffer with existing memory data. */
391
5090e82c 392 if (addr != memaddr || len < (int) sizeof (PTRACE_XFER_TYPE)) {
bd5635a1 393 /* Need part of initial word -- fetch it. */
e676a15f
FF
394 buffer[0] = ptrace (PT_READ_I, inferior_pid, (PTRACE_ARG3_TYPE) addr,
395 0);
bd5635a1
RP
396 }
397
398 if (count > 1) /* FIXME, avoid if even boundary */
399 {
400 buffer[count - 1]
401 = ptrace (PT_READ_I, inferior_pid,
5090e82c
SG
402 ((PTRACE_ARG3_TYPE)
403 (addr + (count - 1) * sizeof (PTRACE_XFER_TYPE))),
e676a15f 404 0);
bd5635a1
RP
405 }
406
407 /* Copy data to be written over corresponding part of buffer */
408
5090e82c
SG
409 memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
410 myaddr,
411 len);
bd5635a1
RP
412
413 /* Write the entire buffer. */
414
5090e82c 415 for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
bd5635a1
RP
416 {
417 errno = 0;
e676a15f
FF
418 ptrace (PT_WRITE_D, inferior_pid, (PTRACE_ARG3_TYPE) addr,
419 buffer[i]);
bd5635a1
RP
420 if (errno)
421 {
422 /* Using the appropriate one (I or D) is necessary for
423 Gould NP1, at least. */
424 errno = 0;
e676a15f
FF
425 ptrace (PT_WRITE_I, inferior_pid, (PTRACE_ARG3_TYPE) addr,
426 buffer[i]);
bd5635a1
RP
427 }
428 if (errno)
429 return 0;
430 }
431 }
432 else
433 {
434 /* Read all the longwords */
5090e82c 435 for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE))
bd5635a1
RP
436 {
437 errno = 0;
e676a15f
FF
438 buffer[i] = ptrace (PT_READ_I, inferior_pid,
439 (PTRACE_ARG3_TYPE) addr, 0);
bd5635a1
RP
440 if (errno)
441 return 0;
442 QUIT;
443 }
444
445 /* Copy appropriate bytes out of the buffer. */
5090e82c
SG
446 memcpy (myaddr,
447 (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
448 len);
bd5635a1
RP
449 }
450 return len;
451}
918fea3e 452#endif /* !defined (CHILD_XFER_MEMORY). */
This page took 0.19918 seconds and 4 git commands to generate.