* 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
4 changed files with 36 additions and 268 deletions
|
@ -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)
|
||||
|
||||
* 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 <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.
|
||||
This lets us breakpoint usefully on call_ptrace. It also
|
||||
allows us to pass an extra argument to ptrace without
|
||||
|
@ -55,49 +34,6 @@ call_ptrace (request, pid, addr, data)
|
|||
|
||||
#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)
|
||||
#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
||||
#endif
|
||||
|
@ -204,123 +140,3 @@ store_inferior_registers (regno)
|
|||
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 ();
|
||||
|
||||
/* 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
|
||||
fetch_inferior_registers (regno)
|
||||
int regno;
|
||||
|
@ -200,34 +148,6 @@ fetch_register (regno)
|
|||
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
|
||||
to debugger memory starting at MYADDR. Copy to inferior if
|
||||
WRITE is nonzero.
|
||||
|
|
|
@ -125,14 +125,19 @@ void
|
|||
child_resume (pid, step, signal)
|
||||
int pid;
|
||||
int step;
|
||||
int signal;
|
||||
enum target_signal signal;
|
||||
{
|
||||
errno = 0;
|
||||
|
||||
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);
|
||||
#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;
|
||||
#endif
|
||||
|
||||
|
@ -146,9 +151,11 @@ child_resume (pid, step, signal)
|
|||
instructions), so we don't have to worry about that here. */
|
||||
|
||||
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
|
||||
ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1, signal);
|
||||
ptrace (PT_CONTINUE, pid, (PTRACE_ARG3_TYPE) 1,
|
||||
target_signal_to_host (signal));
|
||||
|
||||
if (errno)
|
||||
perror_with_name ("ptrace");
|
||||
|
@ -342,6 +349,8 @@ store_inferior_registers (regno)
|
|||
}
|
||||
#endif /* !defined (FETCH_INFERIOR_REGISTERS). */
|
||||
|
||||
|
||||
#if !defined (CHILD_XFER_MEMORY)
|
||||
/* 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
|
||||
|
@ -440,3 +449,4 @@ child_xfer_memory (memaddr, myaddr, len, write, target)
|
|||
}
|
||||
return len;
|
||||
}
|
||||
#endif /* !defined (CHILD_XFER_MEMORY). */
|
||||
|
|
Loading…
Add table
Reference in a new issue