summaryrefslogtreecommitdiff
path: root/gdb/inf-ptrace.c
diff options
context:
space:
mode:
authorKamil Rytarowski <n54@gmx.com>2020-03-17 17:57:14 +0100
committerKamil Rytarowski <n54@gmx.com>2020-03-19 22:20:03 +0100
commitf09db380942d1393e6f60d1ecaa7d4b6edfaaecf (patch)
tree15e0087100237625a2314205923be04213c83f9f /gdb/inf-ptrace.c
parentf3a08f77787cfe1b9edb7b5ab82ce7a2d527c8cf (diff)
downloadbinutils-gdb-f09db380942d1393e6f60d1ecaa7d4b6edfaaecf.tar.gz
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.
Diffstat (limited to 'gdb/inf-ptrace.c')
-rw-r--r--gdb/inf-ptrace.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index db17a76d946..a6a77ef9d31 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -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;