Avoid get_ptrace_pid() usage on NetBSD in x86-bsd-nat.c
Add gdb_ptrace() that wraps the ptrace(2) API and correctly passes the pid,lwp pair to the calls on NetBSD; and the result of get_ptrace_pid() on other BSD Operating Systems. gdb/ChangeLog: * x86-bsd-nat.c (gdb_ptrace): New. * (x86bsd_dr_set): Add new argument `ptid'. * (x86bsd_dr_get, x86bsd_dr_set, x86bsd_dr_set_control, x86bsd_dr_set_addr): Update.
This commit is contained in:
parent
ef3df11042
commit
fcc7376e0a
|
@ -1,3 +1,10 @@
|
||||||
|
2020-03-19 Kamil Rytarowski <n54@gmx.com>
|
||||||
|
|
||||||
|
* x86-bsd-nat.c (gdb_ptrace): New.
|
||||||
|
* (x86bsd_dr_set): Add new argument `ptid'.
|
||||||
|
* (x86bsd_dr_get, x86bsd_dr_set, x86bsd_dr_set_control,
|
||||||
|
x86bsd_dr_set_addr): Update.
|
||||||
|
|
||||||
2020-03-19 Andrew Burgess <andrew.burgess@embecosm.com>
|
2020-03-19 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||||
|
|
||||||
* remote.c (remote_target::process_stop_reply): Handle events for
|
* remote.c (remote_target::process_stop_reply): Handle events for
|
||||||
|
|
|
@ -33,6 +33,19 @@
|
||||||
#include "inf-ptrace.h"
|
#include "inf-ptrace.h"
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PT_GETXSTATE_INFO
|
#ifdef PT_GETXSTATE_INFO
|
||||||
size_t x86bsd_xsave_len;
|
size_t x86bsd_xsave_len;
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,31 +69,19 @@ static unsigned long
|
||||||
x86bsd_dr_get (ptid_t ptid, int regnum)
|
x86bsd_dr_get (ptid_t ptid, int regnum)
|
||||||
{
|
{
|
||||||
struct dbreg dbregs;
|
struct dbreg dbregs;
|
||||||
#ifdef __NetBSD__
|
|
||||||
int lwp = inferior_ptid.lwp ();
|
|
||||||
#else
|
|
||||||
int lwp = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
|
if (gdb_ptrace (PT_GETDBREGS, ptid, (PTRACE_TYPE_ARG3) &dbregs) == -1)
|
||||||
(PTRACE_TYPE_ARG3) &dbregs, lwp) == -1)
|
|
||||||
perror_with_name (_("Couldn't read debug registers"));
|
perror_with_name (_("Couldn't read debug registers"));
|
||||||
|
|
||||||
return DBREG_DRX ((&dbregs), regnum);
|
return DBREG_DRX ((&dbregs), regnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
x86bsd_dr_set (int regnum, unsigned long value)
|
x86bsd_dr_set (ptid_t ptid, int regnum, unsigned long value)
|
||||||
{
|
{
|
||||||
struct dbreg dbregs;
|
struct dbreg dbregs;
|
||||||
#ifdef __NetBSD__
|
|
||||||
int lwp = inferior_ptid.lwp ();
|
|
||||||
#else
|
|
||||||
int lwp = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ptrace (PT_GETDBREGS, get_ptrace_pid (inferior_ptid),
|
if (gdb_ptrace (PT_GETDBREGS, ptid, (PTRACE_TYPE_ARG3) &dbregs) == -1)
|
||||||
(PTRACE_TYPE_ARG3) &dbregs, lwp) == -1)
|
|
||||||
perror_with_name (_("Couldn't get debug registers"));
|
perror_with_name (_("Couldn't get debug registers"));
|
||||||
|
|
||||||
/* For some mysterious reason, some of the reserved bits in the
|
/* For some mysterious reason, some of the reserved bits in the
|
||||||
|
@ -92,12 +93,8 @@ x86bsd_dr_set (int regnum, unsigned long value)
|
||||||
|
|
||||||
for (thread_info *thread : current_inferior ()->non_exited_threads ())
|
for (thread_info *thread : current_inferior ()->non_exited_threads ())
|
||||||
{
|
{
|
||||||
#ifdef __NetBSD__
|
if (gdb_ptrace (PT_SETDBREGS, thread->ptid,
|
||||||
lwp = thread->ptid.lwp ();
|
(PTRACE_TYPE_ARG3) &dbregs) == -1)
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ptrace (PT_SETDBREGS, get_ptrace_pid (thread->ptid),
|
|
||||||
(PTRACE_TYPE_ARG3) &dbregs, lwp) == -1)
|
|
||||||
perror_with_name (_("Couldn't write debug registers"));
|
perror_with_name (_("Couldn't write debug registers"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,7 +102,7 @@ x86bsd_dr_set (int regnum, unsigned long value)
|
||||||
static void
|
static void
|
||||||
x86bsd_dr_set_control (unsigned long control)
|
x86bsd_dr_set_control (unsigned long control)
|
||||||
{
|
{
|
||||||
x86bsd_dr_set (7, control);
|
x86bsd_dr_set (inferior_ptid, 7, control);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -113,7 +110,7 @@ x86bsd_dr_set_addr (int regnum, CORE_ADDR addr)
|
||||||
{
|
{
|
||||||
gdb_assert (regnum >= 0 && regnum <= 4);
|
gdb_assert (regnum >= 0 && regnum <= 4);
|
||||||
|
|
||||||
x86bsd_dr_set (regnum, addr);
|
x86bsd_dr_set (inferior_ptid, regnum, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CORE_ADDR
|
static CORE_ADDR
|
||||||
|
|
Loading…
Reference in New Issue