On 18.03.2020 22:49, Kamil Rytarowski wrote: > 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. > There is is one bug. I'm going to fix and submit a new version. > 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. > --- > gdb/ChangeLog | 8 ++++++++ > gdb/inf-ptrace.c | 32 +++++++++++++++++++++++--------- > gdb/inf-ptrace.h | 2 ++ > 3 files changed, 33 insertions(+), 9 deletions(-) > > diff --git a/gdb/ChangeLog b/gdb/ChangeLog > index 84964dc00ac..406414cee76 100644 > --- a/gdb/ChangeLog > +++ b/gdb/ChangeLog > @@ -1,3 +1,11 @@ > +2020-03-18 Kamil Rytarowski > + > + * 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. > + > 2020-03-17 Kamil Rytarowski > > * regformats/regdef.h: Put reg in gdb namespace. > diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c > index db17a76d946..304a749f3f3 100644 > --- a/gdb/inf-ptrace.c > +++ b/gdb/inf-ptrace.c > @@ -37,6 +37,18 @@ > > > > +static int > +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,12 @@ inf_ptrace_target::kill () > target_mourn_inferior (inferior_ptid); > } > > +#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. */ > > pid_t > get_ptrace_pid (ptid_t ptid) > @@ -328,6 +344,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 +353,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; > > 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 = inferior_ptid; > > if (catch_syscall_enabled () > 0) > request = PT_SYSCALL; > @@ -365,7 +379,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")); > } > @@ -528,7 +542,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 +566,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; > @@ -588,7 +602,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; > diff --git a/gdb/inf-ptrace.h b/gdb/inf-ptrace.h > index dd0733736f2..340d41d8beb 100644 > --- a/gdb/inf-ptrace.h > +++ b/gdb/inf-ptrace.h > @@ -78,9 +78,11 @@ struct inf_ptrace_target : public inf_child_target > void detach_success (inferior *inf); > }; > > +#ifndef __NetBSD__ > /* Return which PID to pass to ptrace in order to observe/control the > tracee identified by PTID. */ > > extern pid_t get_ptrace_pid (ptid_t); > +#endif > > #endif > -- > 2.25.0 >