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

View File

@ -78,9 +78,14 @@ protected:
void detach_success (inferior *inf); void detach_success (inferior *inf);
}; };
#ifndef __NetBSD__
/* Return which PID to pass to ptrace in order to observe/control the /* 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); extern pid_t get_ptrace_pid (ptid_t);
#endif
#endif #endif