Disable get_ptrace_pid for NetBSD

Unlike most other Operating Systems, NetBSD tracks both pid and lwp.
The process id on NetBSD is stored always in the pid field of ptid.

gdb/ChangeLog:

	* inf-ptrace.h: Disable get_ptrace_pid on NetBSD.
	* inf-ptrace.c: Likewise.
	* (gdb_ptrace): Add.
	* (inf_ptrace_target::resume): Update.
	* (inf_ptrace_target::xfer_partial): Likewise.
	* (inf_ptrace_peek_poke): Change argument `pid' to `ptid'.
	* (inf_ptrace_peek_poke): Update.
This commit is contained in:
Kamil Rytarowski
2020-03-17 17:57:14 +01:00
parent f3a08f7778
commit f09db38094
3 changed files with 44 additions and 19 deletions

View File

@ -3,6 +3,15 @@
* nat/aarch64-sve-linux-ptrace.c (aarch64_sve_set_vq): If vg is not
valid, fetch vg value from ptrace.
2020-03-19 Kamil Rytarowski <n54@gmx.com>
* inf-ptrace.h: Disable get_ptrace_pid on NetBSD.
* inf-ptrace.c: Likewise.
* (gdb_ptrace): Add.
* (inf_ptrace_target::resume): Update.
* (inf_ptrace_target::xfer_partial): Likewise.
* (inf_ptrace_peek_poke): Change argument `pid' to `ptid'.
* (inf_ptrace_peek_poke): Update.
2020-03-19 Kamil Rytarowski <n54@gmx.com>
* x86-bsd-nat.c (gdb_ptrace): New.

View File

@ -37,6 +37,18 @@
static PTRACE_TYPE_RET
gdb_ptrace (PTRACE_TYPE_ARG1 request, ptid_t ptid, PTRACE_TYPE_ARG3 addr,
PTRACE_TYPE_ARG4 data)
{
#ifdef __NetBSD__
return ptrace (request, ptid.pid (), addr, data);
#else
pid_t pid = get_ptrace_pid (ptid);
return ptrace (request, pid, addr, data);
#endif
}
/* A unique_ptr helper to unpush a target. */
struct target_unpusher
@ -313,8 +325,9 @@ inf_ptrace_target::kill ()
target_mourn_inferior (inferior_ptid);
}
/* Return which PID to pass to ptrace in order to observe/control the
tracee identified by PTID. */
#ifndef __NetBSD__
/* See inf-ptrace.h. */
pid_t
get_ptrace_pid (ptid_t ptid)
@ -328,6 +341,7 @@ get_ptrace_pid (ptid_t ptid)
pid = ptid.pid ();
return pid;
}
#endif
/* Resume execution of thread PTID, or all threads if PTID is -1. If
STEP is nonzero, single-step it. If SIGNAL is nonzero, give it
@ -336,15 +350,12 @@ get_ptrace_pid (ptid_t ptid)
void
inf_ptrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
{
pid_t pid;
int request;
PTRACE_TYPE_ARG1 request;
if (minus_one_ptid == ptid)
/* Resume all threads. Traditionally ptrace() only supports
single-threaded processes, so simply resume the inferior. */
pid = inferior_ptid.pid ();
else
pid = get_ptrace_pid (ptid);
ptid = ptid_t (inferior_ptid.pid ());
if (catch_syscall_enabled () > 0)
request = PT_SYSCALL;
@ -365,7 +376,7 @@ inf_ptrace_target::resume (ptid_t ptid, int step, enum gdb_signal signal)
where it was. If GDB wanted it to start some other way, we have
already written a new program counter value to the child. */
errno = 0;
ptrace (request, pid, (PTRACE_TYPE_ARG3)1, gdb_signal_to_host (signal));
gdb_ptrace (request, ptid, (PTRACE_TYPE_ARG3)1, gdb_signal_to_host (signal));
if (errno != 0)
perror_with_name (("ptrace"));
}
@ -460,7 +471,7 @@ inf_ptrace_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
be non-null. Return the number of transferred bytes. */
static ULONGEST
inf_ptrace_peek_poke (pid_t pid, gdb_byte *readbuf,
inf_ptrace_peek_poke (ptid_t ptid, gdb_byte *readbuf,
const gdb_byte *writebuf,
ULONGEST addr, ULONGEST len)
{
@ -491,8 +502,8 @@ inf_ptrace_peek_poke (pid_t pid, gdb_byte *readbuf,
if (readbuf != NULL || chunk < sizeof (PTRACE_TYPE_RET))
{
errno = 0;
buf.word = ptrace (PT_READ_I, pid,
(PTRACE_TYPE_ARG3)(uintptr_t) addr, 0);
buf.word = gdb_ptrace (PT_READ_I, ptid,
(PTRACE_TYPE_ARG3)(uintptr_t) addr, 0);
if (errno != 0)
break;
if (readbuf != NULL)
@ -502,15 +513,15 @@ inf_ptrace_peek_poke (pid_t pid, gdb_byte *readbuf,
{
memcpy (buf.byte + skip, writebuf + n, chunk);
errno = 0;
ptrace (PT_WRITE_D, pid, (PTRACE_TYPE_ARG3)(uintptr_t) addr,
gdb_ptrace (PT_WRITE_D, ptid, (PTRACE_TYPE_ARG3)(uintptr_t) addr,
buf.word);
if (errno != 0)
{
/* Using the appropriate one (I or D) is necessary for
Gould NP1, at least. */
errno = 0;
ptrace (PT_WRITE_I, pid, (PTRACE_TYPE_ARG3)(uintptr_t) addr,
buf.word);
gdb_ptrace (PT_WRITE_I, ptid, (PTRACE_TYPE_ARG3)(uintptr_t) addr,
buf.word);
if (errno != 0)
break;
}
@ -528,7 +539,7 @@ inf_ptrace_target::xfer_partial (enum target_object object,
const gdb_byte *writebuf,
ULONGEST offset, ULONGEST len, ULONGEST *xfered_len)
{
pid_t pid = get_ptrace_pid (inferior_ptid);
ptid_t ptid = inferior_ptid;
switch (object)
{
@ -552,7 +563,7 @@ inf_ptrace_target::xfer_partial (enum target_object object,
piod.piod_len = len;
errno = 0;
if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
if (gdb_ptrace (PT_IO, ptid, (caddr_t)&piod, 0) == 0)
{
/* Return the actual number of bytes read or written. */
*xfered_len = piod.piod_len;
@ -565,7 +576,7 @@ inf_ptrace_target::xfer_partial (enum target_object object,
return TARGET_XFER_EOF;
}
#endif
*xfered_len = inf_ptrace_peek_poke (pid, readbuf, writebuf,
*xfered_len = inf_ptrace_peek_poke (ptid, readbuf, writebuf,
offset, len);
return *xfered_len != 0 ? TARGET_XFER_OK : TARGET_XFER_EOF;
@ -588,7 +599,7 @@ inf_ptrace_target::xfer_partial (enum target_object object,
piod.piod_len = len;
errno = 0;
if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
if (gdb_ptrace (PT_IO, ptid, (caddr_t)&piod, 0) == 0)
{
/* Return the actual number of bytes read or written. */
*xfered_len = piod.piod_len;

View File

@ -78,9 +78,14 @@ protected:
void detach_success (inferior *inf);
};
#ifndef __NetBSD__
/* Return which PID to pass to ptrace in order to observe/control the
tracee identified by PTID. */
tracee identified by PTID.
Unlike most other Operating Systems, NetBSD tracks both pid and lwp
and avoids this function. */
extern pid_t get_ptrace_pid (ptid_t);
#endif
#endif