* infptrace.c (child_xfer_memory): Only use if CHILD_XFER_MEMORY
is not defined. * hppab-nat.c (call_ptrace): Delete redundant function. (kill_inferior, attach, detach, child_resume): Likewise. (child_xfer_memory): Likewise. * hppah-nat.c (call_ptrace): Delete redundant function. (kill_inferior, attach, detach, child_resume): Likewise. * config/pa/hppabsd.mh (NATDEPFILES): Add infptrace.o. * config/pa/hppahpux.mh (NATDEPFILES): Add infptrace.o. * config/pa/nm-hppab.h (FETCH_INFERIOR_REGISTERS): Define. * config/pa/nm-hppah.h (FETCH_INFERIOR_REGISTERS): Define. (CHILD_XFER_MEMORY): Define. (PT_*): Define so that generic infptrace.c code can be used.
This commit is contained in:
parent
1b880e74fb
commit
918fea3e3c
|
@ -1,3 +1,25 @@
|
||||||
|
Fri Jan 21 08:20:18 1994 Jeffrey A. Law (law@snake.cs.utah.edu)
|
||||||
|
|
||||||
|
* infptrace.c (child_xfer_memory): Only use if CHILD_XFER_MEMORY
|
||||||
|
is not defined.
|
||||||
|
|
||||||
|
* hppab-nat.c (call_ptrace): Delete redundant function.
|
||||||
|
(kill_inferior, attach, detach, child_resume): Likewise.
|
||||||
|
(child_xfer_memory): Likewise.
|
||||||
|
|
||||||
|
* hppah-nat.c (call_ptrace): Delete redundant function.
|
||||||
|
(kill_inferior, attach, detach, child_resume): Likewise.
|
||||||
|
|
||||||
|
* config/pa/hppabsd.mh (NATDEPFILES): Add infptrace.o.
|
||||||
|
|
||||||
|
* config/pa/hppahpux.mh (NATDEPFILES): Add infptrace.o.
|
||||||
|
|
||||||
|
* config/pa/nm-hppab.h (FETCH_INFERIOR_REGISTERS): Define.
|
||||||
|
|
||||||
|
* config/pa/nm-hppah.h (FETCH_INFERIOR_REGISTERS): define.
|
||||||
|
(CHILD_XFER_MEMORY): Define.
|
||||||
|
(PT_*): Define so that generic infptrace.c code can be used.
|
||||||
|
|
||||||
Fri Jan 21 09:23:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
|
Fri Jan 21 09:23:33 1994 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||||
|
|
||||||
* xcoffread.c (xcoff_symfile_read): Make second parameter a
|
* xcoffread.c (xcoff_symfile_read): Make second parameter a
|
||||||
|
|
184
gdb/hppab-nat.c
184
gdb/hppab-nat.c
|
@ -27,27 +27,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
|
|
||||||
#ifndef PT_ATTACH
|
|
||||||
#define PT_ATTACH PTRACE_ATTACH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef PT_DETACH
|
|
||||||
#define PT_DETACH PTRACE_DETACH
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This function simply calls ptrace with the given arguments.
|
|
||||||
It exists so that all calls to ptrace are isolated in this
|
|
||||||
machine-dependent file. */
|
|
||||||
|
|
||||||
int
|
|
||||||
call_ptrace (request, pid, addr, data)
|
|
||||||
int request, pid;
|
|
||||||
PTRACE_ARG3_TYPE addr;
|
|
||||||
int data;
|
|
||||||
{
|
|
||||||
return ptrace (request, pid, addr, data, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Use an extra level of indirection for ptrace calls.
|
/* Use an extra level of indirection for ptrace calls.
|
||||||
This lets us breakpoint usefully on call_ptrace. It also
|
This lets us breakpoint usefully on call_ptrace. It also
|
||||||
allows us to pass an extra argument to ptrace without
|
allows us to pass an extra argument to ptrace without
|
||||||
|
@ -55,49 +34,6 @@ call_ptrace (request, pid, addr, data)
|
||||||
|
|
||||||
#define ptrace call_ptrace
|
#define ptrace call_ptrace
|
||||||
|
|
||||||
void
|
|
||||||
kill_inferior ()
|
|
||||||
{
|
|
||||||
if (inferior_pid == 0)
|
|
||||||
return;
|
|
||||||
ptrace (PT_KILL, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0);
|
|
||||||
wait ((int *)0);
|
|
||||||
target_mourn_inferior ();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ATTACH_DETACH
|
|
||||||
|
|
||||||
/* Start debugging the process whose number is PID. */
|
|
||||||
int
|
|
||||||
attach (pid)
|
|
||||||
int pid;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0);
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
attach_flag = 1;
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stop debugging the process whose number is PID
|
|
||||||
and continue it with signal number SIGNAL.
|
|
||||||
SIGNAL = 0 means just continue it. */
|
|
||||||
|
|
||||||
void
|
|
||||||
detach (signal)
|
|
||||||
int signal;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_DETACH, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal);
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
attach_flag = 0;
|
|
||||||
}
|
|
||||||
#endif /* ATTACH_DETACH */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined (offsetof)
|
#if !defined (offsetof)
|
||||||
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
||||||
#endif
|
#endif
|
||||||
|
@ -204,123 +140,3 @@ store_inferior_registers (regno)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resume execution of process PID.
|
|
||||||
If STEP is nonzero, single-step it.
|
|
||||||
If SIGNAL is nonzero, give it that signal. */
|
|
||||||
|
|
||||||
void
|
|
||||||
child_resume (pid, step, signal)
|
|
||||||
int pid;
|
|
||||||
int step;
|
|
||||||
enum target_signal signal;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
if (pid == -1)
|
|
||||||
pid = inferior_pid;
|
|
||||||
|
|
||||||
/* An address of (PTRACE_ARG3_TYPE) 1 tells ptrace to continue from where
|
|
||||||
it was. (If GDB wanted it to start some other way, we have already
|
|
||||||
written a new PC value to the child.) */
|
|
||||||
|
|
||||||
if (step)
|
|
||||||
ptrace (PT_STEP, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
|
||||||
else
|
|
||||||
ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
|
||||||
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
|
|
||||||
in the NEW_SUN_PTRACE case.
|
|
||||||
It ought to be straightforward. But it appears that writing did
|
|
||||||
not write the data that I specified. I cannot understand where
|
|
||||||
it got the data that it actually did write. */
|
|
||||||
|
|
||||||
/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
|
|
||||||
to debugger memory starting at MYADDR. Copy to inferior if
|
|
||||||
WRITE is nonzero.
|
|
||||||
|
|
||||||
Returns the length copied, which is either the LEN argument or zero.
|
|
||||||
This xfer function does not do partial moves, since child_ops
|
|
||||||
doesn't allow memory operations to cross below us in the target stack
|
|
||||||
anyway. */
|
|
||||||
|
|
||||||
int
|
|
||||||
child_xfer_memory (memaddr, myaddr, len, write, target)
|
|
||||||
CORE_ADDR memaddr;
|
|
||||||
char *myaddr;
|
|
||||||
int len;
|
|
||||||
int write;
|
|
||||||
struct target_ops *target; /* ignored */
|
|
||||||
{
|
|
||||||
register int i;
|
|
||||||
/* Round starting address down to longword boundary. */
|
|
||||||
register CORE_ADDR addr = memaddr & - sizeof (int);
|
|
||||||
/* Round ending address up; get number of longwords that makes. */
|
|
||||||
register int count
|
|
||||||
= (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
|
|
||||||
/* Allocate buffer of that many longwords. */
|
|
||||||
register int *buffer = (int *) alloca (count * sizeof (int));
|
|
||||||
|
|
||||||
if (write)
|
|
||||||
{
|
|
||||||
/* Fill start and end extra bytes of buffer with existing memory data. */
|
|
||||||
|
|
||||||
if (addr != memaddr || len < (int)sizeof (int)) {
|
|
||||||
/* Need part of initial word -- fetch it. */
|
|
||||||
buffer[0] = ptrace (PT_READ_I, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count > 1) /* FIXME, avoid if even boundary */
|
|
||||||
{
|
|
||||||
buffer[count - 1]
|
|
||||||
= ptrace (PT_READ_I, inferior_pid,
|
|
||||||
(PTRACE_ARG3_TYPE) (addr + (count - 1) * sizeof (int)),
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy data to be written over corresponding part of buffer */
|
|
||||||
|
|
||||||
memcpy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
|
|
||||||
|
|
||||||
/* Write the entire buffer. */
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++, addr += sizeof (int))
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_WRITE_D, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
|
||||||
buffer[i]);
|
|
||||||
if (errno)
|
|
||||||
{
|
|
||||||
/* Using the appropriate one (I or D) is necessary for
|
|
||||||
Gould NP1, at least. */
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_WRITE_I, inferior_pid, (PTRACE_ARG3_TYPE) addr,
|
|
||||||
buffer[i]);
|
|
||||||
}
|
|
||||||
if (errno)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Read all the longwords */
|
|
||||||
for (i = 0; i < count; i++, addr += sizeof (int))
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
buffer[i] = ptrace (PT_READ_I, inferior_pid,
|
|
||||||
(PTRACE_ARG3_TYPE) addr, 0);
|
|
||||||
if (errno)
|
|
||||||
return 0;
|
|
||||||
QUIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy appropriate bytes out of the buffer. */
|
|
||||||
memcpy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
|
|
||||||
}
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -32,58 +32,6 @@ extern CORE_ADDR text_end;
|
||||||
|
|
||||||
static void fetch_register ();
|
static void fetch_register ();
|
||||||
|
|
||||||
/* This function simply calls ptrace with the given arguments.
|
|
||||||
It exists so that all calls to ptrace are isolated in this
|
|
||||||
machine-dependent file. */
|
|
||||||
int
|
|
||||||
call_ptrace (request, pid, addr, data)
|
|
||||||
int request, pid;
|
|
||||||
PTRACE_ARG3_TYPE addr;
|
|
||||||
int data;
|
|
||||||
{
|
|
||||||
return ptrace (request, pid, addr, data, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
kill_inferior ()
|
|
||||||
{
|
|
||||||
if (inferior_pid == 0)
|
|
||||||
return;
|
|
||||||
ptrace (PT_EXIT, inferior_pid, (PTRACE_ARG3_TYPE) 0, 0, 0);
|
|
||||||
wait ((int *)0);
|
|
||||||
target_mourn_inferior ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Start debugging the process whose number is PID. */
|
|
||||||
int
|
|
||||||
attach (pid)
|
|
||||||
int pid;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_ATTACH, pid, (PTRACE_ARG3_TYPE) 0, 0, 0);
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
attach_flag = 1;
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stop debugging the process whose number is PID
|
|
||||||
and continue it with signal number SIGNAL.
|
|
||||||
SIGNAL = 0 means just continue it. */
|
|
||||||
|
|
||||||
void
|
|
||||||
detach (signal)
|
|
||||||
int signal;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
ptrace (PT_DETACH, inferior_pid, (PTRACE_ARG3_TYPE) 1, signal, 0);
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
attach_flag = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fetch all registers, or just one, from the child process. */
|
|
||||||
|
|
||||||
void
|
void
|
||||||
fetch_inferior_registers (regno)
|
fetch_inferior_registers (regno)
|
||||||
int regno;
|
int regno;
|
||||||
|
@ -200,34 +148,6 @@ fetch_register (regno)
|
||||||
error_exit:;
|
error_exit:;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Resume execution of process PID.
|
|
||||||
If STEP is nonzero, single-step it.
|
|
||||||
If SIGNAL is nonzero, give it that signal. */
|
|
||||||
|
|
||||||
void
|
|
||||||
child_resume (pid, step, signal)
|
|
||||||
int pid;
|
|
||||||
int step;
|
|
||||||
enum target_signal signal;
|
|
||||||
{
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
if (pid == -1)
|
|
||||||
pid = inferior_pid;
|
|
||||||
|
|
||||||
/* An address of (PTRACE_ARG3_TYPE) 1 tells ptrace to continue from where
|
|
||||||
it was. (If GDB wanted it to start some other way, we have already
|
|
||||||
written a new PC value to the child.) */
|
|
||||||
|
|
||||||
if (step)
|
|
||||||
ptrace (PT_SINGLE, pid, (PTRACE_ARG3_TYPE) 1, signal, 0);
|
|
||||||
else
|
|
||||||
ptrace (PT_CONTIN, pid, (PTRACE_ARG3_TYPE) 1, signal, 0);
|
|
||||||
|
|
||||||
if (errno)
|
|
||||||
perror_with_name ("ptrace");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
|
/* Copy LEN bytes to or from inferior's memory starting at MEMADDR
|
||||||
to debugger memory starting at MYADDR. Copy to inferior if
|
to debugger memory starting at MYADDR. Copy to inferior if
|
||||||
WRITE is nonzero.
|
WRITE is nonzero.
|
||||||
|
|
|
@ -125,14 +125,19 @@ void
|
||||||
child_resume (pid, step, signal)
|
child_resume (pid, step, signal)
|
||||||
int pid;
|
int pid;
|
||||||
int step;
|
int step;
|
||||||
int signal;
|
enum target_signal signal;
|
||||||
{
|
{
|
||||||
errno = 0;
|
errno = 0;
|
||||||
|
|
||||||
if (pid == -1)
|
if (pid == -1)
|
||||||
#ifdef PIDGET /* XXX Lynx */
|
/* Resume all threads. */
|
||||||
|
#ifdef PIDGET
|
||||||
|
/* This is for Lynx, and should be cleaned up by having Lynx be
|
||||||
|
a separate debugging target, with its own target_resume function. */
|
||||||
pid = PIDGET (inferior_pid);
|
pid = PIDGET (inferior_pid);
|
||||||
#else
|
#else
|
||||||
|
/* I think this only gets used in the non-threaded case, where "resume
|
||||||
|
all threads" and "resume inferior_pid" are the same. */
|
||||||
pid = inferior_pid;
|
pid = inferior_pid;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -146,9 +151,11 @@ child_resume (pid, step, signal)
|
||||||
instructions), so we don't have to worry about that here. */
|
instructions), so we don't have to worry about that here. */
|
||||||
|
|
||||||
if (step)
|
if (step)
|
||||||
ptrace (PT_STEP, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
ptrace (PT_STEP, pid, (PTRACE_ARG3_TYPE) 1,
|
||||||
|
target_signal_to_host (signal));
|
||||||
else
|
else
|
||||||
ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1,
|
||||||
|
target_signal_to_host (signal));
|
||||||
|
|
||||||
if (errno)
|
if (errno)
|
||||||
perror_with_name ("ptrace");
|
perror_with_name ("ptrace");
|
||||||
|
@ -342,6 +349,8 @@ store_inferior_registers (regno)
|
||||||
}
|
}
|
||||||
#endif /* !defined (FETCH_INFERIOR_REGISTERS). */
|
#endif /* !defined (FETCH_INFERIOR_REGISTERS). */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined (CHILD_XFER_MEMORY)
|
||||||
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
|
/* NOTE! I tried using PTRACE_READDATA, etc., to read and write memory
|
||||||
in the NEW_SUN_PTRACE case.
|
in the NEW_SUN_PTRACE case.
|
||||||
It ought to be straightforward. But it appears that writing did
|
It ought to be straightforward. But it appears that writing did
|
||||||
|
@ -440,3 +449,4 @@ child_xfer_memory (memaddr, myaddr, len, write, target)
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
#endif /* !defined (CHILD_XFER_MEMORY). */
|
||||||
|
|
Loading…
Reference in New Issue