Add support for NetBSD threads in sparc-nat.c

NetBSD ptrace(2) accepts thread id (LWP) as the 4th argument for threads.

Define gdb_ptrace() a wrapper function for ptrace(2) that properly passes
the pid,lwp pair on NetBSD and the result of get_ptrace_pid() for others.

gdb/ChangeLog:

	* sparc-nat.c (gdb_ptrace): New.
	* sparc-nat.c (sparc_fetch_inferior_registers)
	(sparc_store_inferior_registers) Remove obsolete comment.
	* sparc-nat.c (sparc_fetch_inferior_registers)
	(sparc_store_inferior_registers) Switch from pid_t to ptid_t.
	* sparc-nat.c (sparc_fetch_inferior_registers)
	(sparc_store_inferior_registers) Use gdb_ptrace.
This commit is contained in:
Kamil Rytarowski 2020-03-14 17:41:11 +01:00
parent d3c3c54293
commit 2108a63a5a
2 changed files with 32 additions and 28 deletions

View File

@ -1,3 +1,13 @@
2020-03-17 Kamil Rytarowski <n54@gmx.com>
* sparc-nat.c (gdb_ptrace): New.
* sparc-nat.c (sparc_fetch_inferior_registers)
(sparc_store_inferior_registers) Remove obsolete comment.
* sparc-nat.c (sparc_fetch_inferior_registers)
(sparc_store_inferior_registers) Switch from pid_t to ptid_t.
* sparc-nat.c (sparc_fetch_inferior_registers)
(sparc_store_inferior_registers) Use gdb_ptrace.
2020-03-17 Kamil Rytarowski <n54@gmx.com>
* sh-nbsd-nat.c (fetch_registers): New variable lwp and pass

View File

@ -78,6 +78,19 @@ typedef struct fp_status fpregset_t;
#define PTRACE_SETFPREGS PT_SETFPREGS
#endif
static int
gdb_ptrace (PTRACE_TYPE_ARG1 request, ptid_t ptid, PTRACE_TYPE_ARG3 addr)
{
#ifdef __NetBSD__
/* Support for NetBSD threads: unlike other ptrace implementations in this
file, NetBSD requires that we pass both the pid and lwp. */
return ptrace (request, ptid.pid (), addr, ptid.lwp ());
#else
pid_t pid = get_ptrace_pid (ptid);
return ptrace (request, pid, addr, 0);
#endif
}
/* Register set description. */
const struct sparc_gregmap *sparc_gregmap;
const struct sparc_fpregmap *sparc_fpregmap;
@ -137,22 +150,7 @@ void
sparc_fetch_inferior_registers (struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = regcache->arch ();
pid_t pid;
/* NOTE: cagney/2002-12-03: This code assumes that the currently
selected light weight processes' registers can be written
directly into the selected thread's register cache. This works
fine when given an 1:1 LWP:thread model (such as found on
GNU/Linux) but will, likely, have problems when used on an N:1
(userland threads) or N:M (userland multiple LWP) model. In the
case of the latter two, the LWP's registers do not necessarily
belong to the selected thread (the LWP could be in the middle of
executing the thread switch code).
These functions should instead be parameterized with an explicit
object (struct regcache, struct thread_info?) into which the LWPs
registers can be written. */
pid = get_ptrace_pid (regcache->ptid ());
ptid_t ptid = regcache->ptid ();
if (regnum == SPARC_G0_REGNUM)
{
@ -166,7 +164,7 @@ sparc_fetch_inferior_registers (struct regcache *regcache, int regnum)
{
gregset_t regs;
if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
if (gdb_ptrace (PTRACE_GETREGS, ptid, (PTRACE_TYPE_ARG3) &regs) == -1)
perror_with_name (_("Couldn't get registers"));
sparc_supply_gregset (sparc_gregmap, regcache, -1, &regs);
@ -178,7 +176,7 @@ sparc_fetch_inferior_registers (struct regcache *regcache, int regnum)
{
fpregset_t fpregs;
if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
if (gdb_ptrace (PTRACE_GETFPREGS, ptid, (PTRACE_TYPE_ARG3) &fpregs) == -1)
perror_with_name (_("Couldn't get floating point status"));
sparc_supply_fpregset (sparc_fpregmap, regcache, -1, &fpregs);
@ -189,22 +187,18 @@ void
sparc_store_inferior_registers (struct regcache *regcache, int regnum)
{
struct gdbarch *gdbarch = regcache->arch ();
pid_t pid;
/* NOTE: cagney/2002-12-02: See comment in fetch_inferior_registers
about threaded assumptions. */
pid = get_ptrace_pid (regcache->ptid ());
ptid_t ptid = regcache->ptid ();
if (regnum == -1 || sparc_gregset_supplies_p (gdbarch, regnum))
{
gregset_t regs;
if (ptrace (PTRACE_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
if (gdb_ptrace (PTRACE_GETREGS, ptid, (PTRACE_TYPE_ARG3) &regs) == -1)
perror_with_name (_("Couldn't get registers"));
sparc_collect_gregset (sparc_gregmap, regcache, regnum, &regs);
if (ptrace (PTRACE_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
if (gdb_ptrace (PTRACE_SETREGS, ptid, (PTRACE_TYPE_ARG3) &regs) == -1)
perror_with_name (_("Couldn't write registers"));
/* Deal with the stack regs. */
@ -225,7 +219,7 @@ sparc_store_inferior_registers (struct regcache *regcache, int regnum)
{
fpregset_t fpregs, saved_fpregs;
if (ptrace (PTRACE_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
if (gdb_ptrace (PTRACE_GETFPREGS, ptid, (PTRACE_TYPE_ARG3) &fpregs) == -1)
perror_with_name (_("Couldn't get floating-point registers"));
memcpy (&saved_fpregs, &fpregs, sizeof (fpregs));
@ -237,8 +231,8 @@ sparc_store_inferior_registers (struct regcache *regcache, int regnum)
to write the registers if nothing changed. */
if (memcmp (&saved_fpregs, &fpregs, sizeof (fpregs)) != 0)
{
if (ptrace (PTRACE_SETFPREGS, pid,
(PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
if (gdb_ptrace (PTRACE_SETFPREGS, ptid,
(PTRACE_TYPE_ARG3) &fpregs) == -1)
perror_with_name (_("Couldn't write floating-point registers"));
}